From 00abcee2f551ccb6f2b8d2c41572275c3765603d Mon Sep 17 00:00:00 2001 From: Alwin Esch Date: Thu, 8 Sep 2022 20:36:56 +0200 Subject: [PATCH] Update --- .gitignore | 2 + CMakeLists.txt | 8 +- addons/kodi.binary.devkit/addon.xml.in | 8 + .../addon.xml.in | 7 - .../addon.xml.in | 7 - .../kodi.binary.global.general/addon.xml.in | 7 - addons/kodi.binary.global.gui/addon.xml.in | 7 - addons/kodi.binary.global.main/addon.xml.in | 7 - .../kodi.binary.global.network/addon.xml.in | 7 - addons/kodi.binary.global.tools/addon.xml.in | 7 - .../addon.xml.in | 7 - .../addon.xml.in | 7 - addons/kodi.binary.instance.game/addon.xml.in | 8 - .../kodi.binary.instance.game/controller.xsd | 17 - .../addon.xml.in | 7 - .../addon.xml.in | 7 - .../addon.xml.in | 7 - addons/kodi.binary.instance.pvr/addon.xml.in | 7 - addons/kodi.binary.instance.pvr/icon.png | Bin 4761 -> 0 bytes .../addon.xml.in | 7 - addons/kodi.binary.instance.vfs/addon.xml.in | 7 - .../addon.xml.in | 7 - .../addon.xml.in | 7 - .../resources/strings.po | 263 +- addons/skin.estuary/media/DefaultAddonWeb.png | Bin 0 -> 8085 bytes addons/skin.estuary/media/web/back.png | Bin 0 -> 496 bytes .../media/web/buttonside-add-fo.png | Bin 0 -> 1518 bytes .../media/web/buttonside-add-fo.xcf | Bin 0 -> 7252 bytes .../media/web/buttonside-add-nofo.png | Bin 0 -> 1530 bytes .../media/web/buttonside-add-nofo.xcf | Bin 0 -> 6961 bytes .../skin.estuary/media/web/buttonside-add.png | Bin 0 -> 1530 bytes .../skin.estuary/media/web/buttonside-add.xcf | Bin 0 -> 6961 bytes .../skin.estuary/media/web/buttonside-fo.png | Bin 0 -> 1518 bytes .../media/web/buttonside-nofo.png | Bin 0 -> 1530 bytes .../media/web/buttonside-nofo.xcf | Bin 0 -> 5939 bytes .../media/web/control_selected.png | Bin 0 -> 16434 bytes addons/skin.estuary/media/web/download.png | Bin 0 -> 561 bytes addons/skin.estuary/media/web/favourites.png | Bin 0 -> 821 bytes addons/skin.estuary/media/web/forward.png | Bin 0 -> 459 bytes addons/skin.estuary/media/web/fullscreen.png | Bin 0 -> 504 bytes addons/skin.estuary/media/web/home.png | Bin 0 -> 844 bytes addons/skin.estuary/media/web/menu.png | Bin 0 -> 181 bytes .../media/web/note_background.png | Bin 0 -> 835 bytes addons/skin.estuary/media/web/search.png | Bin 0 -> 924 bytes addons/skin.estuary/media/web/update.png | Bin 0 -> 1377 bytes .../xml/Custom_1109_TopBarOverlay.xml | 2 +- .../xml/DialogAddonCrashReporter.xml | 0 .../xml/DialogExtendedProgressBar.xml | 2 +- addons/skin.estuary/xml/DialogSeekBar.xml | 2 +- addons/skin.estuary/xml/DialogVolumeBar.xml | 2 +- addons/skin.estuary/xml/Home.xml | 181 + addons/skin.estuary/xml/Includes.xml | 2 +- addons/skin.estuary/xml/MyWebBrowser.xml | 321 + addons/skin.estuary/xml/PlayerControls.xml | 2 +- .../skin.estuary/xml/SettingsSystemInfo.xml | 295 +- addons/skin.estuary/xml/View_54_InfoWall.xml | 45 + cmake/FindSWIG.cmake | 29 + .../bootstrap/repositories/binary-addons.txt | 2 +- cmake/installdata/common/addons.txt | 1 + cmake/modules/UseSWIG.cmake | 873 ++ .../modules/UseSWIG/ManageSupportFiles.cmake | 31 + cmake/modules/buildtools/FindSWIG.cmake | 125 +- cmake/scripts/common/AddonHelpers.cmake | 108 +- cmake/scripts/common/HandleDepends.cmake | 2 +- cmake/scripts/common/Macros.cmake | 48 +- cmake/scripts/linux/ArchSetup.cmake | 3 + cmake/treedata/common/addon_dev_kit.txt | 4 + cmake/treedata/common/addon_interface.txt | 14 + cmake/treedata/common/subdirs.txt | 8 +- kodiInstance | 0 system/addon-manifest.xml | 19 +- system/keymaps/Keymap.xml | 12 + system/keymaps/keyboard.xml | 14 + .../GL/1.2/gl_shader_frag_addon_backend.glsl | 15 + .../GL/1.2/gl_shader_vert_addon_backend.glsl | 15 + .../GL/1.5/gl_shader_frag_addon_backend.glsl | 12 + .../GL/1.5/gl_shader_vert_addon_backend.glsl | 12 + .../2.0/gles_shader_frag_addon_backend.glsl | 17 + .../2.0/gles_shader_vert_addon_backend.glsl | 17 + toKodi- | 0 xbmc/AppParamParser.cpp | 4 + xbmc/AppParams.h | 8 + xbmc/Application.cpp | 32 +- xbmc/DatabaseManager.cpp | 5 + xbmc/FileItem.cpp | 7 +- xbmc/FileItem.h | 1 + xbmc/GUIInfoManager.cpp | 123 +- xbmc/GUIUserMessages.h | 25 + xbmc/LangInfo.cpp | 2 + xbmc/ServiceBroker.cpp | 16 +- xbmc/ServiceBroker.h | 26 +- xbmc/ServiceManager.cpp | 57 +- xbmc/ServiceManager.h | 26 +- xbmc/URL.cpp | 19 +- xbmc/Util.cpp | 2 +- xbmc/addons/Addon.h | 4 +- xbmc/addons/AddonBuilder.cpp | 9 +- xbmc/addons/AddonDatabase.cpp | 7 +- xbmc/addons/AddonProvider.h | 2 +- xbmc/addons/AddonStatusHandler.h | 2 +- xbmc/addons/AudioDecoder.cpp | 71 +- xbmc/addons/AudioDecoder.h | 10 +- xbmc/addons/BinaryAddonCache.cpp | 131 - xbmc/addons/BinaryAddonCache.h | 39 - xbmc/addons/CMakeLists.txt | 2 - xbmc/addons/IAddon.h | 2 + xbmc/addons/ImageDecoder.cpp | 39 +- xbmc/addons/ImageDecoder.h | 5 +- xbmc/addons/ScreenSaver.cpp | 50 +- xbmc/addons/ScreenSaver.h | 12 +- xbmc/addons/Service.cpp | 71 +- xbmc/addons/Service.h | 17 +- xbmc/addons/Skin.cpp | 1 + xbmc/addons/VFSEntry.cpp | 221 +- xbmc/addons/VFSEntry.h | 45 +- xbmc/addons/Visualization.cpp | 186 +- xbmc/addons/Visualization.h | 41 +- xbmc/addons/addoninfo/AddonInfo.cpp | 5 +- xbmc/addons/addoninfo/AddonInfoBuilder.cpp | 64 +- xbmc/addons/addoninfo/AddonInfoBuilder.h | 1 + xbmc/addons/addoninfo/AddonType.cpp | 66 + xbmc/addons/addoninfo/AddonType.h | 24 +- xbmc/addons/binary-addons/AddonDll.cpp | 548 -- xbmc/addons/binary-addons/AddonDll.h | 159 - .../binary-addons/AddonInstanceHandler.cpp | 380 - .../binary-addons/AddonInstanceHandler.h | 124 - xbmc/addons/binary-addons/BinaryAddonBase.cpp | 105 - xbmc/addons/binary-addons/BinaryAddonBase.h | 53 - .../binary-addons/BinaryAddonManager.cpp | 86 - .../addons/binary-addons/BinaryAddonManager.h | 89 - xbmc/addons/binary-addons/CMakeLists.txt | 12 - xbmc/addons/binary-addons/DllAddon.h | 37 - xbmc/addons/interface/CMakeLists.txt | 26 + xbmc/addons/interface/Controller.cpp | 308 + xbmc/addons/interface/Controller.h | 87 + xbmc/addons/interface/IMsgHdl.cpp | 25 + xbmc/addons/interface/IMsgHdl.h | 42 + .../interface/IOffscreenRenderProcess.cpp | 42 + .../interface/IOffscreenRenderProcess.h | 48 + xbmc/addons/interface/InstanceHandler.cpp | 323 + xbmc/addons/interface/InstanceHandler.h | 109 + xbmc/addons/interface/Interface.cpp | 274 + xbmc/addons/interface/Interface.h | 156 + xbmc/addons/interface/RunningProcess.cpp | 550 ++ xbmc/addons/interface/RunningProcess.h | 114 + xbmc/addons/interface/RunningThread.cpp | 105 + xbmc/addons/interface/RunningThread.h | 61 + xbmc/addons/interface/api/CMakeLists.txt | 24 + .../api/addon-instance/CMakeLists.txt | 36 + .../api/addon-instance/audiodecoder.cpp | 256 + .../api/addon-instance/audiodecoder.h | 99 + .../api/addon-instance/audioencoder.cpp | 213 + .../api/addon-instance/audioencoder.h | 87 + .../interface/api/addon-instance/game.cpp | 518 ++ .../interface/api/addon-instance/game.h | 233 + .../api/addon-instance/imagedecoder.cpp | 201 + .../api/addon-instance/imagedecoder.h | 91 + .../api/addon-instance/inputstream.cpp | 404 + .../api/addon-instance/inputstream.h | 185 + .../api/addon-instance/peripheral.cpp | 344 + .../interface/api/addon-instance/peripheral.h | 173 + .../interface/api/addon-instance/pvr.cpp | 2230 +++++ .../addons/interface/api/addon-instance/pvr.h | 371 + .../api/addon-instance/screensaver.cpp | 202 + .../api/addon-instance/screensaver.h | 82 + .../interface/api/addon-instance/vfs.cpp | 888 ++ .../addons/interface/api/addon-instance/vfs.h | 183 + .../api/addon-instance/videocodec.cpp | 174 + .../interface/api/addon-instance/videocodec.h | 98 + .../api/addon-instance/visualization.cpp | 623 ++ .../api/addon-instance/visualization.h | 137 + .../interface/api/addon-instance/web.cpp | 1147 +++ .../addons/interface/api/addon-instance/web.h | 229 + xbmc/addons/interface/api/addon_base.cpp | 1515 ++++ xbmc/addons/interface/api/addon_base.h | 235 + xbmc/addons/interface/api/audio_engine.cpp | 1186 +++ xbmc/addons/interface/api/audio_engine.h | 165 + xbmc/addons/interface/api/filesystem.cpp | 1998 +++++ xbmc/addons/interface/api/filesystem.h | 268 + xbmc/addons/interface/api/general.cpp | 820 ++ xbmc/addons/interface/api/general.h | 128 + xbmc/addons/interface/api/gui/CMakeLists.txt | 18 + .../interface/api/gui/controls/CMakeLists.txt | 36 + .../interface/api/gui/controls/button.cpp | 240 + .../interface/api/gui/controls/button.h | 89 + .../interface/api/gui/controls/edit.cpp | 358 + xbmc/addons/interface/api/gui/controls/edit.h | 102 + .../interface/api/gui/controls/fade_label.cpp | 221 + .../interface/api/gui/controls/fade_label.h | 85 + .../interface/api/gui/controls/image.cpp | 156 + .../addons/interface/api/gui/controls/image.h | 81 + .../interface/api/gui/controls/label.cpp | 162 + .../addons/interface/api/gui/controls/label.h | 78 + .../interface/api/gui/controls/progress.cpp | 158 + .../interface/api/gui/controls/progress.h | 78 + .../api/gui/controls/radio_button.cpp | 242 + .../interface/api/gui/controls/radio_button.h | 89 + .../interface/api/gui/controls/rendering.cpp | 106 + .../interface/api/gui/controls/rendering.h | 70 + .../api/gui/controls/settings_slider.cpp | 491 ++ .../api/gui/controls/settings_slider.h | 118 + .../interface/api/gui/controls/slider.cpp | 467 ++ .../interface/api/gui/controls/slider.h | 120 + .../interface/api/gui/controls/spin.cpp | 509 ++ xbmc/addons/interface/api/gui/controls/spin.h | 131 + .../interface/api/gui/controls/text_box.cpp | 303 + .../interface/api/gui/controls/text_box.h | 91 + .../interface/api/gui/dialogs/CMakeLists.txt | 32 + .../api/gui/dialogs/context_menu.cpp | 126 + .../interface/api/gui/dialogs/context_menu.h | 72 + .../api/gui/dialogs/extended_progress.cpp | 407 + .../api/gui/dialogs/extended_progress.h | 103 + .../interface/api/gui/dialogs/filebrowser.cpp | 545 ++ .../interface/api/gui/dialogs/filebrowser.h | 128 + .../interface/api/gui/dialogs/keyboard.cpp | 481 ++ .../interface/api/gui/dialogs/keyboard.h | 128 + .../interface/api/gui/dialogs/numeric.cpp | 389 + .../interface/api/gui/dialogs/numeric.h | 107 + xbmc/addons/interface/api/gui/dialogs/ok.cpp | 142 + xbmc/addons/interface/api/gui/dialogs/ok.h | 77 + .../interface/api/gui/dialogs/progress.cpp | 439 + .../interface/api/gui/dialogs/progress.h | 114 + .../interface/api/gui/dialogs/select.cpp | 232 + .../addons/interface/api/gui/dialogs/select.h | 83 + .../interface/api/gui/dialogs/text_viewer.cpp | 120 + .../interface/api/gui/dialogs/text_viewer.h | 71 + .../interface/api/gui/dialogs/yes_no.cpp | 251 + .../addons/interface/api/gui/dialogs/yes_no.h | 94 + xbmc/addons/interface/api/gui/general.cpp | 283 + xbmc/addons/interface/api/gui/general.h | 86 + xbmc/addons/interface/api/gui/list_item.cpp | 624 ++ xbmc/addons/interface/api/gui/list_item.h | 121 + xbmc/addons/interface/api/gui/window.cpp | 2324 ++++++ xbmc/addons/interface/api/gui/window.h | 327 + xbmc/addons/interface/api/monitor.cpp | 76 + xbmc/addons/interface/api/monitor.h | 67 + xbmc/addons/interface/api/network.cpp | 324 + xbmc/addons/interface/api/network.h | 87 + xbmc/addons/interface/gui/CMakeLists.txt | 14 + .../interface/gui/GUIDialogCrashReporter.cpp | 206 + .../interface/gui/GUIDialogCrashReporter.h | 66 + xbmc/addons/interface/launcher/CMakeLists.txt | 25 + xbmc/addons/interface/launcher/ILauncher.h | 70 + .../interface/launcher/LauncherDirectDll.cpp | 229 + .../interface/launcher/LauncherDirectDll.h | 73 + .../interface/launcher/LauncherPosix.cpp | 310 + .../addons/interface/launcher/LauncherPosix.h | 67 + .../interface/processinfo/CMakeLists.txt | 27 + .../interface/processinfo/ProcessInfo.h | 51 + .../processinfo/ProcessInfoAndroid.cpp | 23 + .../processinfo/ProcessInfoAndroid.h | 25 + .../processinfo/ProcessInfoDarwinEmbedded.cpp | 23 + .../processinfo/ProcessInfoDarwinEmbedded.h | 25 + .../processinfo/ProcessInfoFreeBSD.cpp | 23 + .../processinfo/ProcessInfoFreeBSD.h | 25 + .../processinfo/ProcessInfoLinux.cpp | 184 + .../interface/processinfo/ProcessInfoLinux.h | 41 + .../interface/processinfo/ProcessInfoOSX.cpp | 23 + .../interface/processinfo/ProcessInfoOSX.h | 25 + .../processinfo/ProcessInfoWindows.cpp | 23 + .../processinfo/ProcessInfoWindows.h | 25 + .../processinfo/ProcessInfoWindowsStore.cpp | 23 + .../processinfo/ProcessInfoWindowsStore.h | 25 + xbmc/addons/interface/renderer/CMakeLists.txt | 15 + .../interface/renderer/GLViewRenderer.cpp | 225 + .../interface/renderer/GLViewRenderer.h | 65 + .../addons/interface/renderer/IRenderHelper.h | 44 + xbmc/addons/interface/tools/CMakeLists.txt | 14 + .../gui => interface/tools}/GUITranslator.cpp | 2 +- .../gui => interface/tools}/GUITranslator.h | 10 +- xbmc/addons/interfaces/AddonBase.cpp | 657 -- xbmc/addons/interfaces/AddonBase.h | 87 - xbmc/addons/interfaces/AudioEngine.cpp | 761 -- xbmc/addons/interfaces/AudioEngine.h | 212 - xbmc/addons/interfaces/CMakeLists.txt | 18 - xbmc/addons/interfaces/Filesystem.cpp | 1179 --- xbmc/addons/interfaces/Filesystem.h | 131 - xbmc/addons/interfaces/General.cpp | 464 -- xbmc/addons/interfaces/General.h | 76 - xbmc/addons/interfaces/Network.cpp | 181 - xbmc/addons/interfaces/Network.h | 54 - xbmc/addons/interfaces/gui/CMakeLists.txt | 11 - xbmc/addons/interfaces/gui/General.cpp | 217 - xbmc/addons/interfaces/gui/General.h | 61 - xbmc/addons/interfaces/gui/ListItem.cpp | 428 - xbmc/addons/interfaces/gui/ListItem.h | 76 - xbmc/addons/interfaces/gui/Window.cpp | 1496 ---- xbmc/addons/interfaces/gui/Window.h | 278 - .../addons/interfaces/gui/controls/Button.cpp | 146 - xbmc/addons/interfaces/gui/controls/Button.h | 56 - .../interfaces/gui/controls/CMakeLists.txt | 27 - xbmc/addons/interfaces/gui/controls/Edit.cpp | 239 - xbmc/addons/interfaces/gui/controls/Edit.h | 67 - .../interfaces/gui/controls/FadeLabel.cpp | 130 - .../interfaces/gui/controls/FadeLabel.h | 57 - xbmc/addons/interfaces/gui/controls/Image.cpp | 92 - xbmc/addons/interfaces/gui/controls/Image.h | 57 - xbmc/addons/interfaces/gui/controls/Label.cpp | 92 - xbmc/addons/interfaces/gui/controls/Label.h | 53 - .../interfaces/gui/controls/Progress.cpp | 88 - .../addons/interfaces/gui/controls/Progress.h | 53 - .../interfaces/gui/controls/RadioButton.cpp | 146 - .../interfaces/gui/controls/RadioButton.h | 57 - .../interfaces/gui/controls/Rendering.cpp | 148 - .../interfaces/gui/controls/Rendering.h | 89 - .../gui/controls/SettingsSlider.cpp | 311 - .../interfaces/gui/controls/SettingsSlider.h | 77 - .../addons/interfaces/gui/controls/Slider.cpp | 305 - xbmc/addons/interfaces/gui/controls/Slider.h | 78 - xbmc/addons/interfaces/gui/controls/Spin.cpp | 346 - xbmc/addons/interfaces/gui/controls/Spin.h | 86 - .../interfaces/gui/controls/TextBox.cpp | 147 - xbmc/addons/interfaces/gui/controls/TextBox.h | 57 - .../interfaces/gui/dialogs/CMakeLists.txt | 23 - .../interfaces/gui/dialogs/ContextMenu.cpp | 67 - .../interfaces/gui/dialogs/ContextMenu.h | 53 - .../gui/dialogs/ExtendedProgressBar.cpp | 305 - .../gui/dialogs/ExtendedProgressBar.h | 63 - .../interfaces/gui/dialogs/FileBrowser.cpp | 403 - .../interfaces/gui/dialogs/FileBrowser.h | 116 - .../interfaces/gui/dialogs/Keyboard.cpp | 319 - xbmc/addons/interfaces/gui/dialogs/Keyboard.h | 94 - .../addons/interfaces/gui/dialogs/Numeric.cpp | 270 - xbmc/addons/interfaces/gui/dialogs/Numeric.h | 74 - xbmc/addons/interfaces/gui/dialogs/OK.cpp | 73 - xbmc/addons/interfaces/gui/dialogs/OK.h | 57 - .../interfaces/gui/dialogs/Progress.cpp | 328 - xbmc/addons/interfaces/gui/dialogs/Progress.h | 65 - xbmc/addons/interfaces/gui/dialogs/Select.cpp | 143 - xbmc/addons/interfaces/gui/dialogs/Select.h | 62 - .../interfaces/gui/dialogs/TextViewer.cpp | 64 - .../interfaces/gui/dialogs/TextViewer.h | 50 - xbmc/addons/interfaces/gui/dialogs/YesNo.cpp | 136 - xbmc/addons/interfaces/gui/dialogs/YesNo.h | 72 - .../interfaces/platform/android/System.cpp | 56 - .../interfaces/platform/android/System.h | 26 - xbmc/addons/kodi-dev-kit/.gitignore | 1 + xbmc/addons/kodi-dev-kit/CMakeLists.txt | 4 + xbmc/addons/kodi-dev-kit/cmake/Macros.cmake | 25 + .../kodi-dev-kit/include/kodi/AddonBase.h | 629 +- .../kodi-dev-kit/include/kodi/AudioEngine.h | 382 +- .../kodi-dev-kit/include/kodi/CMakeLists.txt | 2 +- .../kodi-dev-kit/include/kodi/Filesystem.h | 500 +- .../kodi-dev-kit/include/kodi/General.h | 156 +- .../kodi-dev-kit/include/kodi/Monitor.h | 34 + .../kodi-dev-kit/include/kodi/Network.h | 47 +- .../kodi/addon-instance/AudioDecoder.h | 20 +- .../kodi/addon-instance/AudioEncoder.h | 25 +- .../kodi/addon-instance/CMakeLists.txt | 1 + .../include/kodi/addon-instance/Game.h | 32 +- .../kodi/addon-instance/ImageDecoder.h | 28 +- .../include/kodi/addon-instance/Inputstream.h | 5 - .../include/kodi/addon-instance/PVR.h | 15 +- .../include/kodi/addon-instance/Peripheral.h | 261 +- .../include/kodi/addon-instance/Screensaver.h | 25 +- .../include/kodi/addon-instance/VFS.h | 326 +- .../include/kodi/addon-instance/VideoCodec.h | 5 - .../kodi/addon-instance/Visualization.h | 227 +- .../include/kodi/addon-instance/Web.h | 474 ++ .../addon-instance/inputstream/CMakeLists.txt | 4 - .../addon-instance/inputstream/DemuxPacket.h | 12 - .../addon-instance/inputstream/StreamCodec.h | 11 - .../inputstream/StreamConstants.h | 11 - .../inputstream/TimingConstants.h | 59 - .../peripheral/PeripheralUtils.h | 4 +- .../kodi/addon-instance/pvr/CMakeLists.txt | 4 - .../include/kodi/addon-instance/pvr/EDL.h | 90 - .../include/kodi/addon-instance/pvr/General.h | 536 -- .../kodi/addon-instance/pvr/MenuHook.h | 130 - .../include/kodi/addon-instance/pvr/Stream.h | 330 - .../include/kodi/c-api/CMakeLists.txt | 2 + .../kodi/c-api/addon-instance/CMakeLists.txt | 3 +- .../kodi/c-api/addon-instance/audiodecoder.h | 27 +- .../kodi/c-api/addon-instance/audioencoder.h | 38 +- .../include/kodi/c-api/addon-instance/game.h | 972 +-- .../kodi/c-api/addon-instance/imagedecoder.h | 41 +- .../kodi/c-api/addon-instance/inputstream.h | 219 +- .../kodi/c-api/addon-instance/peripheral.h | 290 +- .../include/kodi/c-api/addon-instance/pvr.h | 573 +- .../kodi/c-api/addon-instance/screensaver.h | 33 +- .../include/kodi/c-api/addon-instance/vfs.h | 221 +- .../{video_codec.h => videocodec.h} | 100 +- .../kodi/c-api/addon-instance/visualization.h | 169 +- .../include/kodi/c-api/addon-instance/web.h | 341 + .../include/kodi/c-api/addon_base.h | 393 +- .../include/kodi/c-api/audio_engine.h | 337 +- .../include/kodi/c-api/dl/CMakeLists.txt | 10 + .../include/kodi/c-api/dl/kodi_api_1.h | 1466 ++++ .../include/kodi/c-api/filesystem.h | 259 +- .../kodi-dev-kit/include/kodi/c-api/general.h | 87 +- .../include/kodi/c-api/gui/controls/button.h | 27 +- .../include/kodi/c-api/gui/controls/edit.h | 43 +- .../kodi/c-api/gui/controls/fade_label.h | 25 +- .../include/kodi/c-api/gui/controls/image.h | 23 +- .../include/kodi/c-api/gui/controls/label.h | 16 +- .../kodi/c-api/gui/controls/progress.h | 17 +- .../kodi/c-api/gui/controls/radio_button.h | 29 +- .../kodi/c-api/gui/controls/rendering.h | 26 +- .../kodi/c-api/gui/controls/settings_slider.h | 57 +- .../include/kodi/c-api/gui/controls/slider.h | 60 +- .../include/kodi/c-api/gui/controls/spin.h | 75 +- .../kodi/c-api/gui/controls/text_box.h | 28 +- .../kodi/c-api/gui/dialogs/context_menu.h | 12 +- .../c-api/gui/dialogs/extended_progress.h | 49 +- .../kodi/c-api/gui/dialogs/filebrowser.h | 104 +- .../include/kodi/c-api/gui/dialogs/keyboard.h | 91 +- .../include/kodi/c-api/gui/dialogs/numeric.h | 60 +- .../include/kodi/c-api/gui/dialogs/ok.h | 21 +- .../include/kodi/c-api/gui/dialogs/progress.h | 54 +- .../include/kodi/c-api/gui/dialogs/select.h | 30 +- .../kodi/c-api/gui/dialogs/text_viewer.h | 8 +- .../include/kodi/c-api/gui/dialogs/yes_no.h | 47 +- .../include/kodi/c-api/gui/general.h | 21 +- .../kodi/c-api/gui/input/CMakeLists.txt | 1 + .../include/kodi/c-api/gui/input/action.h | 30 + .../include/kodi/c-api/gui/list_item.h | 65 +- .../include/kodi/c-api/gui/window.h | 294 +- .../kodi-dev-kit/include/kodi/c-api/monitor.h | 29 + .../kodi-dev-kit/include/kodi/c-api/network.h | 43 +- .../kodi-dev-kit/include/kodi/c-api/version.h | 64 + .../kodi-dev-kit/include/kodi/gui/General.h | 28 +- .../kodi-dev-kit/include/kodi/gui/ListItem.h | 2 +- .../include/kodi/gui/dialogs/ContextMenu.h | 20 +- .../kodi/gui/dialogs/ExtendedProgress.h | 54 +- .../include/kodi/gui/dialogs/FileBrowser.h | 83 +- .../include/kodi/gui/dialogs/Keyboard.h | 84 +- .../include/kodi/gui/dialogs/Numeric.h | 54 +- .../include/kodi/gui/dialogs/OK.h | 10 +- .../include/kodi/gui/dialogs/Progress.h | 58 +- .../include/kodi/gui/dialogs/Select.h | 21 +- .../include/kodi/gui/dialogs/TextViewer.h | 4 +- .../include/kodi/gui/dialogs/YesNo.h | 21 +- .../kodi-dev-kit/include/kodi/gui/gl/GLonDX.h | 5 +- .../kodi-dev-kit/include/kodi/gui/gl/Shader.h | 8 +- .../include/kodi/gui/input/Action.h | 343 + .../include/kodi/gui/input/CMakeLists.txt | 1 + .../include/kodi/gui/renderHelper.h | 6 +- .../include/kodi/tools/DllHelper.h | 6 +- .../kodi-dev-kit/include/kodi/versions.h | 517 -- xbmc/addons/kodi-dev-kit/src/CMakeLists.txt | 2 + .../kodi-dev-kit/src/addon/CMakeLists.txt | 98 + .../kodi-dev-kit/src/addon/FindEGL.cmake | 48 + .../kodi-dev-kit/src/addon/FindOpenGl.cmake | 40 + .../kodi-dev-kit/src/addon/api/CMakeLists.txt | 24 + .../addon/api/addon-instance/CMakeLists.txt | 36 + .../addon/api/addon-instance/audiodecoder.cpp | 296 + .../addon/api/addon-instance/audiodecoder.h | 98 + .../addon/api/addon-instance/audioencoder.cpp | 237 + .../addon/api/addon-instance/audioencoder.h | 74 + .../src/addon/api/addon-instance/game.cpp | 818 ++ .../src/addon/api/addon-instance/game.h | 216 + .../addon/api/addon-instance/imagedecoder.cpp | 229 + .../addon/api/addon-instance/imagedecoder.h | 89 + .../addon/api/addon-instance/inputstream.cpp | 675 ++ .../addon/api/addon-instance/inputstream.h | 186 + .../addon/api/addon-instance/peripheral.cpp | 506 ++ .../src/addon/api/addon-instance/peripheral.h | 171 + .../src/addon/api/addon-instance/pvr.cpp | 2659 ++++++ .../src/addon/api/addon-instance/pvr.h | 340 + .../addon/api/addon-instance/screensaver.cpp | 218 + .../addon/api/addon-instance/screensaver.h | 70 + .../src/addon/api/addon-instance/vfs.cpp | 1080 +++ .../src/addon/api/addon-instance/vfs.h | 184 + .../addon/api/addon-instance/videocodec.cpp | 234 + .../src/addon/api/addon-instance/videocodec.h | 93 + .../api/addon-instance/visualization.cpp | 734 ++ .../addon/api/addon-instance/visualization.h | 123 + .../src/addon/api/addon-instance/web.cpp | 1329 +++ .../src/addon/api/addon-instance/web.h | 192 + .../kodi-dev-kit/src/addon/api/addon_base.cpp | 1787 ++++ .../kodi-dev-kit/src/addon/api/addon_base.h | 133 + .../src/addon/api/audio_engine.cpp | 798 ++ .../kodi-dev-kit/src/addon/api/audio_engine.h | 52 + .../src/addon/api/dl/CMakeLists.txt | 13 + .../src/addon/api/dl/kodi_api_1.c | 580 ++ .../kodi-dev-kit/src/addon/api/filesystem.cpp | 1762 ++++ .../kodi-dev-kit/src/addon/api/filesystem.h | 52 + .../kodi-dev-kit/src/addon/api/general.cpp | 478 ++ .../kodi-dev-kit/src/addon/api/general.h | 52 + .../src/addon/api/gui/CMakeLists.txt | 18 + .../src/addon/api/gui/controls/CMakeLists.txt | 36 + .../src/addon/api/gui/controls/button.cpp | 217 + .../src/addon/api/gui/controls/button.h | 52 + .../src/addon/api/gui/controls/edit.cpp | 302 + .../src/addon/api/gui/controls/edit.h | 52 + .../src/addon/api/gui/controls/fade_label.cpp | 191 + .../src/addon/api/gui/controls/fade_label.h | 52 + .../src/addon/api/gui/controls/image.cpp | 134 + .../src/addon/api/gui/controls/image.h | 52 + .../src/addon/api/gui/controls/label.cpp | 133 + .../src/addon/api/gui/controls/label.h | 52 + .../src/addon/api/gui/controls/progress.cpp | 139 + .../src/addon/api/gui/controls/progress.h | 52 + .../addon/api/gui/controls/radio_button.cpp | 227 + .../src/addon/api/gui/controls/radio_button.h | 53 + .../src/addon/api/gui/controls/rendering.cpp | 77 + .../src/addon/api/gui/controls/rendering.h | 52 + .../api/gui/controls/settings_slider.cpp | 459 ++ .../addon/api/gui/controls/settings_slider.h | 53 + .../src/addon/api/gui/controls/slider.cpp | 449 + .../src/addon/api/gui/controls/slider.h | 52 + .../src/addon/api/gui/controls/spin.cpp | 490 ++ .../src/addon/api/gui/controls/spin.h | 52 + .../src/addon/api/gui/controls/text_box.cpp | 216 + .../src/addon/api/gui/controls/text_box.h | 52 + .../src/addon/api/gui/dialogs/CMakeLists.txt | 32 + .../addon/api/gui/dialogs/context_menu.cpp | 95 + .../src/addon/api/gui/dialogs/context_menu.h | 53 + .../api/gui/dialogs/extended_progress.cpp | 381 + .../addon/api/gui/dialogs/extended_progress.h | 53 + .../src/addon/api/gui/dialogs/filebrowser.cpp | 372 + .../src/addon/api/gui/dialogs/filebrowser.h | 52 + .../src/addon/api/gui/dialogs/keyboard.cpp | 414 + .../src/addon/api/gui/dialogs/keyboard.h | 52 + .../src/addon/api/gui/dialogs/numeric.cpp | 329 + .../src/addon/api/gui/dialogs/numeric.h | 52 + .../src/addon/api/gui/dialogs/ok.cpp | 109 + .../src/addon/api/gui/dialogs/ok.h | 52 + .../src/addon/api/gui/dialogs/progress.cpp | 412 + .../src/addon/api/gui/dialogs/progress.h | 52 + .../src/addon/api/gui/dialogs/select.cpp | 145 + .../src/addon/api/gui/dialogs/select.h | 52 + .../src/addon/api/gui/dialogs/text_viewer.cpp | 76 + .../src/addon/api/gui/dialogs/text_viewer.h | 52 + .../src/addon/api/gui/dialogs/yes_no.cpp | 171 + .../src/addon/api/gui/dialogs/yes_no.h | 52 + .../src/addon/api/gui/general.cpp | 233 + .../kodi-dev-kit/src/addon/api/gui/general.h | 52 + .../src/addon/api/gui/list_item.cpp | 432 + .../src/addon/api/gui/list_item.h | 52 + .../kodi-dev-kit/src/addon/api/gui/window.cpp | 1340 +++ .../kodi-dev-kit/src/addon/api/gui/window.h | 52 + .../kodi-dev-kit/src/addon/api/monitor.cpp | 80 + .../kodi-dev-kit/src/addon/api/monitor.h | 52 + .../kodi-dev-kit/src/addon/api/network.cpp | 270 + .../kodi-dev-kit/src/addon/api/network.h | 52 + .../src/addon/core/CMakeLists.txt | 24 + .../kodi-dev-kit/src/addon/core/IMsgHdl.h | 40 + .../src/addon/core/addon_control.cpp | 242 + .../src/addon/core/addon_control.h | 95 + .../addon/core/addon_offscreen_render_base.h | 27 + .../addon_offscreen_render_base_linux.cpp | 80 + .../core/addon_offscreen_render_base_linux.h | 45 + .../core/addon_offscreen_render_control.cpp | 30 + .../core/addon_offscreen_render_control.h | 64 + .../addon_offscreen_render_control_linux.cpp | 211 + .../addon_offscreen_render_control_linux.h | 72 + .../src/addon/core/addon_thread_control.cpp | 119 + .../src/addon/core/addon_thread_control.h | 72 + .../src/addon/third_party/CMakeLists.txt | 12 + .../backward-cpp/BackwardConfig.cmake | 266 + .../third_party/backward-cpp/CMakeLists.txt | 140 + .../third_party/backward-cpp/LICENSE.txt | 21 + .../addon/third_party/backward-cpp/README.md | 442 + .../third_party/backward-cpp/backward.cpp | 42 + .../third_party/backward-cpp/backward.hpp | 4471 ++++++++++ .../addon/third_party/backward-cpp/builds.sh | 77 + .../third_party/backward-cpp/conanfile.py | 45 + .../backward-cpp/doc/CMakeLists.txt | 12 + .../third_party/backward-cpp/doc/nice.png | Bin 0 -> 40904 bytes .../third_party/backward-cpp/doc/pretty.png | Bin 0 -> 105498 bytes .../third_party/backward-cpp/doc/rude.png | Bin 0 -> 6183 bytes .../backward-cpp/test/CMakeLists.txt | 19 + .../backward-cpp/test/_test_main.cpp | 241 + .../backward-cpp/test/rectrace.cpp | 98 + .../backward-cpp/test/select_signals.cpp | 51 + .../backward-cpp/test/stacktrace.cpp | 57 + .../third_party/backward-cpp/test/suicide.cpp | 89 + .../third_party/backward-cpp/test/test.cpp | 63 + .../third_party/backward-cpp/test/test.hpp | 183 + .../backward-cpp/test_package/CMakeLists.txt | 13 + .../backward-cpp/test_package/conanfile.py | 14 + .../backward-cpp/test_package/main.cpp | 46 + .../src/addon_language/CMakeLists.txt | 48 + .../src/addon_language/FindNodejs.cmake | 97 + .../src/addon_language/swig/global.i | 13 + .../addon_language/swig/java/CMakeLists.txt | 128 + .../src/addon_language/swig/java/kodi_addon.i | 115 + .../swig/java/kodi_gui_dialogs_TextViewer.i | 11 + .../swig/java/kodi_gui_dialogs_YesNo.i | 14 + .../addon_language/swig/java/manifest.txt.in | 7 + .../src/addon_language/swig/java/pom.xml.in | 38 + .../swig/javascript/CMakeLists.txt | 132 + .../swig/javascript/binding.gyp.cmake | 42 + .../swig/javascript/doxygen2jsdoc_custom.json | 0 .../swig/javascript/kodidevkitjs.i | 5 + .../swig/javascript/package.json.cmake | 19 + .../src/addon_language/swig/kodi_addon.i | 31 + .../addon_language/swig/lua/CMakeLists.txt | 20 + .../addon_language/swig/lua/kodidevkitlua.i | 5 + .../swig/python3/CMakeLists.txt | 30 + .../addon_language/swig/python3/kodidevkit3.i | 3 + .../swig/python4/CMakeLists.txt | 30 + .../addon_language/swig/python4/kodidevkit4.i | 3 + .../src/addon_language/swig/test.i | 34 + .../src/addon_runner/CMakeLists.txt | 36 + .../kodi-dev-kit/src/addon_runner/cxxopts.hpp | 2714 ++++++ .../kodi-dev-kit/src/addon_runner/main.cpp | 216 + .../addon_runner/third_party/CMakeLists.txt | 12 + .../backward-cpp/BackwardConfig.cmake | 266 + .../third_party/backward-cpp/CMakeLists.txt | 140 + .../third_party/backward-cpp/LICENSE.txt | 21 + .../third_party/backward-cpp/README.md | 442 + .../third_party/backward-cpp/backward.cpp | 42 + .../third_party/backward-cpp/backward.hpp | 4471 ++++++++++ .../third_party/backward-cpp/builds.sh | 77 + .../third_party/backward-cpp/conanfile.py | 45 + .../backward-cpp/doc/CMakeLists.txt | 12 + .../third_party/backward-cpp/doc/nice.png | Bin 0 -> 40904 bytes .../third_party/backward-cpp/doc/pretty.png | Bin 0 -> 105498 bytes .../third_party/backward-cpp/doc/rude.png | Bin 0 -> 6183 bytes .../backward-cpp/test/CMakeLists.txt | 19 + .../backward-cpp/test/_test_main.cpp | 241 + .../backward-cpp/test/rectrace.cpp | 98 + .../backward-cpp/test/select_signals.cpp | 51 + .../backward-cpp/test/stacktrace.cpp | 57 + .../third_party/backward-cpp/test/suicide.cpp | 89 + .../third_party/backward-cpp/test/test.cpp | 63 + .../third_party/backward-cpp/test/test.hpp | 183 + .../backward-cpp/test_package/CMakeLists.txt | 13 + .../backward-cpp/test_package/conanfile.py | 14 + .../backward-cpp/test_package/main.cpp | 46 + .../kodi-dev-kit/src/shared/CMakeLists.txt | 105 + .../kodi-dev-kit/src/shared/DirectData.h | 180 + .../kodi-dev-kit/src/shared/Instances.h | 74 + .../src/shared/OpenGLExtensionCheck.cpp | 144 + .../src/shared/OpenGLExtensionCheck.h | 29 + .../kodi-dev-kit/src/shared/ShareProcess.cpp | 28 + .../kodi-dev-kit/src/shared/ShareProcess.h | 29 + .../src/shared/ShareProcessReceiver.cpp | 233 + .../src/shared/ShareProcessReceiver.h | 63 + .../src/shared/ShareProcessTransmitter.cpp | 288 + .../src/shared/ShareProcessTransmitter.h | 56 + .../kodi-dev-kit/src/shared/SharedData.h | 86 + .../addons/kodi-dev-kit/src/shared/SharedGL.h | 70 + .../kodi-dev-kit/src/shared/SharedGroups.h | 172 + .../src/shared/SharedMemControl.cpp | 36 + .../src/shared/SharedMemControl.h | 59 + .../src/shared/SharedMemControlPosixMMAP.cpp | 194 + .../src/shared/SharedMemControlPosixMMAP.h | 50 + .../shared/api/addon-instance/audiodecoder.h | 373 + .../shared/api/addon-instance/audioencoder.h | 236 + .../src/shared/api/addon-instance/game.h | 281 + .../shared/api/addon-instance/imagedecoder.h | 353 + .../shared/api/addon-instance/inputstream.h | 246 + .../shared/api/addon-instance/peripheral.h | 219 + .../src/shared/api/addon-instance/pvr.h | 752 ++ .../addon-instance/pvr/pvr_channel_groups.h | 105 + .../api/addon-instance/pvr/pvr_channels.h | 212 + .../api/addon-instance/pvr/pvr_defines.h | 93 + .../shared/api/addon-instance/pvr/pvr_edl.h | 74 + .../shared/api/addon-instance/pvr/pvr_epg.h | 181 + .../api/addon-instance/pvr/pvr_general.h | 158 + .../api/addon-instance/pvr/pvr_menu_hook.h | 74 + .../api/addon-instance/pvr/pvr_providers.h | 83 + .../api/addon-instance/pvr/pvr_recordings.h | 188 + .../api/addon-instance/pvr/pvr_timers.h | 270 + .../shared/api/addon-instance/screensaver.h | 166 + .../src/shared/api/addon-instance/vfs.h | 427 + .../shared/api/addon-instance/videocodec.h | 134 + .../shared/api/addon-instance/visualization.h | 387 + .../src/shared/api/addon-instance/web.h | 526 ++ .../kodi-dev-kit/src/shared/api/addon_base.h | 466 ++ .../src/shared/api/audio_engine.h | 320 + .../kodi-dev-kit/src/shared/api/filesystem.h | 727 ++ .../kodi-dev-kit/src/shared/api/general.h | 233 + .../src/shared/api/gui/controls/button.h | 122 + .../src/shared/api/gui/controls/edit.h | 146 + .../src/shared/api/gui/controls/fade_label.h | 116 + .../src/shared/api/gui/controls/image.h | 101 + .../src/shared/api/gui/controls/label.h | 101 + .../src/shared/api/gui/controls/progress.h | 101 + .../shared/api/gui/controls/radio_button.h | 126 + .../src/shared/api/gui/controls/rendering.h | 87 + .../shared/api/gui/controls/settings_slider.h | 191 + .../src/shared/api/gui/controls/slider.h | 179 + .../src/shared/api/gui/controls/spin.h | 194 + .../src/shared/api/gui/controls/text_box.h | 123 + .../src/shared/api/gui/dialogs/context_menu.h | 89 + .../api/gui/dialogs/extended_progress.h | 169 + .../src/shared/api/gui/dialogs/filebrowser.h | 142 + .../src/shared/api/gui/dialogs/keyboard.h | 161 + .../src/shared/api/gui/dialogs/numeric.h | 146 + .../src/shared/api/gui/dialogs/ok.h | 96 + .../src/shared/api/gui/dialogs/progress.h | 174 + .../src/shared/api/gui/dialogs/select.h | 94 + .../src/shared/api/gui/dialogs/text_viewer.h | 88 + .../src/shared/api/gui/dialogs/yes_no.h | 105 + .../kodi-dev-kit/src/shared/api/gui/general.h | 128 + .../src/shared/api/gui/input/action.h | 90 + .../src/shared/api/gui/list_item.h | 187 + .../kodi-dev-kit/src/shared/api/gui/window.h | 403 + .../kodi-dev-kit/src/shared/api/monitor.h | 89 + .../kodi-dev-kit/src/shared/api/network.h | 128 + .../kodi-dev-kit/src/shared/api/processor.h | 75 + xbmc/addons/kodi-dev-kit/src/shared/socket.h | 86 + .../tools/code-generator/code_generator.py | 213 +- .../code-generator/ignored_api_structs.txt | 2 + .../tools/code-generator/src/commitChanges.py | 40 +- ...CMAKE_TREEDATA_COMMON_addon_dev_kit_txt.py | 9 +- ...AKE_TREEDATA_COMMON_addon_interface_txt.py | 54 + ...teCMake__XBMC_ADDONS_INTERFACE_allfiles.py | 152 + ...ADDONS_KODIDEVKIT_INCLUDE_KODI_allfiles.py | 4 +- ...MC_ADDONS_KODIDEVKIT_SRC_ADDON_allfiles.py | 200 + ...NS_KODIDEVKIT_SRC_SHARED_cmakelists_txt.py | 182 + .../src/generateScan__CALLBACK_USE_PLACES.py | 200 + .../src/generateScan__USED_API.py | 167 + .../src/generateScan__USED_VALUES.py | 270 + ...erateSource__DEV_KIT_INSTANCE_CONSTRUCT.py | 253 + ...__XBMC_ADDONS_INTERFACE_interface_cpp_h.py | 149 + ...DEVKIT_SRC_ADDON_API_DL_kodi_api_NR_c_h.py | 348 + ...DEVKIT_SRC_ADDON_CORE_addon_control_cpp.py | 133 + ...DONS_KODIDEVKIT_SRC_SHARED_directdata_h.py | 130 + ...DDONS_KODIDEVKIT_SRC_SHARED_instances_h.py | 109 + ...NS_KODIDEVKIT_SRC_SHARED_sharedgroups_h.py | 95 + .../src/interface_code_generator.py | 7302 +++++++++++++++++ .../src/{ => tools}/helper_Log.py | 0 .../tools/code-generator/src/tools/helpers.py | 322 + .../code-generator/src/tools/sub_file_hdl.py | 45 + xbmc/addons/settings/AddonSettings.cpp | 1 - xbmc/application/ApplicationPowerHandling.cpp | 6 +- .../application/ApplicationVolumeHandling.cpp | 4 + xbmc/cdrip/EncoderAddon.cpp | 50 +- xbmc/cdrip/EncoderAddon.h | 17 +- xbmc/cores/AudioEngine/Interfaces/AE.h | 14 +- xbmc/cores/RetroPlayer/RetroPlayer.cpp | 4 +- .../DVDCodecs/Video/AddonVideoCodec.cpp | 153 +- .../DVDCodecs/Video/AddonVideoCodec.h | 23 +- .../DVDInputStreams/CMakeLists.txt | 10 +- .../DVDInputStreams/DVDFactoryInputStream.cpp | 6 - .../DVDInputStreams/InputStreamAddon.cpp | 192 +- .../DVDInputStreams/InputStreamAddon.h | 57 +- .../DVDInputStreams/InputStreamPVRBase.cpp | 357 - .../DVDInputStreams/InputStreamPVRBase.h | 83 - .../DVDInputStreams/InputStreamPVRChannel.cpp | 125 - .../DVDInputStreams/InputStreamPVRChannel.h | 33 - .../InputStreamPVRRecording.cpp | 102 - .../DVDInputStreams/InputStreamPVRRecording.h | 28 - xbmc/cores/VideoPlayer/VideoPlayer.cpp | 8 - xbmc/favourites/FavouritesService.cpp | 4 + xbmc/filesystem/AddonsDirectory.cpp | 20 +- xbmc/filesystem/CMakeLists.txt | 2 + xbmc/filesystem/DirectoryFactory.cpp | 5 +- xbmc/filesystem/FileDirectoryFactory.cpp | 2 +- xbmc/filesystem/FileFactory.cpp | 2 +- xbmc/filesystem/WebDirectory.cpp | 67 + xbmc/filesystem/WebDirectory.h | 40 + xbmc/games/GameServices.cpp | 12 +- xbmc/games/GameServices.h | 14 + xbmc/games/GameTypes.h | 4 + xbmc/games/GameUtils.cpp | 90 +- xbmc/games/GameUtils.h | 8 +- xbmc/games/addons/CMakeLists.txt | 4 + xbmc/games/addons/GameClient.cpp | 139 +- xbmc/games/addons/GameClient.h | 93 +- xbmc/games/addons/GameClientController.cpp | 113 + xbmc/games/addons/GameClientController.h | 59 + xbmc/games/addons/GameClientInGameSaves.cpp | 19 +- xbmc/games/addons/GameClientInGameSaves.h | 9 +- xbmc/games/addons/GameClientInfo.cpp | 91 + xbmc/games/addons/GameClientInfo.h | 57 + xbmc/games/addons/GameClientProperties.cpp | 16 +- xbmc/games/addons/GameClientProperties.h | 12 +- xbmc/games/addons/GameClientSubsystem.cpp | 26 +- xbmc/games/addons/GameClientSubsystem.h | 17 +- xbmc/games/addons/GameClientTranslator.h | 2 +- .../addons/cheevos/GameClientCheevos.cpp | 41 +- xbmc/games/addons/cheevos/GameClientCheevos.h | 11 +- .../games/addons/input/GameClientController.h | 2 +- xbmc/games/addons/input/GameClientDevice.cpp | 2 +- xbmc/games/addons/input/GameClientInput.cpp | 41 +- xbmc/games/addons/input/GameClientInput.h | 3 +- .../games/addons/input/GameClientKeyboard.cpp | 2 +- xbmc/games/addons/input/GameClientMouse.cpp | 2 +- xbmc/games/addons/input/GameClientPort.cpp | 2 +- .../addons/streams/GameClientStreamAudio.h | 2 +- .../streams/GameClientStreamSwFramebuffer.cpp | 2 +- xbmc/games/addons/streams/GameClientStreams.h | 2 +- .../windows/GUIControllerWindow.cpp | 11 +- .../dialogs/GUIDialogSelectGameClient.cpp | 27 +- .../games/dialogs/GUIDialogSelectGameClient.h | 8 +- xbmc/games/ports/windows/GUIPortList.cpp | 1 + xbmc/games/ports/windows/GUIPortWindow.cpp | 11 +- xbmc/guilib/CMakeLists.txt | 2 + xbmc/guilib/GUIControl.h | 1 + xbmc/guilib/GUIControlFactory.cpp | 20 + xbmc/guilib/GUIControlProfiler.cpp | 3 + xbmc/guilib/GUIVisualisationControl.cpp | 99 +- xbmc/guilib/GUIVisualisationControl.h | 6 +- xbmc/guilib/GUIWebAddonControl.cpp | 575 ++ xbmc/guilib/GUIWebAddonControl.h | 106 + xbmc/guilib/GUIWindow.h | 1 + xbmc/guilib/GUIWindowManager.cpp | 51 +- xbmc/guilib/Shader.cpp | 17 + xbmc/guilib/Shader.h | 2 + xbmc/guilib/WindowIDs.dox | 1 + xbmc/guilib/WindowIDs.h | 6 + xbmc/guilib/guiinfo/CMakeLists.txt | 6 +- xbmc/guilib/guiinfo/GUIInfoHelper.cpp | 14 + xbmc/guilib/guiinfo/GUIInfoHelper.h | 7 + xbmc/guilib/guiinfo/GUIInfoLabels.h | 17 + xbmc/guilib/guiinfo/GUIInfoProviders.cpp | 2 + xbmc/guilib/guiinfo/GUIInfoProviders.h | 2 + xbmc/guilib/guiinfo/SystemGUIInfo.cpp | 3 + xbmc/guilib/guiinfo/WebGUIInfo.cpp | 103 + xbmc/guilib/guiinfo/WebGUIInfo.h | 49 + xbmc/input/WindowTranslator.cpp | 3 + xbmc/interfaces/builtins/Builtins.cpp | 13 +- xbmc/interfaces/builtins/CMakeLists.txt | 6 +- xbmc/interfaces/builtins/WebBuiltins.cpp | 85 + xbmc/interfaces/builtins/WebBuiltins.h | 19 + xbmc/listproviders/DirectoryProvider.cpp | 15 + xbmc/listproviders/DirectoryProvider.h | 2 + xbmc/messaging/ApplicationMessenger.h | 3 +- xbmc/messaging/helpers/CMakeLists.txt | 6 +- .../messaging/helpers/DialogCrashReporter.cpp | 35 + xbmc/messaging/helpers/DialogCrashReporter.h | 37 + xbmc/network/GUIDialogNetworkSetup.cpp | 2 +- xbmc/peripherals/addons/PeripheralAddon.cpp | 211 +- xbmc/peripherals/addons/PeripheralAddon.h | 47 +- xbmc/pictures/PictureInfoTag.cpp | 2 +- xbmc/pvr/addons/PVRClient.cpp | 1523 ++-- xbmc/pvr/addons/PVRClient.h | 493 +- xbmc/settings/AdvancedSettings.cpp | 25 + xbmc/settings/AdvancedSettings.h | 3 + xbmc/storage/MediaManager.cpp | 2 +- xbmc/utils/FileExtensionProvider.cpp | 2 +- xbmc/utils/URIUtils.cpp | 27 +- xbmc/utils/URIUtils.h | 2 + xbmc/web/CMakeLists.txt | 15 + xbmc/web/Favourites.cpp | 45 + xbmc/web/Favourites.h | 52 + xbmc/web/WebAddon.cpp | 427 + xbmc/web/WebAddon.h | 187 + xbmc/web/WebAddonControl.cpp | 306 + xbmc/web/WebAddonControl.h | 111 + xbmc/web/WebAddonTranslator.cpp | 63 + xbmc/web/WebAddonTranslator.h | 46 + xbmc/web/WebDatabase.cpp | 119 + xbmc/web/WebDatabase.h | 44 + xbmc/web/WebEvent.h | 29 + xbmc/web/WebManager.cpp | 498 ++ xbmc/web/WebManager.h | 151 + xbmc/web/dialogs/CMakeLists.txt | 5 + xbmc/web/dialogs/GUIDialogFavourites.cpp | 262 + xbmc/web/dialogs/GUIDialogFavourites.h | 57 + xbmc/web/windows/CMakeLists.txt | 7 + xbmc/web/windows/GUIWindowWebBrowser.cpp | 610 ++ xbmc/web/windows/GUIWindowWebBrowser.h | 75 + .../windows/GUIWindowWebBrowserFullScreen.cpp | 169 + .../windows/GUIWindowWebBrowserFullScreen.h | 39 + xbmc/windows/GUIWindowScreensaver.cpp | 15 +- xbmc/windows/GUIWindowSystemInfo.cpp | 142 +- xbmc/windows/GUIWindowSystemInfo.h | 15 + 854 files changed, 116509 insertions(+), 24222 deletions(-) create mode 100644 addons/kodi.binary.devkit/addon.xml.in delete mode 100644 addons/kodi.binary.global.audioengine/addon.xml.in delete mode 100644 addons/kodi.binary.global.filesystem/addon.xml.in delete mode 100644 addons/kodi.binary.global.general/addon.xml.in delete mode 100644 addons/kodi.binary.global.gui/addon.xml.in delete mode 100644 addons/kodi.binary.global.main/addon.xml.in delete mode 100644 addons/kodi.binary.global.network/addon.xml.in delete mode 100644 addons/kodi.binary.global.tools/addon.xml.in delete mode 100644 addons/kodi.binary.instance.audiodecoder/addon.xml.in delete mode 100644 addons/kodi.binary.instance.audioencoder/addon.xml.in delete mode 100644 addons/kodi.binary.instance.game/addon.xml.in delete mode 100644 addons/kodi.binary.instance.game/controller.xsd delete mode 100644 addons/kodi.binary.instance.imagedecoder/addon.xml.in delete mode 100644 addons/kodi.binary.instance.inputstream/addon.xml.in delete mode 100644 addons/kodi.binary.instance.peripheral/addon.xml.in delete mode 100644 addons/kodi.binary.instance.pvr/addon.xml.in delete mode 100644 addons/kodi.binary.instance.pvr/icon.png delete mode 100644 addons/kodi.binary.instance.screensaver/addon.xml.in delete mode 100644 addons/kodi.binary.instance.vfs/addon.xml.in delete mode 100644 addons/kodi.binary.instance.videocodec/addon.xml.in delete mode 100644 addons/kodi.binary.instance.visualization/addon.xml.in create mode 100644 addons/skin.estuary/media/DefaultAddonWeb.png create mode 100644 addons/skin.estuary/media/web/back.png create mode 100644 addons/skin.estuary/media/web/buttonside-add-fo.png create mode 100644 addons/skin.estuary/media/web/buttonside-add-fo.xcf create mode 100644 addons/skin.estuary/media/web/buttonside-add-nofo.png create mode 100644 addons/skin.estuary/media/web/buttonside-add-nofo.xcf create mode 100644 addons/skin.estuary/media/web/buttonside-add.png create mode 100644 addons/skin.estuary/media/web/buttonside-add.xcf create mode 100644 addons/skin.estuary/media/web/buttonside-fo.png create mode 100644 addons/skin.estuary/media/web/buttonside-nofo.png create mode 100644 addons/skin.estuary/media/web/buttonside-nofo.xcf create mode 100644 addons/skin.estuary/media/web/control_selected.png create mode 100644 addons/skin.estuary/media/web/download.png create mode 100644 addons/skin.estuary/media/web/favourites.png create mode 100644 addons/skin.estuary/media/web/forward.png create mode 100644 addons/skin.estuary/media/web/fullscreen.png create mode 100644 addons/skin.estuary/media/web/home.png create mode 100644 addons/skin.estuary/media/web/menu.png create mode 100644 addons/skin.estuary/media/web/note_background.png create mode 100644 addons/skin.estuary/media/web/search.png create mode 100644 addons/skin.estuary/media/web/update.png create mode 100644 addons/skin.estuary/xml/DialogAddonCrashReporter.xml create mode 100644 addons/skin.estuary/xml/MyWebBrowser.xml create mode 100644 cmake/FindSWIG.cmake create mode 100644 cmake/modules/UseSWIG.cmake create mode 100644 cmake/modules/UseSWIG/ManageSupportFiles.cmake create mode 100644 cmake/treedata/common/addon_interface.txt create mode 100644 kodiInstance create mode 100644 system/keymaps/Keymap.xml create mode 100644 system/shaders/GL/1.2/gl_shader_frag_addon_backend.glsl create mode 100644 system/shaders/GL/1.2/gl_shader_vert_addon_backend.glsl create mode 100644 system/shaders/GL/1.5/gl_shader_frag_addon_backend.glsl create mode 100644 system/shaders/GL/1.5/gl_shader_vert_addon_backend.glsl create mode 100644 system/shaders/GLES/2.0/gles_shader_frag_addon_backend.glsl create mode 100644 system/shaders/GLES/2.0/gles_shader_vert_addon_backend.glsl create mode 100644 toKodi- delete mode 100644 xbmc/addons/BinaryAddonCache.cpp delete mode 100644 xbmc/addons/BinaryAddonCache.h delete mode 100644 xbmc/addons/binary-addons/AddonDll.cpp delete mode 100644 xbmc/addons/binary-addons/AddonDll.h delete mode 100644 xbmc/addons/binary-addons/AddonInstanceHandler.cpp delete mode 100644 xbmc/addons/binary-addons/AddonInstanceHandler.h delete mode 100644 xbmc/addons/binary-addons/BinaryAddonBase.cpp delete mode 100644 xbmc/addons/binary-addons/BinaryAddonBase.h delete mode 100644 xbmc/addons/binary-addons/BinaryAddonManager.cpp delete mode 100644 xbmc/addons/binary-addons/BinaryAddonManager.h delete mode 100644 xbmc/addons/binary-addons/CMakeLists.txt delete mode 100644 xbmc/addons/binary-addons/DllAddon.h create mode 100644 xbmc/addons/interface/CMakeLists.txt create mode 100644 xbmc/addons/interface/Controller.cpp create mode 100644 xbmc/addons/interface/Controller.h create mode 100644 xbmc/addons/interface/IMsgHdl.cpp create mode 100644 xbmc/addons/interface/IMsgHdl.h create mode 100644 xbmc/addons/interface/IOffscreenRenderProcess.cpp create mode 100644 xbmc/addons/interface/IOffscreenRenderProcess.h create mode 100644 xbmc/addons/interface/InstanceHandler.cpp create mode 100644 xbmc/addons/interface/InstanceHandler.h create mode 100644 xbmc/addons/interface/Interface.cpp create mode 100644 xbmc/addons/interface/Interface.h create mode 100644 xbmc/addons/interface/RunningProcess.cpp create mode 100644 xbmc/addons/interface/RunningProcess.h create mode 100644 xbmc/addons/interface/RunningThread.cpp create mode 100644 xbmc/addons/interface/RunningThread.h create mode 100644 xbmc/addons/interface/api/CMakeLists.txt create mode 100644 xbmc/addons/interface/api/addon-instance/CMakeLists.txt create mode 100644 xbmc/addons/interface/api/addon-instance/audiodecoder.cpp create mode 100644 xbmc/addons/interface/api/addon-instance/audiodecoder.h create mode 100644 xbmc/addons/interface/api/addon-instance/audioencoder.cpp create mode 100644 xbmc/addons/interface/api/addon-instance/audioencoder.h create mode 100644 xbmc/addons/interface/api/addon-instance/game.cpp create mode 100644 xbmc/addons/interface/api/addon-instance/game.h create mode 100644 xbmc/addons/interface/api/addon-instance/imagedecoder.cpp create mode 100644 xbmc/addons/interface/api/addon-instance/imagedecoder.h create mode 100644 xbmc/addons/interface/api/addon-instance/inputstream.cpp create mode 100644 xbmc/addons/interface/api/addon-instance/inputstream.h create mode 100644 xbmc/addons/interface/api/addon-instance/peripheral.cpp create mode 100644 xbmc/addons/interface/api/addon-instance/peripheral.h create mode 100644 xbmc/addons/interface/api/addon-instance/pvr.cpp create mode 100644 xbmc/addons/interface/api/addon-instance/pvr.h create mode 100644 xbmc/addons/interface/api/addon-instance/screensaver.cpp create mode 100644 xbmc/addons/interface/api/addon-instance/screensaver.h create mode 100644 xbmc/addons/interface/api/addon-instance/vfs.cpp create mode 100644 xbmc/addons/interface/api/addon-instance/vfs.h create mode 100644 xbmc/addons/interface/api/addon-instance/videocodec.cpp create mode 100644 xbmc/addons/interface/api/addon-instance/videocodec.h create mode 100644 xbmc/addons/interface/api/addon-instance/visualization.cpp create mode 100644 xbmc/addons/interface/api/addon-instance/visualization.h create mode 100644 xbmc/addons/interface/api/addon-instance/web.cpp create mode 100644 xbmc/addons/interface/api/addon-instance/web.h create mode 100644 xbmc/addons/interface/api/addon_base.cpp create mode 100644 xbmc/addons/interface/api/addon_base.h create mode 100644 xbmc/addons/interface/api/audio_engine.cpp create mode 100644 xbmc/addons/interface/api/audio_engine.h create mode 100644 xbmc/addons/interface/api/filesystem.cpp create mode 100644 xbmc/addons/interface/api/filesystem.h create mode 100644 xbmc/addons/interface/api/general.cpp create mode 100644 xbmc/addons/interface/api/general.h create mode 100644 xbmc/addons/interface/api/gui/CMakeLists.txt create mode 100644 xbmc/addons/interface/api/gui/controls/CMakeLists.txt create mode 100644 xbmc/addons/interface/api/gui/controls/button.cpp create mode 100644 xbmc/addons/interface/api/gui/controls/button.h create mode 100644 xbmc/addons/interface/api/gui/controls/edit.cpp create mode 100644 xbmc/addons/interface/api/gui/controls/edit.h create mode 100644 xbmc/addons/interface/api/gui/controls/fade_label.cpp create mode 100644 xbmc/addons/interface/api/gui/controls/fade_label.h create mode 100644 xbmc/addons/interface/api/gui/controls/image.cpp create mode 100644 xbmc/addons/interface/api/gui/controls/image.h create mode 100644 xbmc/addons/interface/api/gui/controls/label.cpp create mode 100644 xbmc/addons/interface/api/gui/controls/label.h create mode 100644 xbmc/addons/interface/api/gui/controls/progress.cpp create mode 100644 xbmc/addons/interface/api/gui/controls/progress.h create mode 100644 xbmc/addons/interface/api/gui/controls/radio_button.cpp create mode 100644 xbmc/addons/interface/api/gui/controls/radio_button.h create mode 100644 xbmc/addons/interface/api/gui/controls/rendering.cpp create mode 100644 xbmc/addons/interface/api/gui/controls/rendering.h create mode 100644 xbmc/addons/interface/api/gui/controls/settings_slider.cpp create mode 100644 xbmc/addons/interface/api/gui/controls/settings_slider.h create mode 100644 xbmc/addons/interface/api/gui/controls/slider.cpp create mode 100644 xbmc/addons/interface/api/gui/controls/slider.h create mode 100644 xbmc/addons/interface/api/gui/controls/spin.cpp create mode 100644 xbmc/addons/interface/api/gui/controls/spin.h create mode 100644 xbmc/addons/interface/api/gui/controls/text_box.cpp create mode 100644 xbmc/addons/interface/api/gui/controls/text_box.h create mode 100644 xbmc/addons/interface/api/gui/dialogs/CMakeLists.txt create mode 100644 xbmc/addons/interface/api/gui/dialogs/context_menu.cpp create mode 100644 xbmc/addons/interface/api/gui/dialogs/context_menu.h create mode 100644 xbmc/addons/interface/api/gui/dialogs/extended_progress.cpp create mode 100644 xbmc/addons/interface/api/gui/dialogs/extended_progress.h create mode 100644 xbmc/addons/interface/api/gui/dialogs/filebrowser.cpp create mode 100644 xbmc/addons/interface/api/gui/dialogs/filebrowser.h create mode 100644 xbmc/addons/interface/api/gui/dialogs/keyboard.cpp create mode 100644 xbmc/addons/interface/api/gui/dialogs/keyboard.h create mode 100644 xbmc/addons/interface/api/gui/dialogs/numeric.cpp create mode 100644 xbmc/addons/interface/api/gui/dialogs/numeric.h create mode 100644 xbmc/addons/interface/api/gui/dialogs/ok.cpp create mode 100644 xbmc/addons/interface/api/gui/dialogs/ok.h create mode 100644 xbmc/addons/interface/api/gui/dialogs/progress.cpp create mode 100644 xbmc/addons/interface/api/gui/dialogs/progress.h create mode 100644 xbmc/addons/interface/api/gui/dialogs/select.cpp create mode 100644 xbmc/addons/interface/api/gui/dialogs/select.h create mode 100644 xbmc/addons/interface/api/gui/dialogs/text_viewer.cpp create mode 100644 xbmc/addons/interface/api/gui/dialogs/text_viewer.h create mode 100644 xbmc/addons/interface/api/gui/dialogs/yes_no.cpp create mode 100644 xbmc/addons/interface/api/gui/dialogs/yes_no.h create mode 100644 xbmc/addons/interface/api/gui/general.cpp create mode 100644 xbmc/addons/interface/api/gui/general.h create mode 100644 xbmc/addons/interface/api/gui/list_item.cpp create mode 100644 xbmc/addons/interface/api/gui/list_item.h create mode 100644 xbmc/addons/interface/api/gui/window.cpp create mode 100644 xbmc/addons/interface/api/gui/window.h create mode 100644 xbmc/addons/interface/api/monitor.cpp create mode 100644 xbmc/addons/interface/api/monitor.h create mode 100644 xbmc/addons/interface/api/network.cpp create mode 100644 xbmc/addons/interface/api/network.h create mode 100644 xbmc/addons/interface/gui/CMakeLists.txt create mode 100644 xbmc/addons/interface/gui/GUIDialogCrashReporter.cpp create mode 100644 xbmc/addons/interface/gui/GUIDialogCrashReporter.h create mode 100644 xbmc/addons/interface/launcher/CMakeLists.txt create mode 100644 xbmc/addons/interface/launcher/ILauncher.h create mode 100644 xbmc/addons/interface/launcher/LauncherDirectDll.cpp create mode 100644 xbmc/addons/interface/launcher/LauncherDirectDll.h create mode 100644 xbmc/addons/interface/launcher/LauncherPosix.cpp create mode 100644 xbmc/addons/interface/launcher/LauncherPosix.h create mode 100644 xbmc/addons/interface/processinfo/CMakeLists.txt create mode 100644 xbmc/addons/interface/processinfo/ProcessInfo.h create mode 100644 xbmc/addons/interface/processinfo/ProcessInfoAndroid.cpp create mode 100644 xbmc/addons/interface/processinfo/ProcessInfoAndroid.h create mode 100644 xbmc/addons/interface/processinfo/ProcessInfoDarwinEmbedded.cpp create mode 100644 xbmc/addons/interface/processinfo/ProcessInfoDarwinEmbedded.h create mode 100644 xbmc/addons/interface/processinfo/ProcessInfoFreeBSD.cpp create mode 100644 xbmc/addons/interface/processinfo/ProcessInfoFreeBSD.h create mode 100644 xbmc/addons/interface/processinfo/ProcessInfoLinux.cpp create mode 100644 xbmc/addons/interface/processinfo/ProcessInfoLinux.h create mode 100644 xbmc/addons/interface/processinfo/ProcessInfoOSX.cpp create mode 100644 xbmc/addons/interface/processinfo/ProcessInfoOSX.h create mode 100644 xbmc/addons/interface/processinfo/ProcessInfoWindows.cpp create mode 100644 xbmc/addons/interface/processinfo/ProcessInfoWindows.h create mode 100644 xbmc/addons/interface/processinfo/ProcessInfoWindowsStore.cpp create mode 100644 xbmc/addons/interface/processinfo/ProcessInfoWindowsStore.h create mode 100644 xbmc/addons/interface/renderer/CMakeLists.txt create mode 100644 xbmc/addons/interface/renderer/GLViewRenderer.cpp create mode 100644 xbmc/addons/interface/renderer/GLViewRenderer.h create mode 100644 xbmc/addons/interface/renderer/IRenderHelper.h create mode 100644 xbmc/addons/interface/tools/CMakeLists.txt rename xbmc/addons/{interfaces/gui => interface/tools}/GUITranslator.cpp (99%) rename xbmc/addons/{interfaces/gui => interface/tools}/GUITranslator.h (87%) delete mode 100644 xbmc/addons/interfaces/AddonBase.cpp delete mode 100644 xbmc/addons/interfaces/AddonBase.h delete mode 100644 xbmc/addons/interfaces/AudioEngine.cpp delete mode 100644 xbmc/addons/interfaces/AudioEngine.h delete mode 100644 xbmc/addons/interfaces/CMakeLists.txt delete mode 100644 xbmc/addons/interfaces/Filesystem.cpp delete mode 100644 xbmc/addons/interfaces/Filesystem.h delete mode 100644 xbmc/addons/interfaces/General.cpp delete mode 100644 xbmc/addons/interfaces/General.h delete mode 100644 xbmc/addons/interfaces/Network.cpp delete mode 100644 xbmc/addons/interfaces/Network.h delete mode 100644 xbmc/addons/interfaces/gui/CMakeLists.txt delete mode 100644 xbmc/addons/interfaces/gui/General.cpp delete mode 100644 xbmc/addons/interfaces/gui/General.h delete mode 100644 xbmc/addons/interfaces/gui/ListItem.cpp delete mode 100644 xbmc/addons/interfaces/gui/ListItem.h delete mode 100644 xbmc/addons/interfaces/gui/Window.cpp delete mode 100644 xbmc/addons/interfaces/gui/Window.h delete mode 100644 xbmc/addons/interfaces/gui/controls/Button.cpp delete mode 100644 xbmc/addons/interfaces/gui/controls/Button.h delete mode 100644 xbmc/addons/interfaces/gui/controls/CMakeLists.txt delete mode 100644 xbmc/addons/interfaces/gui/controls/Edit.cpp delete mode 100644 xbmc/addons/interfaces/gui/controls/Edit.h delete mode 100644 xbmc/addons/interfaces/gui/controls/FadeLabel.cpp delete mode 100644 xbmc/addons/interfaces/gui/controls/FadeLabel.h delete mode 100644 xbmc/addons/interfaces/gui/controls/Image.cpp delete mode 100644 xbmc/addons/interfaces/gui/controls/Image.h delete mode 100644 xbmc/addons/interfaces/gui/controls/Label.cpp delete mode 100644 xbmc/addons/interfaces/gui/controls/Label.h delete mode 100644 xbmc/addons/interfaces/gui/controls/Progress.cpp delete mode 100644 xbmc/addons/interfaces/gui/controls/Progress.h delete mode 100644 xbmc/addons/interfaces/gui/controls/RadioButton.cpp delete mode 100644 xbmc/addons/interfaces/gui/controls/RadioButton.h delete mode 100644 xbmc/addons/interfaces/gui/controls/Rendering.cpp delete mode 100644 xbmc/addons/interfaces/gui/controls/Rendering.h delete mode 100644 xbmc/addons/interfaces/gui/controls/SettingsSlider.cpp delete mode 100644 xbmc/addons/interfaces/gui/controls/SettingsSlider.h delete mode 100644 xbmc/addons/interfaces/gui/controls/Slider.cpp delete mode 100644 xbmc/addons/interfaces/gui/controls/Slider.h delete mode 100644 xbmc/addons/interfaces/gui/controls/Spin.cpp delete mode 100644 xbmc/addons/interfaces/gui/controls/Spin.h delete mode 100644 xbmc/addons/interfaces/gui/controls/TextBox.cpp delete mode 100644 xbmc/addons/interfaces/gui/controls/TextBox.h delete mode 100644 xbmc/addons/interfaces/gui/dialogs/CMakeLists.txt delete mode 100644 xbmc/addons/interfaces/gui/dialogs/ContextMenu.cpp delete mode 100644 xbmc/addons/interfaces/gui/dialogs/ContextMenu.h delete mode 100644 xbmc/addons/interfaces/gui/dialogs/ExtendedProgressBar.cpp delete mode 100644 xbmc/addons/interfaces/gui/dialogs/ExtendedProgressBar.h delete mode 100644 xbmc/addons/interfaces/gui/dialogs/FileBrowser.cpp delete mode 100644 xbmc/addons/interfaces/gui/dialogs/FileBrowser.h delete mode 100644 xbmc/addons/interfaces/gui/dialogs/Keyboard.cpp delete mode 100644 xbmc/addons/interfaces/gui/dialogs/Keyboard.h delete mode 100644 xbmc/addons/interfaces/gui/dialogs/Numeric.cpp delete mode 100644 xbmc/addons/interfaces/gui/dialogs/Numeric.h delete mode 100644 xbmc/addons/interfaces/gui/dialogs/OK.cpp delete mode 100644 xbmc/addons/interfaces/gui/dialogs/OK.h delete mode 100644 xbmc/addons/interfaces/gui/dialogs/Progress.cpp delete mode 100644 xbmc/addons/interfaces/gui/dialogs/Progress.h delete mode 100644 xbmc/addons/interfaces/gui/dialogs/Select.cpp delete mode 100644 xbmc/addons/interfaces/gui/dialogs/Select.h delete mode 100644 xbmc/addons/interfaces/gui/dialogs/TextViewer.cpp delete mode 100644 xbmc/addons/interfaces/gui/dialogs/TextViewer.h delete mode 100644 xbmc/addons/interfaces/gui/dialogs/YesNo.cpp delete mode 100644 xbmc/addons/interfaces/gui/dialogs/YesNo.h delete mode 100644 xbmc/addons/interfaces/platform/android/System.cpp delete mode 100644 xbmc/addons/interfaces/platform/android/System.h create mode 100644 xbmc/addons/kodi-dev-kit/cmake/Macros.cmake create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/Monitor.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Web.h delete mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/DemuxPacket.h delete mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamCodec.h delete mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamConstants.h delete mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/TimingConstants.h delete mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/EDL.h delete mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/General.h delete mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/MenuHook.h delete mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/pvr/Stream.h rename xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/{video_codec.h => videocodec.h} (72%) create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/web.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/c-api/dl/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/c-api/dl/kodi_api_1.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/input/action.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/c-api/monitor.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/c-api/version.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/input/Action.h delete mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/versions.h create mode 100644 xbmc/addons/kodi-dev-kit/src/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/FindEGL.cmake create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/FindOpenGl.cmake create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audiodecoder.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audiodecoder.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audioencoder.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audioencoder.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/game.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/game.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/imagedecoder.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/imagedecoder.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/inputstream.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/inputstream.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/peripheral.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/peripheral.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/pvr.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/pvr.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/screensaver.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/screensaver.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/vfs.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/vfs.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/videocodec.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/videocodec.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/visualization.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/visualization.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/web.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/web.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon_base.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/addon_base.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/audio_engine.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/audio_engine.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/dl/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/dl/kodi_api_1.c create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/filesystem.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/filesystem.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/general.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/general.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/button.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/button.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/edit.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/edit.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/fade_label.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/fade_label.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/image.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/image.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/label.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/label.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/progress.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/progress.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/radio_button.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/radio_button.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/rendering.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/rendering.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/settings_slider.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/settings_slider.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/slider.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/slider.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/spin.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/spin.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/text_box.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/text_box.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/context_menu.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/context_menu.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/extended_progress.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/extended_progress.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/filebrowser.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/filebrowser.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/keyboard.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/keyboard.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/numeric.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/numeric.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/ok.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/ok.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/progress.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/progress.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/select.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/select.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/text_viewer.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/text_viewer.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/yes_no.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/yes_no.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/general.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/general.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/list_item.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/list_item.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/window.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/gui/window.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/monitor.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/monitor.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/network.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/api/network.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/core/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/core/IMsgHdl.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/core/addon_control.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/core/addon_control.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_base.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_base_linux.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_base_linux.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control_linux.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control_linux.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/core/addon_thread_control.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/core/addon_thread_control.h create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/BackwardConfig.cmake create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/LICENSE.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/README.md create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/backward.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/backward.hpp create mode 100755 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/builds.sh create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/conanfile.py create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/doc/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/doc/nice.png create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/doc/pretty.png create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/doc/rude.png create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/_test_main.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/rectrace.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/select_signals.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/stacktrace.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/suicide.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/test.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/test.hpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test_package/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test_package/conanfile.py create mode 100644 xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test_package/main.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/FindNodejs.cmake create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/global.i create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/kodi_addon.i create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/kodi_gui_dialogs_TextViewer.i create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/kodi_gui_dialogs_YesNo.i create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/manifest.txt.in create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/pom.xml.in create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/binding.gyp.cmake create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/doxygen2jsdoc_custom.json create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/kodidevkitjs.i create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/package.json.cmake create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/kodi_addon.i create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/lua/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/lua/kodidevkitlua.i create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/python3/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/python3/kodidevkit3.i create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/python4/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/python4/kodidevkit4.i create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_language/swig/test.i create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/cxxopts.hpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/main.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/BackwardConfig.cmake create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/LICENSE.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/README.md create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/backward.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/backward.hpp create mode 100755 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/builds.sh create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/conanfile.py create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/doc/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/doc/nice.png create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/doc/pretty.png create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/doc/rude.png create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/_test_main.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/rectrace.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/select_signals.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/stacktrace.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/suicide.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/test.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/test.hpp create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test_package/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test_package/conanfile.py create mode 100644 xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test_package/main.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/DirectData.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/Instances.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/OpenGLExtensionCheck.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/OpenGLExtensionCheck.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/ShareProcess.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/ShareProcess.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/ShareProcessReceiver.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/ShareProcessReceiver.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/ShareProcessTransmitter.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/ShareProcessTransmitter.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/SharedData.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/SharedGL.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/SharedGroups.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/SharedMemControl.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/SharedMemControl.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/SharedMemControlPosixMMAP.cpp create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/SharedMemControlPosixMMAP.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/audiodecoder.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/audioencoder.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/game.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/imagedecoder.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/inputstream.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/peripheral.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_channel_groups.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_channels.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_defines.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_edl.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_epg.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_general.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_menu_hook.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_providers.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_recordings.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_timers.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/screensaver.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/vfs.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/videocodec.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/visualization.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/web.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/addon_base.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/audio_engine.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/filesystem.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/general.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/button.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/edit.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/fade_label.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/image.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/label.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/progress.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/radio_button.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/rendering.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/settings_slider.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/slider.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/spin.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/text_box.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/context_menu.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/extended_progress.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/filebrowser.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/keyboard.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/numeric.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/ok.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/progress.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/select.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/text_viewer.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/yes_no.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/general.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/input/action.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/list_item.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/gui/window.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/monitor.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/network.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/api/processor.h create mode 100644 xbmc/addons/kodi-dev-kit/src/shared/socket.h create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/ignored_api_structs.txt create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__CMAKE_TREEDATA_COMMON_addon_interface_txt.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_INTERFACE_allfiles.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_allfiles.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_cmakelists_txt.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateScan__CALLBACK_USE_PLACES.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateScan__USED_API.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateScan__USED_VALUES.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__DEV_KIT_INSTANCE_CONSTRUCT.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_INTERFACE_interface_cpp_h.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_API_DL_kodi_api_NR_c_h.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_CORE_addon_control_cpp.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_directdata_h.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_instances_h.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_sharedgroups_h.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/interface_code_generator.py rename xbmc/addons/kodi-dev-kit/tools/code-generator/src/{ => tools}/helper_Log.py (100%) create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/tools/helpers.py create mode 100644 xbmc/addons/kodi-dev-kit/tools/code-generator/src/tools/sub_file_hdl.py delete mode 100644 xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRBase.cpp delete mode 100644 xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRBase.h delete mode 100644 xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRChannel.cpp delete mode 100644 xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRChannel.h delete mode 100644 xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRRecording.cpp delete mode 100644 xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRRecording.h create mode 100644 xbmc/filesystem/WebDirectory.cpp create mode 100644 xbmc/filesystem/WebDirectory.h create mode 100644 xbmc/games/addons/GameClientController.cpp create mode 100644 xbmc/games/addons/GameClientController.h create mode 100644 xbmc/games/addons/GameClientInfo.cpp create mode 100644 xbmc/games/addons/GameClientInfo.h create mode 100644 xbmc/guilib/GUIWebAddonControl.cpp create mode 100644 xbmc/guilib/GUIWebAddonControl.h create mode 100644 xbmc/guilib/guiinfo/WebGUIInfo.cpp create mode 100644 xbmc/guilib/guiinfo/WebGUIInfo.h create mode 100644 xbmc/interfaces/builtins/WebBuiltins.cpp create mode 100644 xbmc/interfaces/builtins/WebBuiltins.h create mode 100644 xbmc/messaging/helpers/DialogCrashReporter.cpp create mode 100644 xbmc/messaging/helpers/DialogCrashReporter.h create mode 100644 xbmc/web/CMakeLists.txt create mode 100644 xbmc/web/Favourites.cpp create mode 100644 xbmc/web/Favourites.h create mode 100644 xbmc/web/WebAddon.cpp create mode 100644 xbmc/web/WebAddon.h create mode 100644 xbmc/web/WebAddonControl.cpp create mode 100644 xbmc/web/WebAddonControl.h create mode 100644 xbmc/web/WebAddonTranslator.cpp create mode 100644 xbmc/web/WebAddonTranslator.h create mode 100644 xbmc/web/WebDatabase.cpp create mode 100644 xbmc/web/WebDatabase.h create mode 100644 xbmc/web/WebEvent.h create mode 100644 xbmc/web/WebManager.cpp create mode 100644 xbmc/web/WebManager.h create mode 100644 xbmc/web/dialogs/CMakeLists.txt create mode 100644 xbmc/web/dialogs/GUIDialogFavourites.cpp create mode 100644 xbmc/web/dialogs/GUIDialogFavourites.h create mode 100644 xbmc/web/windows/CMakeLists.txt create mode 100644 xbmc/web/windows/GUIWindowWebBrowser.cpp create mode 100644 xbmc/web/windows/GUIWindowWebBrowser.h create mode 100644 xbmc/web/windows/GUIWindowWebBrowserFullScreen.cpp create mode 100644 xbmc/web/windows/GUIWindowWebBrowserFullScreen.h diff --git a/.gitignore b/.gitignore index 818928340cefa..c5f87f19cdd20 100644 --- a/.gitignore +++ b/.gitignore @@ -117,6 +117,7 @@ cmake_install.cmake /addons/skin.estouchy/media/Textures.xbt /addons/skin.pm3-hd/media/Textures.xbt /addons/audioencoder.* +/addons/web.* /addons/pvr.* /addons/peripheral.* /addons/game.* @@ -257,6 +258,7 @@ cmake_install.cmake /tools/android/packaging/xbmc/strings.xml #/tools/depends +/tools/depends/**/build /tools/depends/**/config.cache /tools/depends/**/config.log /tools/depends/**/config.status diff --git a/CMakeLists.txt b/CMakeLists.txt index ae7e76adf7bc1..b00c833c23feb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,6 +114,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) @@ -242,6 +243,9 @@ if(ENABLE_AIRTUNES) endif() endif() +list(APPEND DEP_DEFINES -DDEVKIT_LIBRARY="${DEVKIT_LIBRARY}") +list(APPEND DEP_DEFINES -DDEVKIT_LAUNCH_EXE="${DEVKIT_LAUNCH_EXE}") + # 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 @@ -342,9 +346,9 @@ if(CMAKE_GENERATOR STREQUAL Xcode) ) add_library(lib${APP_NAME_LC} STATIC) add_dependencies(lib${APP_NAME_LC} compileinfo) - target_link_libraries(lib${APP_NAME_LC} PUBLIC compileinfo_obj) + target_link_libraries(lib${APP_NAME_LC} PUBLIC compileinfo_obj $) else() - add_library(lib${APP_NAME_LC} STATIC $) + add_library(lib${APP_NAME_LC} STATIC $ $) endif() 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 154968fc6c74166ec487b78dd3fc369a9b4801a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4761 zcmc&&XHXN`y4?wZgcgdFKqvu06j6GUl1LNefI(4#qY|(nMNSk5AT4wRLQ}v(2~Ch9 zMI(nI1Q0~Jhaw;m5b0fM5(tlX-@iBW=KZ_(o7uDX%=gW#nZ0M$UTZzVTc6|Q66XQ{ z@LHIgTm%4ec!U51^lIHpV|Z>5-gGl(G9 z*TA|f>If*Y@7+#6T4Jf8xFL+BbGw?%hiE^fOp>Hyv(%Fxa`<}wih_u4Q^9prDupi; z7xq`E5+oD@H^wl%(``?0dSBj-zf)XNmz@sJ6Z5?gGVrV9VM#HzK5kPtR>d|so1e#Ln&;jIui z`B#9$nFkMNptdiv#2VfDFFVq3{X063%3}7Vxhir6zE5|}P5pdJbSZE+d9`@@e8DxT z7w3%%e%ij$*Ve{rUT&7&Io=>W6}88BZF?V~5KnoOmJvF6dtl}0j$Te7+tJ;G2u)Fu z)0*Pl1!gy0KV2;ubZ{I;xT-6@tFCU8ayRiT7;jYn8|!>ENRz+&VGt572(FyYOcYU< z5i@P>jF?J2Ql?qkG+tczqWk6A#;AkBKOY=twYRpnk50N)e+^4(ZS8b$*oY`1P|32% z7|`;}(3Vz0lGdnQ_)AEJOHf`hR-`o};Li&}sW-}f|EYjQP%U_l2(q`?%Vk70d3Eeo zCGho7my`@EnHF1tZX25vg-z}2?x#p3l03S|z2}&NqTqy+!_*)@H?37PJnR={B1SPOxLB4ea>;2;6=8l{15^!dmnjEIKb4y0 zE$sCT#MkxPJ-c_Dw7bu8DD?V=rW4xqml%Fb0hP}X_d8L0@b+*#aW}Zw)-3kXFVp_n zs!O45IgA@;2WRrgW)M{S5XOL`-ju9UWX{_~GGi-(L52r-qX-I4S@! z3({SAzl|A*9La{qcjyAO9|u9Gt)R>zfJr(^DE|yTw$B55*fxiRUH?9k!A88ef1#H; z=&t_TDT5T3jJSN!4W`c=X)I#tX169)4$VK=H^W3`kzEX!jpU`q5s#_?F}1@>-Os|E zid1TUW4NOp9#Q^fv2sAn?QL4RjrwSBSiQ#2Y(aPkDhHQ|@{V*-(uQX3@4-vo)Qg2* zpTuw%Pm6#VERUDQb1SBOk_-0WY+`g|H!9w<+8xVX1*2QAE|r~9y5?-5E_*W|;48~6 z$>rBicnGVc`?qqG*21QOy0bqU&KvY~RX!CP^~B}bZ`DE6hiV~N@1=*IT7-@T538s>N-i>SLhai2D=`VPwX+qjuvv8makME(p@uI`waOL{7 z=F($^zkfVls+HC&*E=nth8&|wu8``cA0Q#bhY0hT{p869Z5jEu)g{D{W38c>I8hV7 zp(wJ5sIrT^Df04T`wO8w6m&B!fyH7Orm(yJPrI+?exF2k2+RLgY)0aqf)=-6CL{w^ zNE)6oFLH536kW7m^p?>0xUf*%B(eH_`^FCk$DmE&YlDlM5>3V{JS3$D5Q&&cmHUDj zicjvmalI!u@J5@XwjsH!*d`qvxHB1To|$gV7BXJvt6XMGe`%~2&Opobdll!r(G_&# z1Mt;wRojE|`k%2q`<85wuR*`3(?3-Q`1$S3ea<_qsi`T)aJuwPjPknUrw};$GDF$; zBS0!1p^&?i@x7xy)Yn!}%(`ZNYw}ch(Xn)mWd7A?K55q8uii#6Hf}Ivq-*43+w*uU>jnJtOfH04ztoH|QTRgz$a z4;OiccvA$C-TRZ&-~;Q|fd38Q^)y!b{l-7|!GqD!(G)}HKLN^twxhZiv^cbHcGEpr z>W~xt0!h#8ICxG0sGh#3BIfNt%k5i9y9ok5=O+?z3vwbnvqq)2N9n11H547ie$z!#WFdocY ze!Rz8TbnA(9;$Ifa1&H(xUOjL`Q0iU8$+NbzVI?f`P{vnZm7C6c~4=Je>H5cFwi6W zF;i1FpKX1pbyUOj%anSug4EfPjo;SRIQh1Pm3Bw^lkPO7B~8@|)y9R$N)pUzH<=A? zn~5gaN6g3yVzU{244tr)F}LG8`w#Vyd`UCS`g)JSGU@9H;4RtIp3HxJTa@&BRfr{KisMZV)DK{hAt2M`JuFj-81`8Zx z^>!-raf2%Yi{H;VYe!^$UY^BYnn)1hzsRBIsHUX zxsBSWRYR7a9gqrM3$+u)3f9RS0z{p4LP3+7P3(R|;-Wemr=gFvt~pk%i26oT^dY5n{Ov^f(n}X`vfwc< zLpV9vK55eVg`9D2baeF3=ZMeJIQaH>FSgu4T6(?Up*pytIxg#h+SRyLoZlI8EdVMA zF)u_@(L9>k&`RUnil52Oo?_UQ#RfsY)k0ur5Mn0Z zJ&oW?wtny@u^AoK{hN>EQ#7dz&juFYVrQ5)g*@4?GrZo%&yidf>Zf-8=lEwz@Is38 zukZ)gPf9{n)>XXWJ{PQ!1~DDi7;SAW(R_{EvXfr;6piz>aGz({R?{tdaPoncZ4lg8d>3BIF83a*FQe*J+eVE9OR2c89Lu^OwM1NK0=m- z5{X3q5wZ5glPSasWP?m1_`4NU%}UhEx~}n7tkh+L{5E>`3+-}PWo_;A`5y`&0P>uK zD6%hT`v@@m91c`s(RFooFtW{9`&UV)*YBktodsO`wg?Ug2Jk>}0A+1f{Z$^se>eM< z#mhytFN*&Tofzd-L&3;EWsJ8$_L0q8`xncfV*yr*E$er+Ug-K;6~9pKxT7QG?`NYW z2S5inlP6zEqiL$EPw|S`v7hXauJKtMx^%%n{@_bR&GvW*cH`2*K~%7U6G7O=MNOdK zqV8Rwh6GzuAHfrd_o41+BBnqXi6|}KL-O(Y)HX73UrBE&cxiPtz2o){RvY}mHWv>i z6eZqFm!3RlRK{DpSGgL`tgNZAuTtZ1;{+0%WYV&{DiTUOVD0y%1Ox=M!l)T&@BxQE z@#d=WFl>UN{Y~WuwiQAjReEXwI{YDoqSvz(ZIM&FzkB^jQ6QfWXExhxrj_9~9&tls z7CSX6ww*WVHu8+)9RgQS)sPGa$F`5=K>ExE2ArBRZQyZh+ZgkNXqqd*62#P0TycK} zP{DEY5qKMQ6La7iCq~X-!<^=B{an>9Hn~^m ztanh!OYRCIzLns1E}Ft#68S640#5GhRt+SaF>dqX=4Qbv80*>IK*trPIJhf;hD1pl z&~~deAsI;Eq5xBrydh$^?^Q~o>F4U@qDvi!eXUOvtKhWao|*_&SVdK61hL(v8Lwb;xDt}l$qT& zv&N8Uit#b%h{vJk^*+2UTt}3Yfy>g;O04>$1vByee79|ilpmwI z&b!{R7oL!)^k_V?T=yQ=x3OI&re0=8>NQwOP-SL3=>XE z3#2)maus-GW%b9#ZUUo!S4XJ$QNf2ECYL_NOl`DZX8x4nUGKp~`}=`gAjVYIq_rX< z9%tDmG&`T8WO#SOL)VZG$mPp&%FO1-8=wC^FDKIb`tvV7x-O?!TAGsLZ?WSEC%Its zh`XO+?Oy&b+kI%nr~bh*gXZ+P`GI1~u58RNB^)^P=l@zo1Dii-jlsL~j05)diKcMu z{%_?RcGkPv*wyvMgZ-Ho+T(j4sf{;9V}!Kis^g|B(QeA$SG7HhuyKhn^79zNi0}A& z-UH5-{k0ap^xy;d;8+DFqxdv+SC0gd^m%Z~0&^w(UVAuZjk4#M$`8d^nS=zco7!2G zdD<|GJvq?1&DIULe8Nhf+D=S%N=S*scfP=}y}6@@lPUs&R*tCASGzC)K?qI6QIZqKoe#ZpD|A5k?*p{Lwdf1F4wrB8T7D=+`gS=P;J4(u6rdq3E(@vp&HWD`pD!SInNLMk zJVY-y*l~xLqYxm~NRO;!F3C!~hU57h|BfsJNBfhr|F3ieO235r4@M>bZ%%VLn~6O* W9)Y|kvAhfp%fi&! - - - - - - 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 a96abc8bed813..69243a0ca2b8d 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -1048,7 +1048,11 @@ msgctxt "#222" msgid "Cancel" msgstr "" -#empty string with id 223 +#. Label for main button in list +#: addons/skin.estuary/xml/Home.xml +msgctxt "#223" +msgid "Internet" +msgstr "" msgctxt "#224" msgid "Speed" @@ -3899,7 +3903,95 @@ msgctxt "#852" msgid "Valid port range is 1024-65535" msgstr "" -#empty strings from id 853 to 996 +#empty strings from id 853 to 910 + +#. Main Window Entry to select web browser +#: xbmc/addons/Skin.cpp +msgctxt "#911" +msgid "Internet" +msgstr "" + +#. Keyboard Header text to write requested URL on fullscreen view +#: xbmc/windows/GUIWindowWebBrowserFullScreen.cpp +msgctxt "#912" +msgid "Enter URL to open" +msgstr "" + +#. Fullscreen browser view context menu entry to select Home URL +#: xbmc/windows/GUIWindowWebBrowserFullScreen.cpp +msgctxt "#913" +msgid "Home" +msgstr "" + +#. Fullscreen browser view context menu entry to reload website +#: xbmc/windows/GUIWindowWebBrowserFullScreen.cpp +msgctxt "#914" +msgid "Reload" +msgstr "" + +#. Fullscreen browser view context menu entry to go one site back +#: xbmc/windows/GUIWindowWebBrowserFullScreen.cpp +msgctxt "#915" +msgid "Go back" +msgstr "" + +#. Fullscreen browser view context menu entry to go one site forward (if possible) +#: xbmc/windows/GUIWindowWebBrowserFullScreen.cpp +msgctxt "#916" +msgid "Go forward" +msgstr "" + +#. Fullscreen browser view context menu entry to close fullscreen view +#: xbmc/windows/GUIWindowWebBrowserFullScreen.cpp +msgctxt "#917" +msgid "Close fullscreen" +msgstr "" + +#. Help of web side control handle time out +#: system/settings/settings.xml +msgctxt "#918" +msgid "Time after opened websites becomes automatically closed" +msgstr "" + +#. Default title of new opened website +#: xbmc/web/windows/GUIWindowWebBase.cpp +msgctxt "#919" +msgid "New side" +msgstr "" + +#. Context button to delete opened website with tab +#: xbmc/web/windows/GUIWindowWebBase.cpp +msgctxt "#920" +msgid "Close" +msgstr "" + +#. Context button to delete opened website with tab +#: xbmc/web/windows/GUIWindowWebBase.cpp +msgctxt "#921" +msgid "Close all others" +msgstr "" + +#. To add opened website over addon to favourites +#: xbmc/web/windows/GUIWindowWebBase.cpp +msgctxt "#922" +msgid "Add to favourites" +msgstr "" + +#empty strings from id 920 to 949 + +msgctxt "#950" +msgid "Invalid port number entered" +msgstr "" + +msgctxt "#951" +msgid "Valid port range is 1-65535" +msgstr "" + +msgctxt "#952" +msgid "Valid port range is 1024-65535" +msgstr "" + +#empty strings from id 953 to 996 #: xbmc/windows/GUIMediaWindow.cpp msgctxt "#997" @@ -4156,7 +4248,17 @@ msgctxt "#1053" msgid "Choose whether requests to the web server require a username and a password, which must be set below if enabled. It is recommended to always leave this setting enabled." msgstr "" -#empty strings from id 1054 to 1179 +#empty strings from id 1054 to 1099 + +msgctxt "#1100" +msgid "Side back" +msgstr "" + +msgctxt "#1101" +msgid "Side forward" +msgstr "" + +#empty strings from id 1102 to 1179 #: system/settings/settings.xml msgctxt "#1180" @@ -4843,7 +4945,105 @@ msgctxt "#2204" msgid "Select this option if you want to passthrough DTS-HD formats as DTS, otherwise, DTS-HD formats will be played via PCM" msgstr "" -#empty strings from id 2205 to 9999 +#empty strings from id 2205 to 2293 + +#. Text viewer header text about add-on crash report to send for report +#: xbmc/addons/interface/GUICrashReporter.cpp +msgctxt "#2294" +msgid "Add-on crash report to send, confirm needed" +msgstr "" + +#. Dialog header text about add-on crash report +#: xbmc/addons/interface/GUICrashReporter.cpp +msgctxt "#2295" +msgid "Add-on crash report" +msgstr "" + +#. Dialog header about add-on crash report +#: xbmc/addons/interface/GUICrashReporter.cpp +msgctxt "#2296" +msgid "Add-on [B]\"{0:s}\"[/B] caused an unwanted crash.[CR]You can either ignore the crash and try again the next time you start Kodi, disable it now or send a crash report in addition to disabling it." +msgstr "" + +#. Dialog button about add-on crash report +#: xbmc/addons/interface/GUICrashReporter.cpp +msgctxt "#2297" +msgid "Ignore" +msgstr "" + +#. Dialog button about add-on crash report +#: xbmc/addons/interface/GUICrashReporter.cpp +msgctxt "#2298" +msgid "Disable" +msgstr "" + +#. Dialog button about add-on crash report +#: xbmc/addons/interface/GUICrashReporter.cpp +msgctxt "#2299" +msgid "Report" +msgstr "" + +#. Used to define based programming language of an add-on +#: xbmc/addons/addoninfo/AddonType.cpp +msgctxt "#2300" +msgid "Unknown" +msgstr "" + +#. Used to define based programming language of an add-on +#: xbmc/addons/addoninfo/AddonType.cpp +msgctxt "#2301" +msgid "C" +msgstr "" + +#. Used to define based programming language of an add-on +#: xbmc/addons/addoninfo/AddonType.cpp +msgctxt "#2302" +msgid "C++" +msgstr "" + +#. Used to define based programming language of an add-on +#: xbmc/addons/addoninfo/AddonType.cpp +msgctxt "#2303" +msgid "Groovy" +msgstr "" + +#. Used to define based programming language of an add-on +#: xbmc/addons/addoninfo/AddonType.cpp +msgctxt "#2304" +msgid "Java" +msgstr "" + +#. Used to define based programming language of an add-on +#: xbmc/addons/addoninfo/AddonType.cpp +msgctxt "#2305" +msgid "JavaScript" +msgstr "" + +#. Used to define based programming language of an add-on +#: xbmc/addons/addoninfo/AddonType.cpp +msgctxt "#2306" +msgid "Python 3" +msgstr "" + +#. Used to define based programming language of an add-on +#: xbmc/addons/addoninfo/AddonType.cpp +msgctxt "#2307" +msgid "Ruby" +msgstr "" + +#. Used to define based programming language of an add-on +#: xbmc/addons/addoninfo/AddonType.cpp +msgctxt "#2308" +msgid "Skin" +msgstr "" + +#. Used to define based programming language of an add-on +#: xbmc/addons/addoninfo/AddonType.cpp +msgctxt "#2309" +msgid "XML" +msgstr "" + +#empty strings from id 2310 to 9999 #: xbmc/guilib/WindowIDs.h msgctxt "#10000" @@ -6602,7 +6802,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:" @@ -6651,7 +6881,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" @@ -7958,7 +8191,15 @@ msgctxt "#14071" msgid "Allow file renaming and deletion" msgstr "" -#empty strings from id 14072 to 14073 +#: xbmc/web/dialogs/GUIDialogFavourites.cpp +msgctxt "#14072" +msgid "Open favourite" +msgstr "" + +#: xbmc/web/dialogs/GUIDialogFavourites.cpp +msgctxt "#14073" +msgid "Remove all favourites" +msgstr "" msgctxt "#14074" msgid "Set timezone" @@ -7970,6 +8211,7 @@ msgstr "" #: xbmc/windows/GUIMediaWindow.cpp #: xbmc/windows/GUIWindowFileManager.cpp +#: xbmc/web/dialogs/GUIDialogFavourites.cpp msgctxt "#14076" msgid "Add to favourites" msgstr "" @@ -15503,7 +15745,6 @@ msgstr "" #: addons/skin.estuary/xml/DialogAddonInfo.xml msgctxt "#24049" msgid "Add-on has been marked deprecated in repository." -msgstr "" #: unknown msgctxt "#24050" @@ -16852,7 +17093,11 @@ msgctxt "#29985" msgid "If traffic advisory is send from RDS, volume is increased" msgstr "" -#empty string with id 29986 +#. Used to define addon group name in selection folder and to descripe addon +#: xbmc/addons/addoninfo/AddonInfo.cpp +msgctxt "#29986" +msgid "Internet add-ons" +msgstr "" #. Node title for music artist role, plural of #38036 #: system/library/music/musicroles/Remixers.xml diff --git a/addons/skin.estuary/media/DefaultAddonWeb.png b/addons/skin.estuary/media/DefaultAddonWeb.png new file mode 100644 index 0000000000000000000000000000000000000000..511e7c21fed18cc4b2d85b784975a098a4df6d6c GIT binary patch literal 8085 zcmcJU)ms$M*2ZV3p;H=$l5U1hN$DJrp}Rp+$swgdfsyVQN{~_kQHHJoln_L^h7^zv z;ds8g?+-W^>v`AO>vBEMdiUPHBt!kDB!mov004kQOH<7l0090=fdG7*e{vCKclb}R z9CV(l0oFH@N?ra{1iqTE004l9>c0U58XP@3F%3hX$_;Li~s-@E-f`> zXz;>eQ3%4yx#N9_wd3Scp6pUyt|}!tJ1~uyLi5r0s2HYl-O!ABAu{k;-D;H3(Hi*M zm;&*$nffR!z7)0?@FN2D{x>)diEl{RzG<;OuAJ8Dlq)LsSnj?ZYOHJg-B>HPWU3Hu z@Wa75W5G1+=<@Q*(e0NN9K6^bI}tkK|E>7;3pffh^p|`QV4OSZ%cpaBdCF7rqIfPA zMCP;D?z`5j{S}+d%gf85Kar9%IkbD@@*S%Sj>r$<2gp}^8k_Lo6QdEYZIRerT}Lrf zs9`dh6gh`(l#s032J5Z6gH+hgW8FBB3>)6N%=f7rY~~wtXJme_UV)V0qcD^f+EM7K zNeoB|Y}M{(zn0vM3zY2Tiq}KX8O0owXGr}VWelWZpV_AZZ|D25#rp98Xr=t>U*%Aa z=8f$NtUp2;$IuEFD=Rc7QnIPMp<$Ts=NF&SYno#T&tY+71g3)J<$Kh@+BKUIg#&p4 zrA$hSR!^@6B<)oKPx1C)Lo~7kltK5qyh3_+v-qXC!3369HLGqD8}c;9Ni0WAie-u9 z2NoM5)F2RA&cF##n4QUB0P5+m4vA|3!B}owH;(~_3e&nwv6J9o65T4dmjy=i z^3=IjJ0&RL1#Q<>^(oHhpahzFzBLfI-&-DqFDXYPY|@cRU8pu&6HNHM#|-SuDVQYN zV}6YNyV*6I_M z8QA7=rln9Hn>=bJoo6|py!AKCUSd~Y5DH^wIcDf1DY&lxV8uV1?K(wkT20D}Ktu^z zQXI}2v>CqjAIq$Qg$kHg zo@~RjXW;Em)X;jH+4tw&v&DZRu@@>Q-8&aYcv&E~1OT=iF3*np#)(bgftj+PQ1kb7 z>OEcXZk_$0A|%&i-;biJ8C87#wfa(ZMrHCg@F%xtwl{T($Q2LUsgPfL-)sZ3`6x9; zcmPhdYSnu{X59=Fa0wX@_~l;b_R+8^4x7ZD#_Y&eIA)G(^q_!3wEJm5U`oD!r=2BG zVwb|Y_NOe2tP+RF()*@JKl}Yk<@+H)A(quV4HK8DzV^ob z@br^s2A}iD)Z++MJ>Ko-vj$?hN;!ZxRSXd}&#Q4_tUJw2Tbyc*QvyF(f;)O z80$$kayN|kl444>h$g3?%D)Ktxy>MhsRJcg2dOISxww6<>$kQ0bdBLGXqG!mP6u*k z8B{gAVOpfXddl(+P#=OEeTYR>x&UQj zozWa;U2MV7Ok0KneyQ%*2SuHqLuLiw?_#FN+?9sQ{kM;vEjIo#{Z)Mc2?Vm1OiX7Z z?opN&+3S`9rXG3V5ep=#`S!YeBuazCEpxdls_@(n}?CAnWVp_j)6&RNwh!J4#-k>_h*`r_eUdR_;^f zp<)LY-Emf@jlGA>oj%MWZ$WMF>c8DNVu7tDEc(!ucq2fK@k73Gj@z7fzWA#C^84G? ztM^TkZtm=1JTK^c)4pCzLL2Si@r^Az>#*NjBr1RLh&|dfM@EdpqPmZ765mbltn*58 zao?Ky^A26^PrnL|4GYO`ByR2LLSqP#vX=~eEd(02ww0M#9Nssv#)(3-(Cbys$x4MaVzc)Bz=)YFP82G~0>nzg%#vr&kDjAWz zn8PD?CBcYKe3j#`*i*S_svzH2!0}O^zd!T`7pM8e028FNk;)Fc+vREeZWK)xtOsjo zYzaD3{;h^jbEG_eOorF7N*u-a(O7RbidHtZYUJYRDrr<+=l3~pZF|8@S0k^z#MpW_ zraawXTKzIAY+;ly9lXj+3EqD!@u5+{Is@-#M*eCS_vM z@5RmKf{8A0*CObb&Yf!{qk(gAeyQHkWjqobtwrxR4umbDrqj7ksJ&seuFww;BUYK3 z>0&tVJnBvfy{6*>iG23rXAv16@QoNK$Fm~aKJCDqh^_OAK9?N;g z9m>NwsFhp;gbXO727;4YVum3e3y~6IwOYUK2W*6@WE|z{Hk7vqBJ##b6`xMC(rnJ2 zLdE{DY_eZ$MQlC3k0n~qO#4G<8{~f@K68T8IxSzIPBIp<{L^NgK&Ti6Mh(#mjF3O5 z-o?IjAMvfqaWoeDL(ce9YrhmOm;L8c#KHJ&=ZoUC!ghc>TH|1BRY~P8cA?GSSuf?p zDon+fqLKYTTGGNlicn~H{+{e)2>9gyx+_pAzGeCxZ63+!6Z3Av*MG#Fngwkhva|h~ zNqe7Jz@wej=(5YboGbc|uQ-dAsN>3y)_6=S-RzJSF9#pchTf11%d z7!V^rnNNIaIx3d#FBWIXT?gP%0roimy^ECWLG-F9Y#Q3tPpyVni5WMOA+-5q?mytfZz2J0QyaCu3$e#(|LA z>0kl`D-w&JUje1s0^8f=6t(XU(Go^dvwY9PwF z7JGe-uA*d73^(r@3veI2H^vo#Y|*oe(?9{`1#>cr%WxCoJV`70p${{awV=c&Cl?v? zM!?~|=E70^d;-cBlGfdEI)M3c>USxTKKh%#vvn-o9jI)=5s-qA!d~8)mgK*%TMh7@ zNiiGx0_$~M+)wl?Eg*VQ49mT>WEQOlnP#iH6VJLFgfW-qKWIsecTKo3xK$>Q+xNPW zdTy|E#EZDH!!p`WEau0!z}0d7p*!fCzdlGV#}qwK7*SV3SgyC$NJri{LLi2uDW9K* zWfjBGRdki!8vG75VdsQPUO`{uD0_PSSb1T7kV~>PO}{q|-?2{>+u9)xU*YWcMv34^ zZlUq;(u!~_T?qSu?u#P+EN~kBU>V$cwuA%i(4; z3SIf_+tTR{bM1sc`{m6pC#S%*Ap>d?nS9Q;T?aW5FBb@CT_usU1=kW$c?Qf+7AdB5 z;pXPX72)4!BsmeY-I03A(<}Lc^Y?AS-5Wl~aU}4BE}IgW z#q8w(vCQ0cXtOOKq^y)!w&l@~;mpqrF-I7^4T4Ice>{54vk)x*6|QVO^{8Wcb<*ETe%5Fl~HTp&NEwUt^f;MRSWnjx6GSSUWFi}{ltcTc63HPn^l zWqH=injxaZ*t_(;;6w+}SJdyeCD=tGnYIAr+YR>fk}JI_IsROt3dNiUu8bt&O=qW{ks)`6vh!4R>L;lRZCe?5+bLO`C~^Hw z6_u0nDUFX)U||UDSGqtqaxBe%&VI0|xIiHqr!F&{XMM#R%5fiiB7WR%zrr}4RzR6Z z`&K2eIriTO7(fJ+T+pWSH+nCpZrgb#*`nz5)F>Jjhx8rh@m;kJHl5V{tU>^;2>5QI zcRJ?LTfV$rVj3!B!ewyL+>(s;`1sp2?k6*?(EFd|SAk5d!?&w{p!*CYH8z)~~dM zsklSH%oCXlbxeBD#v)`QGajqQ`7H8iOuc}!#b7mf;m`3`UiXi<2a+u1h=h54fsRrq zhB;%#PwnrITUCfSqI`iM4@ln1090|p7)k5R*R|s!cR8IQ_QG($e&$G(%~gScW3Cocq_==r_K^Aiza&Lebr%;~kPNpi>IuOeWS7WUJxhcep__kh#b z5>6|9>RV9P0mmfJYUVM9^Jm*-E#VpE*5sm&;~!hWQP`*;Q^8#jbyqx$2WV~_#muDC z3wzRgXE_xp8!JDa;%x-^u>uvW1dB29R)amB=pobxw z(gxL1pNZjM4m!ZJSmz z&Cs{?HDZ3hIv`!>9MqzY%d%>7&pD<)d^^+%&=4XK*uW{?1nZZz;B!*bX8BQYj4Il! zSJTt9cGhh9|K3s^@y!s@rLlL;s*VENUDZb?8&v1^JM9ItT>ils$NjDMxrV)8S>>H` z1Ee+ppy(2SUE&gICQL23b0LX)3D9SdF4Rib<58^ncLhXHb>xA}HN2HwfBbA~${@9I zk&4uHgwvW_iFB_AMBo)qC$wC#w<1q=fa|j;s`v)F$Gz>xmC{h!ESVIl;3PTsO~d6A z@$9?7vSG+5>HQ#HvCC}~(@^h_z*n?08ZBcgFe)U=ymH>*M~_t))TEPO1ZWhWe&2<* zlW{$kzidjlkZ(!n(L91jj7i67|>amM+;hZf>Q=@#5 z(Y=HEzv=|EbNdJS9sTqA9RNtxVuN1(oBTNrt}}a5L?ao%G++qBQe+M z9O|%NR(50};qIlc7+(&)a5frbLI!Y=EcUs`wxCH4Hc8F=sJ9k}>S5dg&RLFpK76$p z9V=by(cico_!lqdiB5VrhHoPHwLLCDRbwB{&lk~>LjK8AfzSt;WJC=NYrZ>-=G(z0btIl|aO zCWD%3l@sg;VpG9MciVc?s^45V5T2~ATUKuHsjd6^*R>p`iaKgXXq9VD{T%Q#6EAs( ze0;^TiIA^mD_E#3Wyx#(eV6(heEXP?XKPkh#~Xb^(CiijRc)Dk$O}zm*wHG?W;53P zbx!gzUfRUbgTEEg>hRPPBH=z!=Vd*atr@WdNPE0ben`r=mlK(hm&5$X0~dUb`Y5Q~ zccVPh#Jsh5hvv(K@0zTY8Q4vSzTJ+ z7*Me5z9F@6uPBmS*wGYPs;NxY(sdP+fEvfJC@IQ^5W)igh(G8nl$6W&b-&j+kOec& zfl(t^ipD4jm23Q-SnjXhS?k^_?hjwUs9x$zKx1Kw5-9&uitCl)Qg{x%J15n)#7F6l z?|mEcAnDA|98+@9_Jk0#=zxXmOSg5bY-ees$0(vCqbN^8A;7a9T#*E;;BK;I+y-(QQLyslnyhaL6aZd{)gRBU3+h zys~W~Gnynpj~pXo-)R+coU`B|J??Mf!r6EcBK+AQhEwJ@eGBh!x0hDvUc8oIm0 zZwRFE{x!src6S?6DBPR`=pFY9e_bJ#P7K~tFbdSl@M)(z6hNH2Rg=FzDLEK!8V(Jl zvX@g@by?<04tRGi1w;5f9J5YxPN*#zrj9&OKg}?`vE4Ha#j>a;^US2#^E-S7bp%-^ ze9+K=^6KEj^4}G-*}fQ@Jo>@;N3NPLH1A0b^jWP$%C(NuNJHLD%f}kX1`(6B+F9f8 zZ+?IH;D$)PGuWZAzy|eUr|L9Q^W7_gSMsu|dhRw_B0lhS!5XX6z?@|xH$)06@b#rO`$p{KRF$D_ z+sNMdXW9T5->lJ1=8rm9PdNrh zl=%lugw9Zn_`r!=^Mk4k`gy(9T>V1FZ)L8>e|7>7^+X>!BF4!?_$7!Rs~IBmEE<*E zK6SQk&T$-Gkh$0U%vzbALB3Y`3r>&8pjVJ`raA3X<2aoEEb_zGxx2~ge%1QtbUP6v z@Yy}=n^z1$nrksPSeEw8GfHP9%=LSUMk^hyS~s-bBN>e^+^c9tA<;{bVkF^KK->?? zW0c#GWwx^7ti)&cCvKVPb0iiG3VS@7Hsq$&7dtZ64KmmkiYh+i-$)knDgvpeLIt1Y z1&qJUMb&73+9{QEgRKX>)5#)n&4}9Y-EY%Wn!-CYOKpek0bat4*v1yQP@ry|HciQaL~I|BBm_I z`j>uDVb{F3MMo!T`8_4&dYx~Gav(Tgqam%Se=V#gmPSa<1LSoGoUeE`h_ij!&!MYB z3AALtuMXHfqwFcOdMeZisLEp%#GB&h2*@kt#zelPXzOp|O*m_l)+W(_H@Uko@@`sw zX3=RvK=bg}U(uhhG}6l+VBy)%opX%~*6RNv)(6sFQ%NUn zY+kig9*W)&LFy03qOVS`kGh00q8S9I5A4l)+jAX6edLedaL^0Pu>1oWyC$K=;~^x5 zKRtdN<`>Xies&}_2xP*gbVJtXvisKRLIRuN^TYXB;7UWxPZHHh9?~2` zvWmo~RmgxUCz-vg1FM6vAYq$P>2wpBwC(5bDSt11+}K8re>;XB9l5jp+aw4s}n(6tE(Dknt~HYVlK`~-6k)^PdJXYHv!`=KzPxWepH`4lTSjhamMJJ*QHL(CJY{C+S z|dCCxHv3phu_r)UICC<);LRyn=}hh z;2#FzW310R+GvL0JWj{J=u2tFlH+3>+7Oy+-yqTPo^bTCeisEh! zsBbxK>1mNAiTMpDt0md0o;f=C;$Ke literal 0 HcmV?d00001 diff --git a/addons/skin.estuary/media/web/back.png b/addons/skin.estuary/media/web/back.png new file mode 100644 index 0000000000000000000000000000000000000000..5b02eff3041183f80a5e66b6efaa613b31007277 GIT binary patch literal 496 zcmV^ffDb0 zde9b^=Y(%G#SO8~4_e}K?7GLQEs#F8d83B3<9aFb$}iH4>tUT2{*YE&H)}lOLmF|N ztn!FYNyoLZ!W{u58P~!xw*-__T!tlX2qB3$k2x*~DgL}^D%2s~xGB!5Q+#nFl!!n) zaUE>d{<@|f$RO85CdkQ6zVb%pRJs(;BwR`^(nAAGLK$tNRk*+fc~Twdm1RP%ln>Cf ztA5S67xj_qKoJopIa3|@by+B@4iv#-R`GSqU04^@URYgZv*Ihii_9t>ni^v4Y>2_V zYW1<9cJVt;?)%7xrl|fnG9zP> mm7;en#u#IaF~%4pBJu&)pEDV}$mq=g0000k= literal 0 HcmV?d00001 diff --git a/addons/skin.estuary/media/web/buttonside-add-fo.png b/addons/skin.estuary/media/web/buttonside-add-fo.png new file mode 100644 index 0000000000000000000000000000000000000000..1a05857bb199a136652a67c753163c2918e671ed GIT binary patch literal 1518 zcmVPk_+s)3*&iOKD=Otm2IcI+R zoy+fh^Dz)#q80Dpig_uGfzHSNBykFt1PaUofWL5<<#$YC*bj`4y3vU?$Q0ta$`0-U z4wv{HfDl-`%jSE~3llPFx3E}fB^+Fdbzl)71Qws9ubo30fNVk1h$*}%p#%WC$lv8l zguvof``B|ZTwE3ttqsF+etPjG0v5Nr$IgMpj4Qz`lmQ@z(j5QA`IKO+iKz|^Z~+Nc zbVl_i@TK>u@(7EO^u#k@PTTcyiN6a&q8$J>VSmh5$bgY~8VP3xr3~LKl5qao#vuUY zk-N{QtG))s@x9jhYO6z&VzDjF$J-I`FYp!Fuo5Y@@d6yfusaODAxs!yS!PF$Zv4H( zhyORwmG*P}jEgH%@hw)hbb|y~3>cGrZY<*keo{ARBK%&Ty9UOKYrFBaYs6O}u()Vu zdz@brGTz;{hHg+qICIu*OeT$Z=Wh+&IKC9^!{T!K?Jlpyply;2gW9^G92l9i?(^3j z&g4h_lXOGzkQP_lF1Ne5u4ZYb8>;8<=u=*o$ym3e$Fdtlz+$57<+MgRDQj*=$`%gM z&K?aS2>{G)H|j4^q;pu7SRMd&@aQfdKXFlu+|NXhgB$a3uCE))fW>)pve(-WQu^wK zx(L7D>*-`N=Ho(L-B1K9hLYo&=w#7ZA2wmn)Y1)A5w6k=9dxpYZQwH>6N?bvE9v3T zI!TBNtV7=5MKWMrbVJ$>@DcWY=JUR;-MCJ6yxyjTP8!9EPA-z2SVV&5&cpGm8riE; z6b~0ty}9OR2Fl zTIu8l>}kG128>a?bh3aQU^e)DA)i?cr{C(-LnjLroxIM=WWdPimAyK|{xZKE=EhLK zV!UHW51p*aPA-PKH$<33g5{n^OE{e*5f3kWwTIR3_|a}R-B3Ci5?GA1zS-gFWW2iJ>f{Dw zHjGY&jc`RL?UW`u`O`@+Llpq)Ut6bCEq!Y1PEjpAo!rI4Z~18B?f5ZhQd?&Sdf6Qr zSeM$m>X)I`ZN5wftV?a3H-Agm0=|gWRvloCYU_%X?BopplMGm++BypWEaV#2jR3$6 z)z%T~q@3ahWWWJy>*#^)ica3=v(ei-0l1lJ>(oTJiE8V@T{UN?xY_es+WSUW{PB&h z8+FxE3>d#P@G_J@ErZq8MIX{lQOd6jxLHd1)kU~TO8FH5>!%z3wRO=Vtcz}hsI7|t ztdVYnsI7|<;ijyuYgjz=(G91zu8e;aZbwgu2bpe!6b}hltN=)?Vt;Q#OzE!+LHj6bjk3lH%CzhXIf`CydmKamf2 UIeZMqoB#j-07*qoM6N<$f)D`Pw*UYD literal 0 HcmV?d00001 diff --git a/addons/skin.estuary/media/web/buttonside-add-fo.xcf b/addons/skin.estuary/media/web/buttonside-add-fo.xcf new file mode 100644 index 0000000000000000000000000000000000000000..29cd3fa31a626afd635b3e24092d272428984f2f GIT binary patch literal 7252 zcmdT}ON<@W5v_jzf6sqB|2O0D{J(w<36iCJ1R@(GHb|_HY%?>AGT6u;1(2*kB0@qT zD9VNvf~6&-Y*5=W*no|(`Gc_yn0Yr+R#6s_qOr#_o_T#cr|zxp_bgzORnk(wK6R?P zs=E8uz197emY;gM{LG=n^5XK!0%3aw`y<#L?9F^+(270tn?Dorj;#%Q0{b599fH}e z9rnFAHZ8&J^zu^&mKLU$jxIj|iXA#McI^1GD+}dgM^=`f7|)F@E*(0ua^z@v%p9hV zE*(5jo|~C7+mC>GQH|r&gFkX=s4xFC;8UMD_Vj^6%ZHcB^IQ@whPNE{5a%0kp#c{gunWw7!z~RE zo*zDa_9I*DVF7R8$X9?oW6KyE|HQs=uP*i{r1>`tlE2_0Kfz%7D{TJGHnSA-{IeHS zR!x)RZJ)V(O;sUG(WZC$%1u>WV`-AMyz@7ds#aBAO+a{m%?JfG4&hSO2t_pp;er)P zYLsf;`R|pZbXB>KeD697YpO|&K)49OsWz)UFgyLN)v)AymyM=H4MTJ0rq!_Id!HCh ztJ)3C*)^+S$@jisp{m-{5J#=nCExqn3hinTcJD!OsvQR3V8xp1P-Q4SFp5q!!0CKv zH7xnw6{Fdu`Z=hi!;W)T^r#+aE*J;B zs+)sKIxP9#C8Oz6UC@O0fF1`80ZYF3nb8cWPH5hdbXfAeub@FXWz_*e z(y@Z1GpO33vFQw{HcsaoK4(p_J!o5Me1CBIByqkPl1Y5SdVghJ09xhRCGK zLlq7YmZBjtrE(DL5Scbup2@VzLUCE`Rhfo>GisK$vx}$K*Mn3L)6?Wn$Tr zk$xOfZBuI_Pm+F-wRg3n(=eYP{j!x~MjnskxRJ+5KX3I3Baf1PjO9BzsdE9Ob1c;$ zv9}S@D=cs6l#%z4POZn+Gof(OD$_OEp7FXUtsyJ$h%2bSl-ZCV-NXNmbXP7 zBK;7{cXSS^Kzfs<9Y{KWi$T%{nAp_$h`7W=EhNgMk20~P3)W(Qbe@S@x)>3XvJm~G z2iW4aE?El@FEMd9B>G6-&%}mytp$kJnAi@9Ueb>+aYr{<3lMKHu@e$KQR>asqMLLa z_pvpSPO$x!Zm~oc=@JvSv{-18H1b*Hsxvw3$#lH|S160M}$*#4Fl3lNgG5G|x9+2XeD zwx@u2g^9Z%(MV1X-PlQX00# zvshqa%74$JG|lp~>nQ(g4-5N@6>8P<4U+$bhyG!jr&>qV*3PmtWj%c2p@Wzb&CN3` z%_;w~M|qmGtbfC!0!>5#8Akz&G~N&}k~m5pu!%K6yqb0V3C@wrD`)F&#w<6YEieShpxH*h_lZtAg`4?XGuwwiB{ zPY-ol%>@rVU$@+aYaaDcm*j)TECTZR%A}Y4c_p;;dn@3q>31esV_Hk?t*DZ< z{UEfh4OR%GG3H^8l-TV~u7c!?))*zm*B7Im5z9tHQ7*uDD>$cUFW%IhTx-o4Z_w}v z4bNz;ppBl>dXs0e16;yd?=XH76%2fb@k3nAT5mIc6$J~t!MMVuto2>SFQ8n3Z!zxW zLJksIpXA!ry2j)slrFFYLg_|NW~gVl07B!cicXu>?W^+d!z{Wk3Mvx#Hanl>T8$FuW^58@<4ToSCs2*OoIsq5RIYTH%TfZJMIi#4 z1Rmw0lq-E5RS0Yn*w6JTfnLVA0yYVZ0b@~>XIf@#5-4HFU^zB--~fRc90P6+8sLFJgRD?EjT}xu*IR)Y5ySD;=s|SKdGe(}h1O5cjPqGN?I| zb-KMyH{7@GI-A6OlgRybHdBwhyY8$Y5Ru2~Y;*lIXDV{mQDkj>N;M9OhgCL0 z4zVB%o8Mvu<>O?QELH0 zx=0}swu_uV7a5PbNKEnU4uqs61Qyx~XRx8MIIsl>Nl6H-&hlD@WrZz3NJ>KZBrj%D zp^H0h51%}B@yhkBotjh2>qNkNoVAXQ)oMFi*RK?0#kQ?Uz4l|2x63g4RJ#oOm3D!0R=>4QA@KK5> z%E&VRJ^HS2nU7DfCJjGmuB&L(*b(w^Fv`=E5?=Z!=1~e6N?LyH{m4GHhnMz*e5Hb=fBX8?k1w3{ z91m6H<=BT(ig$1!^LQ( zqHsD2|8*<=`oyu{A9!-*sRPG;Xa4UA|8oiFpjDiRX2<*&!)|`+|DIBV4W7UGM+t}U zuN#{I2>eULA;S3Jd-1nXFQyE$3E%q*aQm_U3i|`B!JrCOOXezr)%f%LHx%@Cdi@XL CC=00o literal 0 HcmV?d00001 diff --git a/addons/skin.estuary/media/web/buttonside-add-nofo.png b/addons/skin.estuary/media/web/buttonside-add-nofo.png new file mode 100644 index 0000000000000000000000000000000000000000..257bc0892a72056079b009c8cc97cf2b3a39e3f1 GIT binary patch literal 1530 zcmVaAe=Pt21&c{UK~#9! z)tX;O97i0-zq7Y@#?y<&8tcDe8bc`!l)^y466i}I(5FBVgwjIruvmnnA(9f13PNcy zSOjUPTnV(~sTBHD5DKLb5DEh&jUf*WRH!*?tba~Dz1zFlKJ4y!iFe-a?TkA&_u%5` z?tb<=JM-DuAA#gX8}R|I;1$FY?2axO_7nc;I<~L_5o@`DtJ(RM>V^bh zN{z&twHYG8&c0=ILq@{!6GpKQ6dj-S7oW2Xdo|=w!|sAG)ATm(vYV3CCB8x}kzjHsCDqWwm>~ z_I$5o20iPfL|mW;Oc!B8V#TPM3JJ`M^1rmyA`DMu%RUcKS~(24LYTapHhc&fO1rGid|@ggwmzE^n7 z_fmG`scJeo#nz<(V^}SnJcV{(#>;*0E#JYt_cqng$!t+4Z?J+iV8qp0y=q45BD?Kv zWcQNq=+?ll5;|G3I+^tPzn*mRAr8Fhq!hJuRSRQPe4}Xdq>~Co=GTaHc!s~fgX zc7r6m=%m+#i#n-ARM5#7T7IkaGE@Mt`n7dJ)v`)$-3h9tqmylT`3E-a$J35)iqzIU zqmxO0dpa&(MQZCxUxr3*vqfpZs?^pw_pgpl;A_8qrEt1uB=~%fudVZ~mb8~Y{L`9$tJT&?R!euab^g0_U6k?*1Fn}+esKxcNh!Y|VD)sP zdTpJ*gjLZE54CkZfECgW54ClE60XbIx|+p99o?{M>q6)gI2|1k4{5sLQ9KA>m|1|J zA1yO%QvB?$lx`g2_Mv57JZ>>zN{wG1So3d4Yvj_#B6qkN`f+-mU6*kZx;nby;6`x{ zjdSd#oTKP!=mr6SnKca^o#+4=W8cX-k{-Nn5D=I-o{OOs?a;o!S8QM2(e&VSgCGh3 zg>b&nh@u(#J^Y04Wx|#YTJ0FX8@PyWgb~99gzRs$s?X7;>%VXYEpGp|fWNQ<15dDo gKd|V&e9%w(AK6H}g#^R0+5i9m07*qoM6N<$g5ewCG5`Po literal 0 HcmV?d00001 diff --git a/addons/skin.estuary/media/web/buttonside-add-nofo.xcf b/addons/skin.estuary/media/web/buttonside-add-nofo.xcf new file mode 100644 index 0000000000000000000000000000000000000000..545a73785a9cbc50458f1b9d6f23eb8202189022 GIT binary patch literal 6961 zcmdT}ON(5`6+X9L)34iiUK&aBQjg}<^VZB&>0DW$aZVFl1ve7(^D1upx^Cg4YT82Vo@5v%7A-bLv!e50*Dc7WRee`<<^& zopY*gRh_!G*Vb>|s@}b^T3ub=SRq_@QLdr{C|!JK(1Viy`EQB1;Oa%mpp2mODQ3M> z&>zITa}8$a)^9Gat<0_6UVjS|8w{wnz4Ok-N_Bf{WBskEVr_Np#@5Ex?P^VKbGO&7 zFIO+jUy$nsU{R~4(DeEXn!5VxcLQ#Ecl*}zjrGm7>Z0=n@|_ov%FW%`T;Hj#Z{B!& zWt-b?t*&mb?Dzn=^|vX@oNUVDpjYr~4A(!b(7&wYC%E(Ar%}3JLx?M@e}25Svr>KS z`pTv}o)l{M%AxQRNKo>M`3V#h<3{`>Sck77io>NgTyDc*8;*e4uDdz_TzmKQ*^XYR zD+)froqK>dQ|svAS15l!S(o|^!u$nM^asqae`0d|9y)(wodrt8&4p2VnS%IeaVW%u zd5QMprNImZsepb&2k|sIf+_hD;5d9Jtn%ct?3ja%csdOOCV;tSTw<6KcpfkaUZzI8 z)X`#xJi7>QPWOyw=Tj}VhauZ-#8a^4d_*lc0T={7hT|fW*71mt;yBl02R*yc=J>Q{ z=fs1x(9O+kho&&Z3VECqj`?OwZH}v+UCgqsH8$Ycg|@!+d3LtVaThnUj%zK)F8!W+4B5-c$`D@3MPP?E%TVYM}^hTcXyLq zk}`ADEWEp$+BF9v&XRc(Qe)p3k!Q%f&$WjpFda~zCiB3`DUqkVoEEu8=Dw}Zh&)N= z4VL#z))W&+k6CI!Vrvs*HdsC|Ig!W7Bt-(&eua!yh>w{#azr1QYfS8!KC1!Z3nq>oaf-}36Z_`0)#$ZxpY@W)eZ~?!WO`ZusZk9O z8n+VNWM)|7nd!GpKzzu=p(DD;yvoFLGhj79JYwS55uJX@4q6QmI%}1P{Ingi8WlTl z&v{8_!LTJlKXX+BgvPBz+0WgoZ303kuM#Ccdq=DW2%W%66#XnXZ#6*Z1XiLz=AKEL z@uXn#KBO_Lynr;2qUJ=5Y=PY^pl0M@Bbf5I*&~oQ;znvdMuL-eXIgA#F~)||9P&)F z$nXbbUi;MQL8D{I_w;_AM|z5<+tkpl57**l07j?D6;sw@V9t1cpp_UbWT zEpsJ|3A_;uiUV~!X<#F-fQIpY|3&X_~S@8L`g z{FLz^@NAMX<{p)3#+U|^PpHgT9hGU?I|>=AqmZV&qY7hnRH2%86fssu5lvc0oiyPc zbum^)T{P|;bu(5+-GnVgd(^{N9re(tcht*R9rY5nrvvWDJ-=P9K8XI-BX725uITyj$Q@EzAHobA)RIXjE&C#W4qQN?Pn|j^in@zUl(6@ zXaE=iqydm0q^Ik6KS4GTM_lK+vI{U@QTYXo7IG5dJnz5)L9duWF1nh8p1rqZ4?Fu|Do8!dXWj_cWe~TR=Du zxCNw8R*IvsJOE|k@^*;RJTE+?5yx^G8IUxh46oE5lzHtF(unI5rx9h5MqIy;MgUzJ z5opthYsP8B(MThXZW}kG5y$dIu0D`P9Ls4$S)>tX3~59lMjmOzu}CAX8K)6#hBV?> zP9shkd1Sz54?HX+4G5eoARtBH7nxyD@&RzSU~K(3!NyoU_^AiORLA>!9&e!k*LT>H zFFpKb{lA&Nh>gBfihmO0-YfSWefjk_2gi+|Q8Jl?OPXr~lWH`M55D;t$5y|jHEqi&QFAetw`N!% z&BYB~=uVfh>SEcbE|AmZ1>|%Yt1cFk>H?{56U)lwctFk2jr6ow;H^n8Ti_(F2O5Qr z)l(3&fXb%Etvj#`l`V>4F~%^Yef|`b8AO!BZMaN(%!fmZF)x8Op-e}m&aF%Dk`}_b5!t|be^$h(s|0O z!Tb0+(4qJNU7(!DiieDC zT5+SU?~g?N*G}?%e<3>a1pGM4D_mDk|1G&dl@kTqUq?1GmZ>BeI_Si97*;A_Dm3js zy4WlqDqpZWe2Xh+E8rU`<&B1Q=+}05<_u<02qsVQxv)s z#$mIZ!<4<4YNj((r?04vr&_0fCx(*H{uC&iL=Ikmw^jAoK7wActE zp|VK^TKwTRo21o5j**zf;{wNVVBBqkd=jWxMiN{hX+#oQA+d246WhFqT!XeenRsfI z6KsW2TI2FxqB_3%|MbMNs;4Po_S**Q^w*>w$U^0<$ZbdNFQxEjcea1E{PxDp;1$FY?2axO_7nc;I<~L_5o@`DtJ(RM>V^bh zN{z&twHYG8&c0=ILq@{!6GpKQ6dj-S7oW2Xdo|=w!|sAG)ATm(vYV3CCB8x}kzjHsCDqWwm>~ z_I$5o20iPfL|mW;Oc!B8V#TPM3JJ`M^1rmyA`DMu%RUcKS~(24LYTapHhc&fO1rGid|@ggwmzE^n7 z_fmG`scJeo#nz<(V^}SnJcV{(#>;*0E#JYt_cqng$!t+4Z?J+iV8qp0y=q45BD?Kv zWcQNq=+?ll5;|G3I+^tPzn*mRAr8Fhq!hJuRSRQPe4}Xdq>~Co=GTaHc!s~fgX zc7r6m=%m+#i#n-ARM5#7T7IkaGE@Mt`n7dJ)v`)$-3h9tqmylT`3E-a$J35)iqzIU zqmxO0dpa&(MQZCxUxr3*vqfpZs?^pw_pgpl;A_8qrEt1uB=~%fudVZ~mb8~Y{L`9$tJT&?R!euab^g0_U6k?*1Fn}+esKxcNh!Y|VD)sP zdTpJ*gjLZE54CkZfECgW54ClE60XbIx|+p99o?{M>q6)gI2|1k4{5sLQ9KA>m|1|J zA1yO%QvB?$lx`g2_Mv57JZ>>zN{wG1So3d4Yvj_#B6qkN`f+-mU6*kZx;nby;6`x{ zjdSd#oTKP!=mr6SnKca^o#+4=W8cX-k{-Nn5D=I-o{OOs?a;o!S8QM2(e&VSgCGh3 zg>b&nh@u(#J^Y04Wx|#YTJ0FX8@PyWgb~99gzRs$s?X7;>%VXYEpGp|fWNQ<15dDo gKd|V&e9%w(AK6H}g#^R0+5i9m07*qoM6N<$f}qgiWB>pF literal 0 HcmV?d00001 diff --git a/addons/skin.estuary/media/web/buttonside-add.xcf b/addons/skin.estuary/media/web/buttonside-add.xcf new file mode 100644 index 0000000000000000000000000000000000000000..213c6abf7fa99dd40d0d002a2df8bf6404383e7a GIT binary patch literal 6961 zcmdT}ON(5`6+X9L)34iiUK&aBQjg}<^VZB&>0DW$aZVFl1ve7(^D1upx^Cg4YT82Vo@5v%7A-bLv!e50*Dc7WRee`<<^& zopY*gRh_!G*Vb>|s@}b^T3ub=SRq_@QLdr{C|!JK(1Viy`EQB1;Oa%mpqxYLQ_Om& zpg)Lv=Nin;t>0W;TbWzCz5W&`HW*NCd*_{vmFo7^#`;@R#oFrHjjfHX+tr%f=5DWD zU#?!5zaZBOz@k=7q3QJ(GxxQ0f-@Nhm z$~L#(T3y{<+3^8#>u*z*IoXuQL9gJ~7_NUY0P#c{614tjQ>&GBi^ z&WQ(Wp_`l84ozW*74kSK9P`bV+8kFsyO?ENYiz)?3vGSt^XzP!<1TJy9oJfp%Pn@) zH(SaxYh4U`w%u{RXWIw$6gRVjI@9L4)6va%vgP^v@HmI)6-)p(Tjnu)j|!`w@9rkK zBxUBPS$KChwQCMUoF(%nq{hB6BF~U{pKA|IU^<{aP3D1>QzB1!IW2OH%zay*5qXl# z8!YdctSKgt9<$Vd#MUOrY_NP_aw3nD$?c|h^G>*DD?3CUBQwbIQ)BBPzsK^S%A;gr zmYGWYQSN9xvTt{R7i&iL+!XOguHJ0YZmTi8EwstntkB+9n|Mxhrv+%w^Vi zZcbSZ5Fayf)QQ==Ln zG;Srj$;`0EGt+OIfcTJ!Lq~Lxd6kLhX25EIc*Ml9BRc(*9kd!Cbk-^n`Dr_3H7a)A zp7WB!r4Ma_vA*#f&;K+VX*Mlj`ZvqvCr#EsN^j07j`&a~LfVvG%^IpmpU zk>L->y!NTpgGR@a@9Ftgze)lF?Dow`g&4O^uh0l)TJ)(F-8OFhEjEjBQ_sUKHsA6* z+A>yF2+y?^+tq3o%z9&eEjG2_*?|~`VmxT9L3x(!9YhL8W_eOo7K6Z57ZFB#^_Z`g zxe~^N-7!F8{2(aI7iV4SyIb|*Etpetl1h;}dG4LIHgQ}yO;~fHm_fwi7XzDFAe>xS zbI@rr!fF)NoC^^%lX1oBj(A-l)#Vw9c)1xvwTijVU50%iXu4G(J+li!Sy>R$LHOdu z;k2%jBI95H@~GcoXU#xd}mF^7!b!Y-8ZsF$%i>LqMX2i%c+n2qO6X4m8Zu&W8VffqOI zfzs2*begd^dIK1{rwr*MI>T5Ty$XzdSBCCGI?MPO8=nEjcCAC&&sYNJrGCP`F23&2 z05Aeb10X+0PuKB&f@~s=zMvt-62LWJq#fz$$281X0=Nu}ge8t1U`7E;05xFbISru7 zSOTbE${<5(03*N>zz89+>QJ92WL*j1Ga6+q0bB(}zLo$!qA|u2z$IX0dU5mtjWd=2 z&H>|qphG>uSOO@~1mS2Q{B4>f97J?p)fj6GHNp`_C-4+wecV%ovyMLQX*?6RfN&mg z3rL}?6h~uu0LsGU?GUGVUU*0&j^#8mAZbJyUa3DQ^V%n*5!WY9Bg!I;xPBpx0J=0H z(54aBjMIptkwzTdHf~5Gj^&M9eISiEmeYu`NF&Y|(uhEeJkp3`kw#oIP9xe3X~eOd zMw~M8$N)9iDIOM*1_aI(5RfA9i_9=6`2e_EFt&c2U}LNv{M3VCs^k4Vk2lc&>pSep zmmYqz{@=`B#718##XpI0a?-P#o}4=T*$sOjze#|2$UDxFQ6lHhZrD9p1B9O4l*szC z+oaV1p=UQGGWP5?jk8 z=Hdn~bf?Q$b+K$z7s%=I0&=>HRTqm%b%9j3iDl(-JfLRiMtWK-@YW=lEpQUo1C2t* z>M4j>KxI?o)*V=e$`-}27-JaHK7R_z3?jKaARxzU4xSO|G&7{+W7f{V3GmK>$AEX&7`R#ocSTgA>6_wneIV$)}I?q@$={)7t z;C*}@=urHCE>OzYv{y0)8Cj6|SqN|CU^!%87#QuOpio%T$sK9du$l3@eo|6`J;+ z-msEjYbiw&Q6LA0B;hlEmTM0~Oev8OIGR@Ed!W=~3_z6Svn&%5LbK9Ac8n20iJ>?_0F1@GDGFT* z*AJV?MvpHe`EKY^x`oZ4U{Ml(qkT5N=o zP}w8{E&lMEP10&2$4JcLae?DFFz&WNJ_*z;BMGjMG$IMDkl472iEUm)u0dO#Ogy#9 z3AREht#SD;Q5|3Xe|lnB)zg$P`)z}D`fE}TWTEm_zU$A7N}CRzzx-W-oBLnFMgRg^!@uz3{Dbd5BpSe$A(!$4 g_}6OSEXokd2-jdzCH0E*GO4HU^M5RtQKUcr0VnI*&;S4c literal 0 HcmV?d00001 diff --git a/addons/skin.estuary/media/web/buttonside-fo.png b/addons/skin.estuary/media/web/buttonside-fo.png new file mode 100644 index 0000000000000000000000000000000000000000..4907e0209cc64911a61bb36d0d043c96491e1ab9 GIT binary patch literal 1518 zcmVPk_+s)3*&iOKD=Otm2IcI+R zoy+fh^Dz)#q80Dpig_uGfzHSNBykFt1PaUofWL5<<#$YC*bj`4y3vU?$Q0ta$`0-U z4wv{HfDl-`%jSE~3llPFx3E}fB^+Fdbzl)71Qws9ubo30fNVk1h$*}%p#%WC$lv8l zguvof``B|ZTwE3ttqsF+etPjG0v5Nr$IgMpj4Qz`lmQ@z(j5QA`IKO+iKz|^Z~+Nc zbVl_i@TK>u@(7EO^u#k@PTTcyiN6a&q8$J>VSmh5$bgY~8VP3xr3~LKl5qao#vuUY zk-N{QtG))s@x9jhYO6z&VzDjF$J-I`FYp!Fuo5Y@@d6yfusaODAxs!yS!PF$Zv4H( zhyORwmG*P}jEgH%@hw)hbb|y~3>cGrZY<*keo{ARBK%&Ty9UOKYrFBaYs6O}u()Vu zdz@brGTz;{hHg+qICIu*OeT$Z=Wh+&IKC9^!{T!K?Jlpyply;2gW9^G92l9i?(^3j z&g4h_lXOGzkQP_lF1Ne5u4ZYb8>;8<=u=*o$ym3e$Fdtlz+$57<+MgRDQj*=$`%gM z&K?aS2>{G)H|j4^q;pu7SRMd&@aQfdKXFlu+|NXhgB$a3uCE))fW>)pve(-WQu^wK zx(L7D>*-`N=Ho(L-B1K9hLYo&=w#7ZA2wmn)Y1)A5w6k=9dxpYZQwH>6N?bvE9v3T zI!TBNtV7=5MKWMrbVJ$>@DcWY=JUR;-MCJ6yxyjTP8!9EPA-z2SVV&5&cpGm8riE; z6b~0ty}9OR2Fl zTIu8l>}kG128>a?bh3aQU^e)DA)i?cr{C(-LnjLroxIM=WWdPimAyK|{xZKE=EhLK zV!UHW51p*aPA-PKH$<33g5{n^OE{e*5f3kWwTIR3_|a}R-B3Ci5?GA1zS-gFWW2iJ>f{Dw zHjGY&jc`RL?UW`u`O`@+Llpq)Ut6bCEq!Y1PEjpAo!rI4Z~18B?f5ZhQd?&Sdf6Qr zSeM$m>X)I`ZN5wftV?a3H-Agm0=|gWRvloCYU_%X?BopplMGm++BypWEaV#2jR3$6 z)z%T~q@3ahWWWJy>*#^)ica3=v(ei-0l1lJ>(oTJiE8V@T{UN?xY_es+WSUW{PB&h z8+FxE3>d#P@G_J@ErZq8MIX{lQOd6jxLHd1)kU~TO8FH5>!%z3wRO=Vtcz}hsI7|t ztdVYnsI7|<;ijyuYgjz=(G91zu8e;aZbwgu2bpe!6b}hltN=)?Vt;Q#OzE!+LHj6bjk3lH%CzhXIf`CydmKamf2 UIeZMqoB#j-07*qoM6N<$f>nyzC;$Ke literal 0 HcmV?d00001 diff --git a/addons/skin.estuary/media/web/buttonside-nofo.png b/addons/skin.estuary/media/web/buttonside-nofo.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8045d6f1956527e63b75c0d65afe72b1517480 GIT binary patch literal 1530 zcmV;1$FY?2axO_7nc;I<~L_5o@`DtJ(RM>V^bh zN{z&twHYG8&c0=ILq@{!6GpKQ6dj-S7oW2Xdo|=w!|sAG)ATm(vYV3CCB8x}kzjHsCDqWwm>~ z_I$5o20iPfL|mW;Oc!B8V#TPM3JJ`M^1rmyA`DMu%RUcKS~(24LYTapHhc&fO1rGid|@ggwmzE^n7 z_fmG`scJeo#nz<(V^}SnJcV{(#>;*0E#JYt_cqng$!t+4Z?J+iV8qp0y=q45BD?Kv zWcQNq=+?ll5;|G3I+^tPzn*mRAr8Fhq!hJuRSRQPe4}Xdq>~Co=GTaHc!s~fgX zc7r6m=%m+#i#n-ARM5#7T7IkaGE@Mt`n7dJ)v`)$-3h9tqmylT`3E-a$J35)iqzIU zqmxO0dpa&(MQZCxUxr3*vqfpZs?^pw_pgpl;A_8qrEt1uB=~%fudVZ~mb8~Y{L`9$tJT&?R!euab^g0_U6k?*1Fn}+esKxcNh!Y|VD)sP zdTpJ*gjLZE54CkZfECgW54ClE60XbIx|+p99o?{M>q6)gI2|1k4{5sLQ9KA>m|1|J zA1yO%QvB?$lx`g2_Mv57JZ>>zN{wG1So3d4Yvj_#B6qkN`f+-mU6*kZx;nby;6`x{ zjdSd#oTKP!=mr6SnKca^o#+4=W8cX-k{-Nn5D=I-o{OOs?a;o!S8QM2(e&VSgCGh3 zg>b&nh@u(#J^Y04Wx|#YTJ0FX8@PyWgb~99gzRs$s?X7;>%VXYEpGp|fWNQ<15dDo gKd|V&e9%w(AK6H}g#^R0+5i9m07*qoM6N<$f+7`( z%NNY=6|ib=&7tb`S5$4?ul;La)lY8UT)(lsyH#6l`GWZAt3<0U-PzsVuWj$%_-Nxc z>+fxD-rm?x0%Yx`xCncJW%w&1wYb#5(>Qn)o=AY?bu)HHx?e@ z$|pdaDFj^o1Ja*P-%H(x>8l9oiHP?m2Fed8W5(2qr2OW}#87w1DXAl?;`qm_qpmn9 zM=r{dzc!LFd`XV|c{~xu4NANOPmPKu6@pKCAqbMgszLewW8Xdn3@`6c+g=vDHe_LHBG zo8WVz>*OOnLw-gMz%|iZ7eK=^%pu$wyiy` z1EN=`A83vIHTfm@jOcshLp?|Sj@$(Ii*A#T^t|@P0ZbBX02A6P+Q$OVb&_lYnAEE1 z0`(UFx!x?d}CFCEdM9w%xs`#iXg1$hNzev;be4)|DvV;V2W;OLflMUvbV~!J^j*4wU$w zA+yXl@;XXk@frZ2jw4}a1#2m_aKr~0G03g?Smup-E>XiG(TLMVp}HL9>zIp~Y#{ zmsqvrHzl2m~&EKb5Y2kKp88M)`ol}v6Tz8BsSlRd8*;AZellKc_#>o$K* zwaLm)(1XRO&_Mo>`KvZxV_3*PL?_~H$kBl=$5d@~xkc0EEg4-7euAJ2GsUXs+s{=p=%Dq&8H<=I-ARGKS!m1sZMmb}&bHMo z+RgeHYpeOT=ZUtlvPF2FZL2-)YR+O}>`Yrtt+WddvzG!oMQ7DarU+liOqze!$2K>_ zT!&IMyu^R?1uqj{>du%9s&c%A>w;I68EOG`o@5TQ06S5<+FC=*5$FdTZa&5ibdG)f z9E}GyV|)bM7iCoMVw>I@k8OR1%`upMbRAqx#&ni!$8%PC5=S|*b(E9t#8DU7I_eTH zc9fS&;;2Bjjtb%?j*4XKs3_&cQHg9Fm86t7DwD0FGFC@BpTz}d8kz$Xthgf;$=d*) zibpn%-UoNt03J&>**JO|oU@L;#1|x(>jpMFJ(5iVsFFa;=uQ@Dj09U|a+;tBysl(X)ESCh^pV$Ey*A*F*bVKjR z5HD$5Ob=pb+R$$>sBpQ)vDNsBkh9sJ3FyQ!Rv24nIP#_-pVe9UmbXn!BRUY5~ATBeMC(92mYut@t~yp`knp#z1^kVz0JMlo4Z?(ei6qb@e?o_>HWxD z+HvDv?>&)$nbUgjA8~&6dz`5q;U14;q@MnJbU`Yo5*D4VY-Tc3!Mr=}#$k$EskkXu zJOBFJ3TJxBoAxT0)?wbY1Zf6R7B(t|G7_fC-YhgwzG5gXVb1mDpkWG^ymLLuhM;P{H@Iln`1>MpDFW%(zgsY%&PY_d*v&c?ZUjD@lYQXae=Uppvy&MC*Gm zak>>nSOUTIN3Yi9ACXGr#($i6p17GXD{jdRD&?$KLdXT-rJND3=r!Sz zSGdDQn$K#kaD$j4FOL|_p-<#>;bsA<6H#Q~P6W+7QwoHyLr2n4&e|XuqgeJ)ibhCA z!sJIOo?>OAv^9|<8MEjvXp95x9#_amjx|d%!4;ywGocltIIdz8S1(4&X69hx&?@6K l;hNNLm!C;>oMpasYFgFP5>frB!Mgk{s`G3$UV_YW^iPgY_oM&- literal 0 HcmV?d00001 diff --git a/addons/skin.estuary/media/web/control_selected.png b/addons/skin.estuary/media/web/control_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..12b3033016253d1ca8c2ef37eff3991559bed803 GIT binary patch literal 16434 zcmV(_K-9m9P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3vplEXF*h5z#ua|8k)79NLd)!bl?KaY~yc6U0d zN-9#>vM6HV`#{KP{qMg!{RamXDygW4RkMtv)KaydF~) zT;;yCbziArT;B#>p7H*DJo$M1#N+5I^5alWI`0rU7>KaA6} z{FfZJqpxMz51pQI(%<#FRQk+__?g1*2bZ6jOa44Q^xJ#J-s@gnE0!RaJ&XEU;`Iv? zJLHth%y2qBir;>n6=&p@2dGUfwWr*1Q;DJVMukplv}s+}K?5lkUhKFs50+~z#JTdg zpp4TVB|u|;hc z@(Usn{B^PJOnlQCIkjdxc01_d# zA{i18$VQ@Ml%3g$pkshfL*^`nI|z^_<%ul0h#24mpV+W*y5_R-J&g7O5Gp1PG}u6Z zRf-nFehZXPODbAa)zme#YBRB7YG!VyPc;`Wu5RugUcH4x2@MO6h#IYO6|^x;)vDL1 zwYG+!tu***nBOqaxl1oyyLIo;Yi|SPGs@6m!$*ud+T7qy4#cWOV${WUdusPP5r%=0%j47-21pwmwDFat3z1mb=O zoaS_x<)BjdkUPwBWl18+$WjlSNrxB+mPM?aUhLlF{*+sSx__4&|3)qybpHmqbkKc} z`y;nssLgimMY#Z-T?kFlAqCs-+JRLfAIXr=7#o7^C5jAf_JPgOs?nIX3slHU(6`3w zZDF+6Q%7A8SIx<-#M0_z)z~_6^O(HKDL2>AO|oCcO||EcNqr0a#6o4bq>kl|RS2&r zlR2ggtJ#mSmEQ3B^e(kwtXtt@aGi|Nj=1e4kv8bhNmJ}AoY6<@vQOt~S7d_vwpX(nvq1;xwXH?HtnQR% zJ@Z2s8vQPI1QbW9kaa>24~PxOs0uL@upay=XvXM}MNYg;mXOWKmj?Dgu4~xI_LcfH2`#%FKxmLNFKnk6kO}6i9=5rk z9^9^_HPb2U#kPVi8^S0{3~D->cf9+bM|dmF^ml*Vt9M6-iN&BmmwdC$cYT~9b^j} zqm7(hGr`wTJ`S~ynDZ)*yBw}3>!UX4sttt)_HGre2>?>Wav7-Bwam^Q${w=oG^idR zXV{0M;;#gQTCGY|qhd>;xlPRN^H^t8Hn!B5O#;hVc*C8&lGFbIM{2m@XBRpe0004m zX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iTZ^I<5sQd8WT>4ih>AFB6^c+H)C#RS zm|Xe=O&XFE7e~Rh;NZt%)xpJCR|i)?5c~jfadlF3krMxx6k5c1aNLh~_a1le0DryA zRI_6oP&La)CE`LRyDD_PB8VOgB8q;Anfjb4CgC~0?&0I>U5saWpZjz4Dmjw@K7n|a z>4rtTK|H-_>74h8!>lMN#OK6g23?T&k?XR{Z=4Gb`*~*ANT=qB!^A?Njpa6GMMEW? zB917kM*04X%L?Z$&T6^Jn)l={4CS~|df(QXJswklh3o%+XQcR?1Kknfl zcKjl_WO9|j$gzM5R7j2={11M2Yvv~>+@w$(2)@|%$0*Rb3p8rB{e5iPjT0d73|wg~ zf29u0e3D*kX^|tKZyUI{ZfWu!aJd5vJ?WAmIZ}Y8Kc5HQ&*+=7z`!lgz2^4T+{fty zkfyGZH^9Lm5G_#ly2rb_+I#!=OtZfqP!DpMtwK{300006VoOIv0RI600RN!9r;`8x z010qNS#tmY3labT3lag+-G2N4000McNliru;{^*ADjv=%<#Yf5AOJ~3K~#9!t-Z^V zEL)Z&q^jFI&bc?MvWiB!p#cFz5JX_afH?!0G3E>S3xqKr!Y?pj)&mB71GAnrkCtj^ zswy+@3Ae4vV6AOt5!XE;ZWc!*C2vHyo12^2UJqTWx(VQC00A%ou>adQ|FM5wzyEgt z?EN$P|JVCQ|GzHpy}m}5|K{cIyu4?-SkdU*AXd;d7oN z0kZ#|{(b_;ff&#Tl0F6jihYSlD&$6IvW^*mBDoQIzbF1^)Bghdym%>Z~x`(wPoN5u#Zt^9|V_!F<57oK9`us z;pz0J@y-1tfq4hgzw5vDi|csAd7Mo5cd1vBLgKnyAV?s_`I=llGwWdpk{tKgUdLIV z6a+q>v!w5(o?N@@bN~K%&AavV(ZBci^0U`}^gdsng?YK&0$^$*6ha$eq#nLO#KiU! zkSRF8wu#1+??h&3ahHuf$S`0SkbqYM3^G$|>bUm4oa1GU9Zztc#Ea`czq{5vp8mJ* z%Y$|B{xhyI?a_7iyET*#?nT~x7rcvwe)rw{8&h!0ud33C2*DGH*|7Wk64?h3;v)^5Fzk6o<;2H9RwznA3PU%SH${*`+z6cHJ_ZFKa%Y!xaTM7Wb z`}{m80{o!(diK6Y$v*E2%|}Jld{O|s|Jz4}l)351rFi_^K$L; z?!4bD?L7H@{s1+3Us&dod%_Q%F?~>U*%AO`AKpd zPp;KR#T7q5O!y>rd=|&~ppp3OIzKCfK8o{?KHnd_@3(x$M<`!DjC;?EN_>!q9u)~WxnlF zFJFb7*vYfwKVk7lLETSKkoV`<$(rxK{{ZYS+)I8?$o={?JPH(kF(`Z%NWRkTd?j#w zw9xoT5yVfrpGS%PeL?mtcs@Hv{Tbted@vGNYu)dPa9s+-hI_yZ5^C(%U_IA=JUV_J zz}}DUoxWJe3)o!<}>J{kewgQUnW6ot>eXPy)}kACLkb^oiM`Q+LE ztZ03NH2Rb4#ZM9@e#6KGU$}n!Am-m1uKm9oc06&1l zc_8wxW*s8^UWbsXFbISi2BeQKxFPZ50e{n(iSM7kM4;2-T6W^@ zAJaUC{s#4Utd38Ykwy*OYaDT2BKz%q>td#d9?cavX6x@3Xs+jzCy&>=Lh8vF;`xmA zBLwQBxiY^HkUk4`j{>|O%=>;zGWran{z?MNgJRNHPu%mM{_Y&}6;$aNYWNK5eTF1G zg4OZCXXJ}0&zsgC(ODL^@Y21zLk?xvbDsA2|kRLYfjjJ1V6-dJ%`Yt~L6BpFcP zk+Vd=4kacDt0JhRY|tS%$iW~)5{if;XoQ%^1hKe>i{5ok@zz{+f$ZuRENUFPSO5Sq zZ@3x(NW-fSf;jlPNhQd`5gbV?m(ZQQO{<)e3E#t zzkg5eG9GgSu7PKKvL4?v?ET<#@*75md4fPZ8f#oX%TLbjQPRC$r$_ASM+l6c-@iAb zyt8QFg&4d>VMHK4;NWzj9u=bJ{`;FejZw;@1KF#4BjLgqs?X8weU9puhj=os$%$$n z&o(Q_9O*X5gJO-@3;ENtqHDeULBU0oV&wREzsn~Ti@X(^Pt+_`wRS&%P8P0@+N&S3k4oC^LrlsK*k0TYFSYw*8vP*8>-ba1dZyrHPn5y zfT56rI?*R22Plj{0!Mx3v0S%MU?SQD%~$=fP<&Mmt0YwmTuh&;AlCU=>>R&Zd?YC( zVFcJgNQoyjBu5ZjWou?86Yi>`4G<=4Xh7`}H&0C7c*Dd_9Pqttg~uFs$sMcbw)yT3 z9M_p4oc*mzp%(lAuw!)MyAv4ikk-t4G6qpew!XUKOJnV`!-xx~Z~(cAv>g*5rO9so zJ5T45RMH)gmm(cC-wBb52%#5FJZ$WJg9_Rq`0ipUWH16Al}dO zaR&ps-t9(4yb8vgcfj-gvdu*u@frW%QKjz>X4coW_r7Zz@8I7@q_7pV^o8#K+4$gD zC;rh0*7@1Q+3X&PSp?Ub2qCFutc_v@(&jkt)_8*3CM3We z#tjvpwiwy!n$HkJvy!GR#X#J#^}NsN=jKhpu%t>?Ay1uKX{NoWM}DG?1_9lv#B&Wx zQxfX9MwhI@KCQaaUgtJz%`;%^KAdWO#|G$%2Xi899CUWfpb<}Crv5e)*J6kFc_5vH z*Nn3omWL?Nd@_E>6C~mK>`r`L@$r5g{LPA#|F%B`!0;zSkDkO07wx9O2klLU<{F)5RQ`MizJ4vUd3tXUDe4}Zq?D0M_LkS zlB9`<)#i$9-9BN7?99PV__K?EA>ynPN|z3fO0NJ&#fd1Mh*bu|=~%!ix&azjWPIpAd7u z^ht4d^&582UaZ5itH4Pei!$t!YhK@*>bzMx^Q5NCL~IsbaU|3v*GtSR+=#L5n z9CA?7g$PCnSqWl6zg+#efT446#xD6)4MgAQEJ%G#lXMKR4r))Say#V&s~KoU4liCI zmkz0EJgdrOOVunm8h6fm~D3@oCw^tTBxL2k|YH+Hd>Gg8X$~0gTPrM(9E4q05h@S zIpICYDhg)BJbOMs3?9iZ=ezOSZz%xYHvs?Y319Ea1;F)0|Lu2`%zJq65sdi=>UfI| za1$~C-NZ2n3K-u;jmw9in+o=U0B)obZV4jlwjq<WIpTabkQ>1E0yt+?=xUuJ*HZ_~ zdmv!gK}5XNjDEKvVe4sm!0l#^$fyq5Ls;?0z7Y1V*Sr@iLl}l<1&vOo0A`OW&U-g9 zF`-`MKFTv6F*tU5$-4t6gz0q(mFcrr&te8!C%X`42VS&cvA6l*dFlf;AxsB5F$H6Nr>-@|I;-v=_$MM0H+X(odU+&H?$bkX4|I)K1& z5*`6^fgyC@KnSZ~NhSAOjERUE$HY7$@)~7ckA>jqK-A-j)o{KUOB5#apv#{h6bz5x z^M5G$@T*$-w=?&vNmqf_l|M`#Zw%aM+VYq ze${D}5<{{(U}ClPt0Pa30wk%+)1>QBRh}pVt~3`n0i{LR~>Y@y>IWg z14-u!5=?`p)5mMUNyWsFHHWl~A!5Hzj%|c212E@eewHjIQLTXH3V7D&QUsm0t6;|t zER4~W^HUf?E&K^2m@tV%9UtbLg%CO*cBFHCY$WCYVaM_0yzlTtVuLZJf$VG47|eU( zy<-uHWXEGghkqjp_*w+~U;oeoU~gvO&-k@j!bgS|#IKzHIH+3{+~fN|CIU&@PXn?N zg}4#h%LeQuZ@|E)B0)u)+qTgS*N7ltu*qkm=J_btOHw_O5=VpRsR5D;jbngOggk}7 z>J!OjUPcm<3Rn`Wpr|EXC_|&dlBxz}Ey$JmShIJXjGWbhv)ArHh9iKx_oz7kxz9mm z#~8^z2efTeUYSS&W0hMSxd|{KR#G2V8CQ2cz-+dDN0dWNfMa1}Ir|mqj~%?K`#;8- z)lMmD5@28z^d1T6&fGoYgcrf5XYq})(e)=Z|A2k9LSIIa^gc~^X%>1ac|3aE&w0V@ zWTo%!a6$yt0eT7r--QBfvzQKcm3I`fP7+a)&~(y&#z9kr-Sf&KJm%~Y)MZK2Lf8Dk z9guPW1{GXguw;%L<@I}~f$9@0~mS zgxB-u768u;S`LY;P9j!#I&%iDF&a-ikR&S+Em{g8EN%u4rH#&t&@G)Q^6rtS)0Ejt z>|@lqgf1RT7m*~JeL@6rM3SyTUR``G7>_5dnBp$31E@ zLKbqLKz&_8K({U~BDksvj1BON#)dg}4Bi+{*LqAa$V7Z|JJQ8)jFE){QHX~-!oEicO1hvqd0W&j%i!wzM zbLUK1VJgAgfmybtoUbP1*u_(bjk(+V53`%0%$@LSo^S@fvKFt+_#eMQ2>hr3xT9=; z=aU)6JC^K0Q5CkA8lv5PQl_EXcSVB&AV>97+6E|QLfW<>T-EPJ^@nTv zK7e2Y$kYNKWm86yW2|~IfT$r73Yt$w4lbCj5CJtgjzvjZ06%Lbo&^jGSr`E_&X^)z znCIP9i@>a;+i+q}v#!p6E7~AIn7v9HA-*pcfGoPcG+1r^vGlG)Pe0G{NYoF+VPjf>8X<}l^;S?A+I$S?AM7ruZvEN%l&#C0K@9R#}U=248CAY#Rq zmL9IoFRnp78^2xMTP4Fz-%1mvvm^lByDw7k8F8FO1Z)^ukY0~Nd$!<`9jrWG5aAjJ za5edC5|J5jcGW;HLL(Yl=s`temNe7@&qgzi=~Kwrj)=~l9_-q1Xdj3GISXG-UmSp( zd#W~4kR6w7SjClHAldW;xx63NJ;{ zA6JLW9(A5A`5T7Gg$St8O?qvFlSnk}2zG(06Z<~1?<6_HIb);f-$wR1kxY1} z?I?G9-oyF28-~2Ya~j!s5S4%1DBxdyMhJXg04zvnqKpOp8mI3+-;Mw}7gU}kw(sQ` zs!iB#B({<58_9&@`yjwb1G<5fijGc_nXd)<;Ua*YnIn$pj3jzyjyfofAag=vlPSo7NM?)yPGW3~2NA0><@&s{ceoY+2V@4H zo&-L1_q^Kg@(K}GQf^8=+eE*+-+0OO8*-Zs>%UR$T!Y; z3(B<9Aw7w;GVMvFUbVzQ&4w$M72e_V@*H#jDhL910l>!N6E@nAV1j0W zcts?@F%6htWqEe;uVQ1?F{)&6crwixCsg{X+SO51zXCfPH*o%_BB$?2ft0fz&U&@` zT{K~l@ID(kwhJV^C)kKg!?U~AoUrO;@_iYgcT!&sWB3M!=X%x`#pa9;1e*u82ysQx zNZ?A8T6+{!$`sSfwmw&D4$%3qHkPQuTIbduVUMEO@Q}KrFSsv7ADjQp0MV^X;#fA7a|CGHQMx%Let;+kRx9smg`*J9K&L%V$COt3l zB*mEp)Q0A%A&r}C=jzvLyq{G#VLd%un3_|8f=(3{NfObDQ`{k+EX0aG2fesO&;jVA zoGnSrRuH>}CQcKDop`d)12kf3BIS~qxE)xGc&1|-g&mp3oV6O0y(+C)ub@q5V&D71 z-FJFN_SaeGv?I>M{3Y1$4b|S^*I)7h0srbt^G5)G`&Ahr-VqS~@&S>+3+f^Vpj&}z z`YyhF7dc4X7=q9?gpC|RI7Sor1|@|9U_tX3n*t4{$oy6K*9Y_yt)hmGQ7y8C!6Nb{ zA~~uBY`LG77{5w;R!P0pppOJHB9boT0As9F)yLvW-aOd-t7Xs`<*GWMa`XZRn?;vS zznY0qSST8O(06NlAsa~qM`EnSl1H7t5)BT{1Y-a)z1_rpiZ>CjLmHi#eXyP00&okW z3A=TkXN5iv6+y?aH$1Dw+)s}!n|HiIgiqaMn+wSz5s?6^G~Aj^{8O!0ahr6)I$E`=o^#q+jEOa`gB?sbEPYPPcuos=kL8YWSb+ zbJT=E*LO`YOA*3y)G*Z_S2Mu6zqO)rkjmp^IHg1?RG1>~sD-_0%26}YJ`v{p(= zb+ayHb?2&?+?xKjQs%^WJIS@oR9Ojfv3OR&p)n4U>SCA`y+;HlNyRMqhegKg_L_$e zSB>!MIUUt0uYupHAF4uW&dP=7!&OpAXJ+S819d{8iZGnZZdI2KxW8kmTZ%M9I9#ncc*_L0-sx8Op1w$hW!EA-Wj4`^lnwYyF z8e72ZF4~vOd5;5Anb;?})x;s05GK4&(YCWki0Hes&)7d)+_yhY%zM?a^9PancE7VT zhyM=c4tW19BY-6r`p5moEM*tQHvk#D{Tyl|U;dJ@&F#B5G*a66676jp$(s@iVhN>Cc}*oZx*B1kfP=!$LPgsS6$OW6<4A^(!ZvWu^RJAktaIhQ`3B) zfk#VxN(9Lw5mpmXQ-7ksuob6V?Qv(}cS_e|9B{(SLgE9(U)4G(mt6u}%-A2j37J#@v31+15b zr_ND}fum)-E!J>`sqH-55v&oA3JvWaw$jaN_J>;S(?IyqCp7V_Dvv^~s|0Srz);=U z?zTGzhuzn#ybOa{G{H*Ujnbdv6s)2Q1w$R1k<}7f8;GrG=)ny_PS2Dz0_>9h{oY(x zm(#;B4aJmu)N;HhAp@>^083~$HF|~}4THe@=ng#C2m7C5&*1*|iSNPvM?K&3$E-Yf z+)lSD;7bJn0sI2s-#XZ~lre6iUVxY13Es`^XXWL)29@wejT=pqco7s~d@GT?kU4Hr zhJY!I7XgLq7khszv@O|OqxGWjf}^Q)1KHYS!sAHn(dgNJlW8a>3RKajdb%yNnrkya zHR&d6;MfazY-W>fldbnCAy0w_9yTAg7oWL47C($YSO$9{`-{DVBo4#{|EBq!79V zca6ltX_CJgA&errO85f2i|AjddyjuZda~O0vBNu{$>!{JV#%!Lel>Qvu(=g+wgyXX z-d`gh6Z9-Tz|54QI{%q63MiTJf=e}={Fvb8Lj94{7;ykIux3$P_8--KaAJUlL5~El z({l?kZ6WZS^)dI#!CQGr6TW-0b+c?c4DAAq8m`bsu@Ch4q6DhrlZIGRDY zWYTeFTw@A%fjq3SEWvHe1g`0DurnNiOw$Jk$?l!|cac+tuCI zJimg_?6Col#9tl%(hg(!M9dlq(4?JYuPdZ5dyMRWN=oE=Oa3@9XDH4>Fvm{Z>H9tK zG{lK`X3jv{gnuEDoxT(ISKBk#e=)*@6Z!E6i?5i!{QbnfxB7h#;#>Oy+`noB1ZezI zXuC__85IjvFTZ0Lg5L&TZWeBu49CmwkdV4<#A`Iay^OwR!q^4^Xlw!^X9&~?CdF;^ zLneq@B{GUDnb+KW)F>dT$*6=(K~g*D>KGY_1I_2`ElvkA)WgluXy7PNH=sBgXl_Fw ztI%mJ$BxxxstrF%S-6*S(?GlanUT z`5f(6Dd45ME@uDQ7WNp;E5LrviBCe_BEkh!T)croTd&(Hdl?2O03(Klw59aTWk;~I z1Reeh#&^3BvRc>1GMoWmFxguH#PR|OTTH+xaG4hvuFGLoK3`_YB}uM{%7BZ)IZY*+ zz{E@@Lpr4w?t3%KOJr(b%zfug#6A(tWXEnr8~0=?P|EBfud|!?U{5emr0GF$pTr?{G@R;kz-kVfQQOfr;sY76Vz>gyCCeAgYQL ztxi!9G>D8~%#=7~jAb@GCDKeearVe!Xh6g8Aha*xJTZV^Xblx=xu#SnLrdyc&$I%1 zkYnLw)#hhO(n@59!$+HItrs`=gd3K$MBSkFe%`E>j~<00j45EixDkvoa%(W41Lg}zZqa?fE(95v~m-Pq4WS;I5Z8tFNkoAEeQ{2%uaxU z3g^;Q=3CdNRfGqeUw$7$i_BLH&9pN(MA*W>gqN*3+)9|!@sF)Ac|-E8#vquKzLCyL zI1D&LLwn1SBhTUKcp|2WISD0kYPg?_6#aF_#=+8o2N)JiuoCFnn))>LFss0-;3&AP z0-MWFcWO3IpyYtYLO)&Oh0KNtogxv}oDy?3YPuhMfQo@eGBYQjajz(XGBha$kQo-V zRyyN}{YOAe_-=^coCe3;_g{*aIHw1jHRV_1^+yHT{fFo4-O3Mp-YLA+r~LA-(?#6> z`B4D?0M_sS-B5qteHb`k=BMk)Y67yF^kG3SWL$|)>x)T4PgC@W@D)t#jOa) zKtQ{G90T$$Gz*_V;LUR+?8!JMK;El=7fDPHZHaMHb%R!&dO82KmjW-I;m35fHLF*P z((8skZ|3f8duEVu5z3a%t{nQVaxpixpUbK<{g9>2FWBcWuMlJC!@jT0efAR>@MQ#1 z^SXdbPS`|&S!tG|8Inuh;{+_VO);w2ncZ<*l$~V@w!8!#&^0coLdvEAMKLEFU|{bI z->qe8J(pN&AexZfNtS^3NXUH>vcubMm<3LGrhHIl#*95ui2MB>YGfKNSk^O?hF{zC zg>ymn$ZK_H+(Rqz?y|NDyc-xYUS9)_S|y&bXOW}#8H{aU-zRR0_E!d*kozkmIgvGY z&Az4g9~tANJC?F}#Elx-=pI6AD0km(12py@nA%L&C@kS9eoZvGi}f0#-4t7!nzbTI zm^}_4fGJoC2SvP8k8A;3_hE$woWeg1GGW4C3~^|w!Vg&jL1k1wl9SFU)-12v1}Ra% z4d7%+lGMQVt&0W=0~^Kw_ZkgMwd^6K*mJ7iNY5aH;)5~>byKWvuT4NMPR>}%t$b;Q znr6hf*bXDh(X3|hJUs=vn}>Q&lc*$j;e{uFLPg$e6VOHXX#v7RM!I&+Xb%Nl;>Gep zIJ)QjdjAaRZKGkVfd@RfWrGwM!7#uPde7W9IKrGeY);NfmiI(k8dR(`X$HIx=r#n# z)nx(6T!Wv)ttWCT8r*lG6Erj{?%1WEKzf4W9+A#=H*MG+reI>umKwXz3L4O4djb?o zLX&n}WSqUs$-4We49_Z5$i2NuE$)cDlZ@vMaNOZv>^VV>U34&Q-+vT>W*h#o1BCZK zWu(x+?0=dF!u^kNCh+?rr!0Z_Bhnbq7EBX2 zt%;W&)^`lBPh55`eB%0+(`J^-kKBH@Nk}b`(NM!YMd$^IoKU}Oql4L)LQZ+#A_#Wk z^8^+wrFooQvJp=B9 zZvg&OUAJKG2?dVte{u6*0c7(gj0x4yf5)6dTYx!$n}Cb~R;}PFAh^cvZe`w}6qDID z%s^ux@~C`%C+8SMmm9D!#*#wSxWF0^q+06b3&u4>Zz6QNQFVJOg0~UYKpq^U1PVJ7 zffy+;u;=TG_*y0%-PdwBLq#z%Q{166{imHnn{w+lE&-vf&|*dMGJsHPhZ}%$GfoRB z7`^t!@*S&-JKPkc)!dHG(`z4$7UrvJcyWnX&n94*1T6=QQ|ebCv#a(^!Mn|O=(lD+ z{r`Pb2d*~!|yW5oN9eKgC-uYd0`9ozBz zQLWhh?=tVd2tWSyzxZeb@Pohq_x^G2fBc!-&w*&@`@mqxEm-nCy)e1~F?su4(RPF} zF@`jn?LGy)jAH8!p(g8v1S}Rlh6s&ES*UJ!yifmfm}s6Q>e zLs}+SaDI3AY{KBO2Ofb&Spzg5e$o8Pv41g>$DuA*1wjs;banjhWnXk6^?Dmeb1f1a zI(%!?*2Z+Rp|&ilQCawwS{)lnC)h#0wD+&r#zSV@zB4ioLzRbyEV;6P-9|h-j7Yj| zKWg<{eR~yn7XdHFWX!#j@?iwl8n)wYMaUt8eM!X1-%dR%nL%srag5U5pbWX1+qCgU z>)uMn;6pRtV}(T?I5r}}p<8HO;!-g7jHCtkWxP|qCn2VnTqFJQ$w4ATB`bsO4lMT~Rxq|{9iQ`4c* zw3wl&w$)hvxrYa}Hj(0lBJ}8e6s3GACd*1MtQ@!~^P;6@%L!D@2t|8c zo-1XGfekehDWz>`?z3WnQBX~CIEfT4nTuujn%%GFX98-Se$Yt6x`|qfIDe<5bdyTkk5kJOV42U~9uy9@?N9 za*ooiyP%JT;D~n{`JCIEES{9xL}j@EUJ8J(G-qwUyT-d+hoaLhC5bplkjY57^YM@i za?LtUWBs*;(_iUVd#{*>4`gv(uUdYzanstsD;G^59~eC@kH}U)o>OY3 z-Al5>3yiUs=|xP#sRxxDWV|Gmg|}Tq!t>NHXKfgCZ2!52XzTgzu6;)r2@Pd71KA%iM- zzHa_j8}-yIeru(8Gv_%<8`o7p+xItgRU7w^BGmAFty%@x4kxg3=^LjZL7E6SmLrJj z1gVZ$JsK#IVb8lq+W;54rRNL1E6cLv>i0E-&*d{9HL0aKeJv6o)e%5t+*z8X!;Um) zGz4p-9F~dqskXt&bgzv)6iATW>C_`;r8!vGw*e$w44Iw)5+Q;>dh& zlYS$8XQI!6&@V4PvF-VM>|@|TFV}>t?4XXaHc4~0l^0TDmlQqwI350$`Ba!m6y2e0 zm4n*Nti@RcH8{Z>C?mky)ggT;=L{inB%Y~VQIhF$Q5wQpTD^-|^X=t@+w zf`gU6l));}P33zXih}n0ua7u6(|-YTN{}kbet9gWpj9_EwR*y6$P8ySQqF->Ur*@8B&Ut4OhS8q!eAY zy*}P^AQBfNSl|H~z{h5`tYs=f%jIkBj9x44)~;05eb;6n!k}W2Bc_wgEN6;V6dVcP z?fK!ug1c(k3NY>OSb*9x8EzMDj*9PZ!CJ+e?_-s(DRG`^sB;Yq0HB(>y3C z0s@KA5dGS%XH??HSP*{|1I-<%_|SB*H6tp7p<{Kz@3zAxppR$G1P+$&uKNN z0=dk_%4;NphVNBxWe?=a5^&buh@ye5bR&a3vMB(fw{xXE3sK)3~a zHjt6Y!pRY)SU7~{fLQ}RjUh+T5KAFYWWOxxPP_U*!l=1L&89WlyRYekshzWvp(Ej! z{lF-Ln`O;GP#OnV*9cdKfOZI~b$3_yzo+aRE3dv>Ykn~pQr)%MxV&RSQ=&k$j8XK-%jTYp!Oaglp z)0=Y>$^B2{?WKzBG$S7eKBu)V&kcTh0}#52c{yc%HCON5PUcAn>_vHz^>zH39b)#D z@0IN)G8@e+Nnq{ASk}HR2?Shw2?w*r1T%nkU^->dy#p+!E-?#88 z?TEu^9-NyB{xt#P;U!y5T5l;GIF@^tHO>0*}2(TWeG!&(0N$G%9lr*CcJQ+*?Pmm#9M z<17bXZMoD$hFVQ$lfoWb>HP$pa;K0+W@2TQOmvR4V_|vb?f_miMKO4dcP!Rt#pdkC z?va`|n>&FmO+JknmNH;#i=!FNon=1xD^q^LFFTM4?i z=Uu)ZU8Yd&&DZvJZLb+K1e3A$3FQKbG)CZz)x#lHwp9 zg+mC)1%U&jH??KMgRZ&0L2%aYUv9Tcxo8U0QCznw&c0VgJhnoGqs$-wo&W#< O07-N8b6Mw<&;$V4irxVL literal 0 HcmV?d00001 diff --git a/addons/skin.estuary/media/web/download.png b/addons/skin.estuary/media/web/download.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab251567cfa4a84f11bf1c49c7e6adcb49549e8 GIT binary patch literal 561 zcmV-10?z%3P)u0kS7K8v_w;!Jk3neF_i8)nb9%>3ufo)rjxhxiAW1_X(*%L8d_lI#$p(;Ohk zI$27UW1XN0z%Xy9WHVMRAWDvM$}?FFV3a&=$}{Q}5X44Dw(Kl)0Bh)K!waC@W%r96 z)vgZ+F;9|o1>pgv^Z*u%6$W;+qXV$m!>b;3084mR#vL#qDF=CGX)RgT!Ga_^GyrkQ zd(A0~FzscFk`h1w!C}eVA%a#fhn$fB1VVGRj7=TiQxyQxTry9n7~tmnN&rqyFVo-v z+U9pl-(^wZ7NlYZ3Nbz`6YF!NK=d8 zMEfS&M9{A)74l*iLD0vu=2hQ-U`AE!oU1ay6`wy#&S*w3$g6AkBN`Dz_yFLYa}tF0 zKfEF?nQ}v*+Wug?%%|@QJti8En6g?%Otny}Qow|{9?jz5PxuwHO<;iAqVUJmo9;40 zJpF{fqs@;twwHSVuIccrPj2Cq6Po^iB^VrEj)4iC2~81z00000NkvXXu0mjf9(3%@ literal 0 HcmV?d00001 diff --git a/addons/skin.estuary/media/web/favourites.png b/addons/skin.estuary/media/web/favourites.png new file mode 100644 index 0000000000000000000000000000000000000000..f017a4cbd6775f4d8fd117edd504a31410163713 GIT binary patch literal 821 zcmV-51Iqk~P)He6vdxFAQ1>;1p+aFm_Sq@CMqHj2t)+}fv7+rDsdGR zhzdjnVxj_pn3$-jm_SriOdu*ICJ+b&0>Ss4Gf`R~O?b(2-=FJAew@6MoO|C>O0-aB zUHM!X2e!jG1lPGX@K1YR9(3Xux|lXtD&m^yAP;ZL^lC;A5gV`E&}Xf zK-B`e2(ZTiRf}jlz=i{=7SLXRMHvBlm@sAG5q&mTF_3Urz*k)21{3^F^xo5~N6azB zEjp;Nm{q3{p0J?7!V)vwC(>3{CqZq|GOtqxZM%vU|KL6#*F0CsTf`lnQc9tg^s8!h zMFxi!Irj?@TQtKi_6RWo&nLtfJYNt`;3=gP0&Npy8nC1L$TeLeCYtBCLrgqwa)X#^ z8fG6c^{@^dt9%3FT}LMMhE^IQ>v(n$GxvLD5k=b3ET+9nAtA%?$A%4mgtqd=Up+$pV^~*2qm=SuygWzA(HWY(1i$ z0K7H=IP%!T!akPwu&|GfOSF z3MeE^o>QdY&}`aNq;Npj^{qpL_Ova`jH}LMusfY$bUxL{!0+?#=(PEI_i|59bB?vV z@J3JMQp~i?YnIfQM6zzniM9N2@7d+Q%$uXqKJ7YvruCCk?a4*&RL;K%xsnC$>r?U%=?0f55;5|ANGhNP*c|yEZ#BLnUA=(lJCO zw&Ntoejbo~qw{*_cYW_l$c3}O$P(r_ zH0Ynamh{AscpyxTqnVdLYOt+{2$gX-@({Q-xU%}V)DAzL>2D4Cy!lkJOwnAU7y8GF zL7=eSzTE|bKyEK6nFK_4NyQ+L_ZLY|fqb}Z;VkgdV~$eh{EWhGe9<@{8F=Sh(6{nH z5Xn0c5$@=mnpxYTtK`G=Z<9uRomvu8c(vFHb65k}OF{;v@0Ad2vtTtUV;#3v7a99R uYZ4;J()=2g1=~y9V};9@PZ1Fj%=iJOSq>$vbI4c#0000NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk<`(6g^i5YHsq}UYLfDFaSX}0_x6T;wuqxd!^iUJ zmqp61a|(Tu%=yE1NH!)vwJ@}+VQRw6|0~yR@R{wjf!F1zo2AMe*FJ8KEfbEMQ|k2< zNZEV**`yukcE3Jz?##Rg`$C`fmCuupNti60xol>dO`D!`TgmgO?~Pd#yz1xu{3%fM zlZmPP#f4Ss>jhp+W{i*Mm@RL7jngM>y)2TSnDTG<#@?8~pt`@!%<7;=RjB<~I^8^9mxOH*VDe?oVE8YgP<-Rep`2%o^0MoG&atj7y74D~M@y~&n|jv%I}Nr zb3Sz8Q)5!i$3w}d&nkLy_Nn&i>fLNxzH2^Hv^O|0(X< zByrY1>ujb}7e&{8b~^ScYMz??8v9jgvwr$N6Td6Y{O9b^sQgcyqV(DCY@~pS7(8A5T-G@yGywqChgB~C literal 0 HcmV?d00001 diff --git a/addons/skin.estuary/media/web/menu.png b/addons/skin.estuary/media/web/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..96bd0c4f066cb4b80abe8ec5bcf4b81189a03aa8 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^20-k_!2%=|3hrM3QcOwS?k)`f+xyS#2l6-zJR*x3 z7`TN&n2}-D90{Nxdx@v7EBixsVPSKjIrF+U1BKi?T^vIq4!^yu$ag@2$KhgM!G^cb z?yQk;SfF-b@A6f*T0ST004R= z004l4008;_004mL004C`008P>0026e000+nl3&F}0008sNklc^3Roso^XC1avqaM0XT!uqt$9bOP##yx+s^+pTz<+8Vvv#iUbIP z0KV@ZlH3yqpp-(bRs(EOY6bGQSM!jA?|MkTI#BmJEvbIT59Dp$f z)oK+0UjDNxqySW_RcNidB)^FR$mjE@R4M@Q?9z2X0zkc9hf->jDRn9IhysYB2!%pnK=Mc&fYy2(dWJWCHj4mB zl8htosW<@3var6s4glLTt(J^N-X|n~hyy4T3W%Zz0D3cDFESW;ACvqe4#4v~gkg9> za(AvBLrUb$G(f3TLa|tUM{-{rz(nL7-sbzM2dGpk$mjEYlE>lzCL-_P)?=hS^cZ8d zNq!LrU|AO8I0k_3f32c4hn`X7Jrf5odbB-Pft<*H!}df?;{9;4% zvXi7V@(vd@Ua9~_kGA(o9*6^&^)7E_0pd7@ZQHvfPs9NjV~`{X0K8auoK6Ekk|Z$3 zbV+^{2VmRwIP&)HV*Hf{7~SXFBKcDsz_`sxvUgYKSZRPohn`dcOtv}20bFcziUYXV z<`e~RRhv^3z*TKdF#y-KImG~6*X9%fFs;og0$^I3GxGp9wK+2lkjv%JY&P$0+gm9B zr4(AN797XvO>1*z5K+qmbUdSEA6%0ZLF=W^+`TjYW7&hfBcP&4LFXo zLvnNJ;p;wAUXmn;;}}Y*2P9vuMEbnz6ZpQ5Fbokz5wzA%0X!%9Yh~j1qL%geux%TT zkhDymI|nvsFMCM>c7n+J~Lpkp)hZ(&`|z3AL?&ASlhznb~(ch2ve?>pyw=UyPL zxZ;Xy=}C$Gn07dkiF7zH2|qoGPYEw7gyq)c)Z0PWyHiR#%z3}8K;jutkKQ1hBxTZc->{1nNYQAlKq~w^Z4y$ zpO6`{P9CwDJ^}G4k{`o2n~(njNOC%wCkyEo=JAf}4ZL&tP#DrxIYgPT^}O6A(PBF% z)E1Mp%RtVk4Z^%8Gpw(P><}`u-xy)%Wwk+o)sg|;$?qy;AeQIsn$N^a)e=&kNv81? z2G!k`N5u$|g{*(WL%;L^?!zykpIjqI2GUi_OA}iwDD>krf;iw%Egln)h;TeDGlB$# zF=d*7hzmDl1R2M;YN;>*Nl|}AV?|&V;#OT0lt>>$D}*%(<%!Qa z(^x~d(Ci+wWBBIqrdUt7M!sxyYszXbD<8}e1SYUjQ?ke-X3B2@2Q?TETUg0d!6S{; zY~_RoK{lGYtwc+d>nPAXAHi#Q5kv@ya3Bk%$eE*;X63k<*%Z^I8>fuIY%_PgE8tU_ z*EG+Y!({NNVW%@};xUaS#CEgS)s4J0?}atU`^*ObwrB$To2M3X^{(e9`sinX0S4&j zIEQ(NiGoiDXEXyiywF>I5v#d_RV-xk9M3Q4F!doj7GLbrt;Pd)6e}>zx~w%=@_x%k z9po=`wv0u0K_09qq z-||-nJ-n+EI|<;vjomI-v5TJSAzC4M-btFNV>i!pgyzygmUzIhb-bFD>jFbNOD7%d zAwhG=_HG!Vf!A2tb_?nh``F7KT4|<{U0ZBsIX)$M#4YQ~Z2_p$9Hxr|78bF>&&q3w z`&_p^jXu-$YeZ@J5xekvS$EVMsSoNLuh2#-O;znvJ%?F|5TMR;jK+XjvMDlvy2#Ng z;jM>?&0Qv<^1Q#aqM-6bKSl*_RM~*w@|w}*sNmgFwitU9CZ7xF#{L6>~+#00K zGR@UszE_5@s+S|Q8i(eXV$=u^Qe=x{HN#j$p#h-lN^L5DHu70YcgoKDT^UKs8q@dD zvX&>tut;l60~Jr5l+goS52gzQ;sR0=t?2P`v z8Qs-ViS1T2t)cBk;+6+HX?0jP&qM3IP|a|eS7{){-_{5I>D4o>mRN8>gQ3D3DpocR z-GeITQiiwDWu_dp~1UGHwlNSc6$dHi#T_@SYp3*v-}TG%+eC{B(Wm~XxvOzy#rh! zA6+leMXOl$4lqYHQg<+gTgIr6NycHpI31w?>~LgRks;}i4^ESISTN3k;B-sZIOqUqlj5=8g@zrB z+Lo=P&III{$t}H`HCc4$>F#y$oH5O`(-p{oUB)v6cb?>)I$V5${a%VD*G9m8pW4bU zH&bod=}O|pT$=AQRdp7aG(<8qae!`}s{&y+2Mjb$WSFcD;5ZYc4KosSa!CC?t#^k` z5(a%~CK#{QXZkhe(soOEE8y3CPh&=ozSemy`&BCt0FBV&LML*C_S+{F1EY%gz7ejXb6$8g2-{ti}!gVq1Id6Cl@N| z&v7$Qa2URF7*}EIvZ|42I)<~MzzmikP8Nvr*xS5z@VhBVKZCux0At(L&axA0<58wr|=S=DBNH1i~RT!~CX4zK|8BrP Skin.TimerStart(1110_topbaroverlay) - Window.IsActive(fullscreenvideo) | Window.IsActive(visualisation) + Window.IsActive(fullscreenvideo) | Window.IsActive(visualisation) | Window.IsActive(webbrowserfullscreen) | Window.IsActive(webbrowser) Window.IsActive(seekbar) | Window.IsActive(pvrosdchannels) | Window.IsActive(pvrchannelguide) DepthOSD Animation_TopSlide 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/DialogExtendedProgressBar.xml b/addons/skin.estuary/xml/DialogExtendedProgressBar.xml index 93bb34275598d..333ea2e311e19 100644 --- a/addons/skin.estuary/xml/DialogExtendedProgressBar.xml +++ b/addons/skin.estuary/xml/DialogExtendedProgressBar.xml @@ -10,7 +10,7 @@ 80 0 conditional - conditional + conditional 20 10 diff --git a/addons/skin.estuary/xml/DialogSeekBar.xml b/addons/skin.estuary/xml/DialogSeekBar.xml index 7969f9803d09a..2ab66c4e0c06d 100644 --- a/addons/skin.estuary/xml/DialogSeekBar.xml +++ b/addons/skin.estuary/xml/DialogSeekBar.xml @@ -2,7 +2,7 @@ Player.Seeking | Player.HasPerformedSeek(3) | [Player.Paused + !Player.Caching] | Player.Forwarding | Player.Rewinding | Player.ShowInfo | Window.IsActive(fullscreeninfo) | Player.ShowTime | Window.IsActive(videoosd) | Window.IsActive(musicosd) | Window.IsActive(playerprocessinfo) | !String.IsEmpty(Player.SeekNumeric) | !String.IsEmpty(PVR.ChannelNumberInput) ![Window.IsActive(sliderdialog) | Window.IsActive(pvrosdchannels) | Window.IsActive(pvrchannelguide) | Window.IsActive(pvrguideinfo) | Window.IsActive(1110)] - Window.IsActive(fullscreenvideo) | Window.IsActive(visualisation) + Window.IsActive(fullscreenvideo) | Window.IsActive(visualisation) | Window.IsActive(webbrowserfullscreen) | Window.IsActive(webbrowser) Animation_BottomSlide DepthOSD 0 diff --git a/addons/skin.estuary/xml/DialogVolumeBar.xml b/addons/skin.estuary/xml/DialogVolumeBar.xml index 2ac0aa6e0b205..19037c5db217e 100644 --- a/addons/skin.estuary/xml/DialogVolumeBar.xml +++ b/addons/skin.estuary/xml/DialogVolumeBar.xml @@ -20,7 +20,7 @@ 88 88 osd/buffer-bg.png - Window.IsActive(fullscreenvideo) | Window.IsActive(FullscreenGame) | Window.IsActive(slideshow) + Window.IsActive(fullscreenvideo) | Window.IsActive(FullscreenGame) | Window.IsActive(slideshow) | Window.IsActive(webbrowserfullscreen) | Window.IsActive(webbrowser) 22 diff --git a/addons/skin.estuary/xml/Home.xml b/addons/skin.estuary/xml/Home.xml index 9db8d8990215a..513ae3870151a 100644 --- a/addons/skin.estuary/xml/Home.xml +++ b/addons/skin.estuary/xml/Home.xml @@ -817,6 +817,179 @@ + + String.IsEqual(Container(9000).ListItem.Property(id),web) + + + + + + 0 + 110 + 0 + 363 + 9000 + 9000 + 22200 + 22200 + 500 + horizontal + 30 + left + 22010 + Integer.IsGreater(Container(22100).NumItems,0) | Container(22100).IsUpdating + + + 5 + 60 + + 475 + 268 + dialogs/dialog-bg-nobo.png + overlays/shadow.png + 10 + + + 475 + 268 + + + + + + DepthContentPopout + 5 + 60 + + + + + + + + 475 + 268 + dialogs/dialog-bg-nobo.png + overlays/shadow.png + 10 + + + -4 + -4 + 483 + 276 + colors/grey.png + Animation_FocusTextureFade + + + 475 + 268 + + + + web://sites/running/ + + + + Integer.IsEqual(Container(22100).NumItems,0) + 35 + 80 + + 20 + 40 + center + font35 + text_shadow + + + + + 40 + 40 + 40 + 50 + 9000 + 9000 + 22100 + 22100 + 2 + 500 + 22010 + Integer.IsGreater(Container(22200).NumItems,0) | Container(22200).IsUpdating + + + + + + + + + + + DepthContentPopout + Focus + UnFocus + + + + + + + web://sites/favourites/ + + + + Integer.IsGreater(Container(22100).NumItems,0) + 35 + 410 + + 20 + 40 + center + font35 + text_shadow + + + + + 40 + 40 + 40 + 50 + 9000 + 9000 + 22100 + 22100 + 2 + 500 + 22010 + Integer.IsGreater(Container(22200).NumItems,0) | Container(22200).IsUpdating + + + + + + + + + + + DepthContentPopout + Focus + UnFocus + + + + + + + web://sites/favourites/ + + + + + + DepthContentPanel @@ -996,6 +1169,14 @@ video !Skin.HasSetting(HomeMenuNoVideosButton) + + + ActivateWindow(WebBrowser) + $NUMBER[22000] + icons/sidemenu/internet.png + web + Web.HasAddons + ActivateWindow(favourites) diff --git a/addons/skin.estuary/xml/Includes.xml b/addons/skin.estuary/xml/Includes.xml index 4e1452ddcc47b..0dbcab3d133e6 100644 --- a/addons/skin.estuary/xml/Includes.xml +++ b/addons/skin.estuary/xml/Includes.xml @@ -1196,7 +1196,7 @@ conditional DepthBars WindowClose - WindowOpen + WindowOpen 0 0 diff --git a/addons/skin.estuary/xml/MyWebBrowser.xml b/addons/skin.estuary/xml/MyWebBrowser.xml new file mode 100644 index 0000000000000..78681ad7447c9 --- /dev/null +++ b/addons/skin.estuary/xml/MyWebBrowser.xml @@ -0,0 +1,321 @@ + + + 110 + background + + DefaultBackground + + WindowOpen + WindowClose + + 0 + 150 + + + colors/black.png + + + web browser + 9001 + 121 + 51 + 51 + false + true + browser + FFFFFFFF + + + 645 + 645 + 0 + 16 + web/control_selected.png + Control.HasFocus(2) + + + + + 0 + 0 + 420 + 33 + !String.IsEmpty(WebControl.ToolTip) + + Tooltip + font12 + right + false + web/note_background.png + + + Tooltip string + 360 + font12 + right + true + white + black + + + + + 0 + 150 + 420 + 33 + !String.IsEmpty(WebControl.StatusMessage) + + Status + font12 + false + web/note_background.png + + + Status string + 360 + font12 + true + white + black + + + + + 50 + 9000 + + Back + 80 + 20 + 60 + 60 + 52 + 9002 + WebControlCmd.Message(2,Back) + WebControl.CanGoBack + web/back.png + web/back.png + !WebControl.CanGoBack + web/back.png + web/back.png + center + + + Forward + 80 + 100 + 60 + 60 + 9001 + 110 + WebControlCmd.Message(2,Fwd) + WebControl.CanGoForward + web/forward.png + web/forward.png + !WebControl.CanGoForward + web/forward.png + web/forward.png + + + URL string + SettingsItemCommon + 60 + 170 + 800 + 9002 + 104 + 50 + 9000 + + + Reload + 60 + 60 + 80 + 740 + 110 + 105 + WebControlCmd.Message(2,Reload) + web/update.png + web/update.png + !Control.IsEnabled(104) + web/update.png + + + Favourites + 60 + 60 + 80 + 670 + 104 + 106 + WebControlCmd.Message(2,Favourites) + web/favourites.png + web/favourites.png + + + Home + 60 + 60 + 80 + 600 + 105 + 52 + WebControlCmd.Message(2,Home) + web/home.png + web/home.png + + + + 20 + 80 + 565 + 70 + 5 + 51 + 51 + 50 + 9000 + horizontal + center + + 40 + 60 + web/search.png + web/search.png + + + Search string + 430 + 70 + font12 + 40 + $LOCALIZE[31103] + + + Menu + 30 + 70 + WebControlCmd.Message(2,Settings) + web/menu.png + web/menu.png + + + 40 + 70 + ActivateWindow(WebBrowserFullScreen) + web/fullscreen.png + web/fullscreen.png + + + + 20 + 10 + 1320 + 70 + 0 + 51 + 50 + 51 + 52 + horizontal + + + String.IsEqual(ListItem.Property(type),website) + 10 + + -50 + 480 + 60 + web/buttonside-nofo.png + + + 5 + 5 + 48 + 48 + $INFO[listitem.icon] + + + 60 + 9 + 330 + font13 + center + green + left + ListItem.Label + + + + String.IsEqual(ListItem.Property(type),add) + 10 + + -50 + 100 + 60 + web/buttonside-nofo.png + + + + + + String.IsEqual(ListItem.Property(type),website) + 10 + + -50 + 480 + 60 + web/buttonside-fo.png + + + 5 + 5 + 48 + 48 + $INFO[listitem.icon] + + + 60 + 9 + 330 + font13 + center + green + left + ListItem.Label + + + + String.IsEqual(ListItem.Property(type),add) + 10 + + -50 + 100 + 60 + web/buttonside-fo.png + + + + + + 20 + 500 + 80 + 40 + right + conditional + + OpenClose_Right + + + 15 + 15 + 50 + 50 + $INFO[WebControl.IconURL] + + + + diff --git a/addons/skin.estuary/xml/PlayerControls.xml b/addons/skin.estuary/xml/PlayerControls.xml index bf1aca89f4485..16904fc2309da 100644 --- a/addons/skin.estuary/xml/PlayerControls.xml +++ b/addons/skin.estuary/xml/PlayerControls.xml @@ -1,7 +1,7 @@ 201 - Player.HasMedia + Window.IsActive(PlayerControls) + !Window.IsActive(FullscreenVideo) + !Window.IsActive(FullscreenGame) + !Window.IsActive(Visualisation) + Player.HasMedia + Window.IsActive(PlayerControls) + !Window.IsActive(FullscreenVideo) + !Window.IsActive(FullscreenGame) + !Window.IsActive(Visualisation) + !Window.IsActive(webbrowserfullscreen) + !Window.IsActive(webbrowser) Animation_DialogPopupOpenClose 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/addons/skin.estuary/xml/View_54_InfoWall.xml b/addons/skin.estuary/xml/View_54_InfoWall.xml index f014a5c6d9731..2f19505fcd0e6 100644 --- a/addons/skin.estuary/xml/View_54_InfoWall.xml +++ b/addons/skin.estuary/xml/View_54_InfoWall.xml @@ -43,6 +43,51 @@ + + DefaultFolder.png + false + + + 0 + 300 + 330 + dialogs/dialog-bg-nobo.png + overlays/shadow.png + 20 + + + -4 + -4 + 308 + 338 + colors/grey.png + overlays/shadow.png + 20 + $PARAM[focused] + Animation_FocusTextureFade + + + 20 + 20 + 258 + 258 + $VAR[InfoWallThumbVar] + keep + 20 + + + 0 + 270 + 298 + 20 + 20 + center + center + font12 + + + + DefaultFolder.png $INFO[ListItem.Artist] diff --git a/cmake/FindSWIG.cmake b/cmake/FindSWIG.cmake new file mode 100644 index 0000000000000..fba544baa2979 --- /dev/null +++ b/cmake/FindSWIG.cmake @@ -0,0 +1,29 @@ +#.rst: +# FindSWIG +# -------- +# Finds the SWIG executable +# +# This will define the following variables:: +# +# SWIG_FOUND - system has SWIG +# SWIG_EXECUTABLE - the SWIG executable + +find_program(SWIG_EXECUTABLE NAMES swig4.0 swig3.0 swig2.0 swig + PATH_SUFFIXES swig) +if(SWIG_EXECUTABLE) + execute_process(COMMAND ${SWIG_EXECUTABLE} -swiglib + OUTPUT_VARIABLE SWIG_DIR + ERROR_VARIABLE SWIG_swiglib_error + RESULT_VARIABLE SWIG_swiglib_result) + execute_process(COMMAND ${SWIG_EXECUTABLE} -version + OUTPUT_VARIABLE SWIG_version_output + ERROR_VARIABLE SWIG_version_output + RESULT_VARIABLE SWIG_version_result) + string(REGEX REPLACE ".*SWIG Version[^0-9.]*\([0-9.]+\).*" "\\1" + SWIG_VERSION "${SWIG_version_output}") +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(SWIG + REQUIRED_VARS SWIG_EXECUTABLE SWIG_DIR + VERSION_VAR SWIG_VERSION) diff --git a/cmake/addons/bootstrap/repositories/binary-addons.txt b/cmake/addons/bootstrap/repositories/binary-addons.txt index d286ad7b02a80..c5e0f066fa1c5 100644 --- a/cmake/addons/bootstrap/repositories/binary-addons.txt +++ b/cmake/addons/bootstrap/repositories/binary-addons.txt @@ -1 +1 @@ -binary-addons https://github.com/xbmc/repo-binary-addons.git Nexus +binary-addons https://github.com/AlwinEsch/repo-binary-addons.git master diff --git a/cmake/installdata/common/addons.txt b/cmake/installdata/common/addons.txt index 263e57bb66cbd..b694aa33d6603 100644 --- a/cmake/installdata/common/addons.txt +++ b/cmake/installdata/common/addons.txt @@ -33,6 +33,7 @@ addons/script.module.pil/* addons/script.module.pycryptodome/* addons/service.xbmc.versioncheck/* addons/webinterface.default/* +addons/kodi.web/* addons/xbmc.addon/metadata.xsd addons/xbmc.addon/repository.xsd addons/xbmc.audioencoder/* diff --git a/cmake/modules/UseSWIG.cmake b/cmake/modules/UseSWIG.cmake new file mode 100644 index 0000000000000..b47a8cb055ddc --- /dev/null +++ b/cmake/modules/UseSWIG.cmake @@ -0,0 +1,873 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +UseSWIG +------- + +This file provides support for ``SWIG``. It is assumed that :module:`FindSWIG` +module has already been loaded. + +Defines the following command for use with ``SWIG``: + +.. command:: swig_add_library + + Define swig module with given name and specified language:: + + swig_add_library( + [TYPE ] + LANGUAGE + [NO_PROXY] + [OUTPUT_DIR ] + [OUTFILE_DIR ] + SOURCES ... + ) + + Targets created with the ``swig_add_library`` command have the same + capabilities as targets created with the :command:`add_library` command, so + those targets can be used with any command expecting a target (e.g. + :command:`target_link_libraries`). + + .. note:: + + This command creates a target with the specified ```` when + policy :policy:`CMP0078` is set to ``NEW``. Otherwise, the legacy + behavior will choose a different target name and store it in the + ``SWIG_MODULE__REAL_NAME`` variable. + + .. note:: + + For multi-config generators, this module does not support + configuration-specific files generated by ``SWIG``. All build + configurations must result in the same generated source file. + + .. note:: + + For Make-based generators, ``swig_add_library`` does not track file + dependencies, so depending on the ``_swig_compilation`` custom target + is required for targets which require the ``swig``-generated files to + exist. Other generators may depend on the source files that would be + generated by SWIG. + + ``TYPE`` + ``SHARED``, ``MODULE`` and ``STATIC`` have the same semantic as for the + :command:`add_library` command. If ``USE_BUILD_SHARED_LIBS`` is specified, + the library type will be ``STATIC`` or ``SHARED`` based on whether the + current value of the :variable:`BUILD_SHARED_LIBS` variable is ``ON``. If + no type is specified, ``MODULE`` will be used. + + ``LANGUAGE`` + Specify the target language. + + ``NO_PROXY`` + Prevent the generation of the wrapper layer (swig ``-noproxy`` option). + + ``OUTPUT_DIR`` + Specify where to write the language specific files (swig ``-outdir`` + option). If not given, the ``CMAKE_SWIG_OUTDIR`` variable will be used. + If neither is specified, the default depends on the value of the + ``UseSWIG_MODULE_VERSION`` variable as follows: + + * If ``UseSWIG_MODULE_VERSION`` is 1 or is undefined, output is written to + the :variable:`CMAKE_CURRENT_BINARY_DIR` directory. + * If ``UseSWIG_MODULE_VERSION`` is 2, a dedicated directory will be used. + The path of this directory can be retrieved from the + ``SWIG_SUPPORT_FILES_DIRECTORY`` target property. + + ``OUTFILE_DIR`` + Specify an output directory name where the generated source file will be + placed (swig -o option). If not specified, the ``SWIG_OUTFILE_DIR`` variable + will be used. If neither is specified, ``OUTPUT_DIR`` or + ``CMAKE_SWIG_OUTDIR`` is used instead. + + ``SOURCES`` + List of sources for the library. Files with extension ``.i`` will be + identified as sources for the ``SWIG`` tool. Other files will be handled in + the standard way. This behavior can be overriden by specifying the variable + ``SWIG_SOURCE_FILE_EXTENSIONS``. + + .. note:: + + If ``UseSWIG_MODULE_VERSION`` is set to 2, it is **strongly** recommended + to use a dedicated directory unique to the target when either the + ``OUTPUT_DIR`` option or the ``CMAKE_SWIG_OUTDIR`` variable are specified. + The output directory contents are erased as part of the target build, so + to prevent interference between targets or losing other important files, + each target should have its own dedicated output directory. + +.. command:: swig_link_libraries + + Link libraries to swig module:: + + swig_link_libraries( ...) + + This command has same capabilities as :command:`target_link_libraries` + command. + + .. note:: + + If variable ``UseSWIG_TARGET_NAME_PREFERENCE`` is set to ``STANDARD``, this + command is deprecated and :command:`target_link_libraries` command must be + used instead. + +Source file properties on module files **must** be set before the invocation +of the ``swig_add_library`` command to specify special behavior of SWIG and +ensure generated files will receive the required settings. + +``CPLUSPLUS`` + Call SWIG in c++ mode. For example: + + .. code-block:: cmake + + set_property(SOURCE mymod.i PROPERTY CPLUSPLUS ON) + swig_add_library(mymod LANGUAGE python SOURCES mymod.i) + +``INCLUDE_DIRECTORIES``, ``COMPILE_DEFINITIONS`` and ``COMPILE_OPTIONS`` + Add custom flags to SWIG compiler and have same semantic as properties + :prop_sf:`INCLUDE_DIRECTORIES`, :prop_sf:`COMPILE_DEFINITIONS` and + :prop_sf:`COMPILE_OPTIONS`. + +``USE_TARGET_INCLUDE_DIRECTORIES`` + If set to ``TRUE``, contents of target property + :prop_tgt:`INCLUDE_DIRECTORIES` will be forwarded to ``SWIG`` compiler. + If set to ``FALSE`` target property :prop_tgt:`INCLUDE_DIRECTORIES` will be + ignored. If not set, target property ``SWIG_USE_TARGET_INCLUDE_DIRECTORIES`` + will be considered. + +``GENERATED_INCLUDE_DIRECTORIES``, ``GENERATED_COMPILE_DEFINITIONS`` and ``GENERATED_COMPILE_OPTIONS`` + Add custom flags to the C/C++ generated source. They will fill, respectively, + properties :prop_sf:`INCLUDE_DIRECTORIES`, :prop_sf:`COMPILE_DEFINITIONS` and + :prop_sf:`COMPILE_OPTIONS` of generated C/C++ file. + +``DEPENDS`` + Specify additional dependencies to the source file. + +``SWIG_MODULE_NAME`` + Specify the actual import name of the module in the target language. + This is required if it cannot be scanned automatically from source + or different from the module file basename. For example: + + .. code-block:: cmake + + set_property(SOURCE mymod.i PROPERTY SWIG_MODULE_NAME mymod_realname) + + .. note:: + + If policy :policy:`CMP0086` is set to ``NEW``, ``-module `` + is passed to ``SWIG`` compiler. + +Target library properties can be set to apply same configuration to all SWIG +input files. + +``SWIG_INCLUDE_DIRECTORIES``, ``SWIG_COMPILE_DEFINITIONS`` and ``SWIG_COMPILE_OPTIONS`` + These properties will be applied to all SWIG input files and have same + semantic as target properties :prop_tgt:`INCLUDE_DIRECTORIES`, + :prop_tgt:`COMPILE_DEFINITIONS` and :prop_tgt:`COMPILE_OPTIONS`. + + .. code-block:: cmake + + set (UseSWIG_TARGET_NAME_PREFERENCE STANDARD) + swig_add_library(mymod LANGUAGE python SOURCES mymod.i) + set_property(TARGET mymod PROPERTY SWIG_COMPILE_DEFINITIONS MY_DEF1 MY_DEF2) + set_property(TARGET mymod PROPERTY SWIG_COMPILE_OPTIONS -bla -blb) + +``SWIG_USE_TARGET_INCLUDE_DIRECTORIES`` + If set to ``TRUE``, contents of target property + :prop_tgt:`INCLUDE_DIRECTORIES` will be forwarded to ``SWIG`` compiler. + If set to ``FALSE`` or not defined, target property + :prop_tgt:`INCLUDE_DIRECTORIES` will be ignored. This behavior can be + overridden by specifying source property ``USE_TARGET_INCLUDE_DIRECTORIES``. + +``SWIG_GENERATED_INCLUDE_DIRECTORIES``, ``SWIG_GENERATED_COMPILE_DEFINITIONS`` and ``SWIG_GENERATED_COMPILE_OPTIONS`` + These properties will populate, respectively, properties + :prop_sf:`INCLUDE_DIRECTORIES`, :prop_sf:`COMPILE_DEFINITIONS` and + :prop_sf:`COMPILE_FLAGS` of all generated C/C++ files. + +``SWIG_DEPENDS`` + Add dependencies to all SWIG input files. + +The following target properties are output properties and can be used to get +information about support files generated by ``SWIG`` interface compilation. + +``SWIG_SUPPORT_FILES`` + This output property list of wrapper files generated during SWIG compilation. + + .. code-block:: cmake + + set (UseSWIG_TARGET_NAME_PREFERENCE STANDARD) + swig_add_library(mymod LANGUAGE python SOURCES mymod.i) + get_property(support_files TARGET mymod PROPERTY SWIG_SUPPORT_FILES) + + .. note:: + + Only most principal support files are listed. In case some advanced + features of ``SWIG`` are used (for example ``%template``), associated + support files may not be listed. Prefer to use the + ``SWIG_SUPPORT_FILES_DIRECTORY`` property to handle support files. + +``SWIG_SUPPORT_FILES_DIRECTORY`` + This output property specifies the directory where support files will be + generated. + +Some variables can be set to customize the behavior of ``swig_add_library`` +as well as ``SWIG``: + +``UseSWIG_MODULE_VERSION`` + Specify different behaviors for ``UseSWIG`` module. + + * Set to 1 or undefined: Legacy behavior is applied. + * Set to 2: A new strategy is applied regarding support files: the output + directory of support files is erased before ``SWIG`` interface compilation. + +``CMAKE_SWIG_FLAGS`` + Add flags to all swig calls. + +``CMAKE_SWIG_OUTDIR`` + Specify where to write the language specific files (swig ``-outdir`` option). + +``SWIG_OUTFILE_DIR`` + Specify an output directory name where the generated source file will be + placed. If not specified, ``CMAKE_SWIG_OUTDIR`` is used. + +``SWIG_MODULE__EXTRA_DEPS`` + Specify extra dependencies for the generated module for ````. + +``SWIG_SOURCE_FILE_EXTENSIONS`` + Specify a list of source file extensions to override the default + behavior of considering only ``.i`` files as sources for the ``SWIG`` + tool. For example: + + .. code-block:: cmake + + set(SWIG_SOURCE_FILE_EXTENSIONS ".i" ".swg") +#]=======================================================================] + +cmake_policy(GET CMP0078 target_name_policy) +cmake_policy(GET CMP0086 module_name_policy) + +cmake_policy (VERSION 3.12) +if (target_name_policy) + # respect user choice regarding CMP0078 policy + cmake_policy(SET CMP0078 ${target_name_policy}) +endif() +if (module_name_policy) + # respect user choice regarding CMP0086 policy + cmake_policy(SET CMP0086 ${module_name_policy}) +endif() +unset(target_name_policy) +unset(module_name_policy) + +set(SWIG_CXX_EXTENSION "cxx") +set(SWIG_EXTRA_LIBRARIES "") + +set(SWIG_PYTHON_EXTRA_FILE_EXTENSIONS ".py") +set(SWIG_JAVA_EXTRA_FILE_EXTENSIONS ".java" "JNI.java") +set(SWIG_CSHARP_EXTRA_FILE_EXTENSIONS ".cs" "PINVOKE.cs") + +set(SWIG_MANAGE_SUPPORT_FILES_SCRIPT "${CMAKE_CURRENT_LIST_DIR}/UseSWIG/ManageSupportFiles.cmake") + +## +## PRIVATE functions +## +function (__SWIG_COMPUTE_TIMESTAMP name language infile workingdir __timestamp) + get_filename_component(filename "${infile}" NAME_WE) + set(${__timestamp} + "${workingdir}/${filename}${language}.stamp" PARENT_SCOPE) + # get_filename_component(filename "${infile}" ABSOLUTE) + # string(UUID uuid NAMESPACE 9735D882-D2F8-4E1D-88C9-A0A4F1F6ECA4 + # NAME ${name}-${language}-${filename} TYPE SHA1) + # set(${__timestamp} "${workingdir}/${uuid}.stamp" PARENT_SCOPE) +endfunction() + +# +# For given swig module initialize variables associated with it +# +macro(SWIG_MODULE_INITIALIZE name language) + string(TOUPPER "${language}" SWIG_MODULE_${name}_LANGUAGE) + string(TOLOWER "${language}" SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG) + + if (NOT DEFINED SWIG_MODULE_${name}_NOPROXY) + set (SWIG_MODULE_${name}_NOPROXY FALSE) + endif() + if ("-noproxy" IN_LIST CMAKE_SWIG_FLAGS) + set (SWIG_MODULE_${name}_NOPROXY TRUE) + endif () + + if (SWIG_MODULE_${name}_NOPROXY AND + NOT ("-noproxy" IN_LIST CMAKE_SWIG_FLAGS OR "-noproxy" IN_LIST SWIG_MODULE_${name}_EXTRA_FLAGS)) + list (APPEND SWIG_MODULE_${name}_EXTRA_FLAGS "-noproxy") + endif() + if(SWIG_MODULE_${name}_LANGUAGE STREQUAL "UNKNOWN") + message(FATAL_ERROR "SWIG Error: Language \"${language}\" not found") + elseif(SWIG_MODULE_${name}_LANGUAGE STREQUAL "PERL" AND + NOT "-shadow" IN_LIST SWIG_MODULE_${name}_EXTRA_FLAGS) + list(APPEND SWIG_MODULE_${name}_EXTRA_FLAGS "-shadow") + endif() +endmacro() + +# +# For a given language, input file, and output file, determine extra files that +# will be generated. This is internal swig macro. +# + +function(SWIG_GET_EXTRA_OUTPUT_FILES language outfiles generatedpath infile) + set(files) + get_source_file_property(module_basename + "${infile}" SWIG_MODULE_NAME) + if(NOT module_basename) + + # try to get module name from "%module foo" syntax + if ( EXISTS "${infile}" ) + file ( STRINGS "${infile}" module_basename REGEX "[ ]*%module[ ]*[a-zA-Z0-9_]+.*" ) + endif () + if ( module_basename ) + string ( REGEX REPLACE "[ ]*%module[ ]*([a-zA-Z0-9_]+).*" "\\1" module_basename "${module_basename}" ) + + else () + # try to get module name from "%module (options=...) foo" syntax + if ( EXISTS "${infile}" ) + file ( STRINGS "${infile}" module_basename REGEX "[ ]*%module[ ]*\\(.*\\)[ ]*[a-zA-Z0-9_]+.*" ) + endif () + if ( module_basename ) + string ( REGEX REPLACE "[ ]*%module[ ]*\\(.*\\)[ ]*([a-zA-Z0-9_]+).*" "\\1" module_basename "${module_basename}" ) + + else () + # fallback to file basename + get_filename_component(module_basename "${infile}" NAME_WE) + endif () + endif () + + endif() + foreach(it ${SWIG_${language}_EXTRA_FILE_EXTENSIONS}) + set(extra_file "${generatedpath}/${module_basename}${it}") + if (extra_file MATCHES "\\.cs$" AND CMAKE_CSharp_COMPILER_LOADED) + set_source_files_properties(${extra_file} PROPERTIES LANGUAGE "CSharp") + else() + # Treat extra outputs as plain files regardless of language. + set_source_files_properties(${extra_file} PROPERTIES LANGUAGE "") + endif() + list(APPEND files "${extra_file}") + endforeach() + + if (language STREQUAL "FORTRAN" AND CMAKE_Fortran_COMPILER_LOADED) + # Process possible user-supplied extension in flags (obtained via parent + # scope variable) to determine the source file name. + list(FIND SWIG_COMPILATION_FLAGS "-fext" fext_idx) + if (fext_idx EQUAL -1) + # Default Fortran generated extension + set(fext "f90") + else() + # Get extension from user-provided flag + math(EXPR fext_idx "${fext_idx} + 1") + list(GET SWIG_COMPILATION_FLAGS "${fext_idx}" fext) + endif() + set(extra_file "${generatedpath}/${module_basename}.${fext}") + set_source_files_properties("${extra_file}" PROPERTIES LANGUAGE "Fortran") + list(APPEND files "${extra_file}") + endif() + + set (${outfiles} ${files} PARENT_SCOPE) +endfunction() + +# +# Take swig (*.i) file and add proper custom commands for it +# +function(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile) + get_filename_component(swig_source_file_name_we "${infile}" NAME_WE) + get_source_file_property(swig_source_file_cplusplus "${infile}" CPLUSPLUS) + + # If CMAKE_SWIG_OUTDIR was specified then pass it to -outdir + if(CMAKE_SWIG_OUTDIR) + set(outdir ${CMAKE_SWIG_OUTDIR}) + else() + set(outdir ${CMAKE_CURRENT_BINARY_DIR}) + endif() + + if(SWIG_OUTFILE_DIR) + set(outfiledir ${SWIG_OUTFILE_DIR}) + else() + set(outfiledir ${outdir}) + endif() + + if(SWIG_WORKING_DIR) + set (workingdir "${SWIG_WORKING_DIR}") + else() + set(workingdir "${outdir}") + endif() + + if(SWIG_TARGET_NAME) + set(target_name ${SWIG_TARGET_NAME}) + else() + set(target_name ${name}) + endif() + + set (swig_source_file_flags ${CMAKE_SWIG_FLAGS}) + # handle various swig compile flags properties + get_source_file_property (include_directories "${infile}" INCLUDE_DIRECTORIES) + if (include_directories) + list (APPEND swig_source_file_flags "$<$:-I$-I>>") + endif() + set (property "$") + list (APPEND swig_source_file_flags "$<$:-I$,$-I>>") + set (property "$") + get_source_file_property(use_target_include_dirs "${infile}" USE_TARGET_INCLUDE_DIRECTORIES) + if (use_target_include_dirs) + list (APPEND swig_source_file_flags "$<$:-I$-I>>") + elseif(use_target_include_dirs STREQUAL "NOTFOUND") + # not defined at source level, rely on target level + list (APPEND swig_source_file_flags "$<$>,$>:-I$-I>>") + endif() + + set (property "$") + list (APPEND swig_source_file_flags "$<$:-D$,$-D>>") + get_source_file_property (compile_definitions "${infile}" COMPILE_DEFINITIONS) + if (compile_definitions) + list (APPEND swig_source_file_flags "$<$:-D$-D>>") + endif() + + list (APPEND swig_source_file_flags "$>") + get_source_file_property (compile_options "${infile}" COMPILE_OPTIONS) + if (compile_options) + list (APPEND swig_source_file_flags ${compile_options}) + endif() + + # legacy support + get_source_file_property (swig_flags "${infile}" SWIG_FLAGS) + if (swig_flags) + list (APPEND swig_source_file_flags ${swig_flags}) + endif() + + get_filename_component(swig_source_file_fullname "${infile}" ABSOLUTE) + + if (NOT SWIG_MODULE_${name}_NOPROXY) + set(SWIG_COMPILATION_FLAGS ${swig_source_file_flags}) + SWIG_GET_EXTRA_OUTPUT_FILES(${SWIG_MODULE_${name}_LANGUAGE} + swig_extra_generated_files + "${outdir}" + "${swig_source_file_fullname}") + endif() + set(swig_generated_file_fullname + "${outfiledir}/${swig_source_file_name_we}") + # add the language into the name of the file (i.e. TCL_wrap) + # this allows for the same .i file to be wrapped into different languages + string(APPEND swig_generated_file_fullname + "${SWIG_MODULE_${name}_LANGUAGE}_wrap") + + if(swig_source_file_cplusplus) + string(APPEND swig_generated_file_fullname + ".${SWIG_CXX_EXTENSION}") + else() + string(APPEND swig_generated_file_fullname + ".c") + endif() + + get_directory_property (cmake_include_directories INCLUDE_DIRECTORIES) + list (REMOVE_DUPLICATES cmake_include_directories) + set (swig_include_dirs) + if (cmake_include_directories) + set (swig_include_dirs "$<$:-I$-I>>") + endif() + + set(swig_special_flags) + # default is c, so add c++ flag if it is c++ + if(swig_source_file_cplusplus) + list (APPEND swig_special_flags "-c++") + endif() + + cmake_policy(GET CMP0086 module_name_policy) + if (module_name_policy STREQUAL "NEW") + get_source_file_property(module_name "${infile}" SWIG_MODULE_NAME) + if (module_name) + list (APPEND swig_special_flags "-module" "${module_name}") + endif() + else() + if (NOT module_name_policy) + cmake_policy(GET_WARNING CMP0086 _cmp0086_warning) + message(AUTHOR_WARNING "${_cmp0086_warning}\n") + endif() + endif() + + set (swig_extra_flags) + if(SWIG_MODULE_${name}_LANGUAGE STREQUAL "CSHARP") + if(NOT ("-dllimport" IN_LIST swig_source_file_flags OR "-dllimport" IN_LIST SWIG_MODULE_${name}_EXTRA_FLAGS)) + # This makes sure that the name used in the generated DllImport + # matches the library name created by CMake + list (APPEND SWIG_MODULE_${name}_EXTRA_FLAGS "-dllimport" "$$") + endif() + endif() + if (SWIG_MODULE_${name}_LANGUAGE STREQUAL "PYTHON" AND NOT SWIG_MODULE_${name}_NOPROXY) + if(SWIG_USE_INTERFACE AND + NOT ("-interface" IN_LIST swig_source_file_flags OR "-interface" IN_LIST SWIG_MODULE_${name}_EXTRA_FLAGS)) + # This makes sure that the name used in the proxy code + # matches the library name created by CMake + list (APPEND SWIG_MODULE_${name}_EXTRA_FLAGS "-interface" "$$") + endif() + endif() + list (APPEND swig_extra_flags ${SWIG_MODULE_${name}_EXTRA_FLAGS}) + + # dependencies + set (swig_dependencies ${SWIG_MODULE_${name}_EXTRA_DEPS} $) + get_source_file_property(file_depends "${infile}" DEPENDS) + if (file_depends) + list (APPEND swig_dependencies ${file_depends}) + endif() + + if (UseSWIG_MODULE_VERSION VERSION_GREATER 1) + # as part of custom command, start by removing old generated files + # to ensure obsolete files do not stay + set (swig_file_outdir "${workingdir}/${swig_source_file_name_we}.files") + set (swig_cleanup_command COMMAND "${CMAKE_COMMAND}" "-DSUPPORT_FILES_WORKING_DIRECTORY=${swig_file_outdir}" "-DSUPPORT_FILES_OUTPUT_DIRECTORY=${outdir}" -DACTION=CLEAN -P "${SWIG_MANAGE_SUPPORT_FILES_SCRIPT}") + set (swig_copy_command COMMAND "${CMAKE_COMMAND}" "-DSUPPORT_FILES_WORKING_DIRECTORY=${swig_file_outdir}" "-DSUPPORT_FILES_OUTPUT_DIRECTORY=${outdir}" -DACTION=COPY -P "${SWIG_MANAGE_SUPPORT_FILES_SCRIPT}") + else() + set (swig_file_outdir "${outdir}") + unset (swig_cleanup_command) + unset (swig_copy_command) + endif() + + # IMPLICIT_DEPENDS below can not handle situations where a dependent file is + # removed. We need an extra step with timestamp and custom target, see #16830 + # As this is needed only for Makefile generator do it conditionally + if(CMAKE_GENERATOR MATCHES "Make") + __swig_compute_timestamp(${name} ${SWIG_MODULE_${name}_LANGUAGE} + "${infile}" "${workingdir}" swig_generated_timestamp) + set(swig_custom_output "${swig_generated_timestamp}") + set(swig_custom_products + BYPRODUCTS "${swig_generated_file_fullname}" ${swig_extra_generated_files}) + set(swig_timestamp_command + COMMAND ${CMAKE_COMMAND} -E touch "${swig_generated_timestamp}") + else() + set(swig_custom_output + "${swig_generated_file_fullname}" ${swig_extra_generated_files}) + set(swig_custom_products) + set(swig_timestamp_command) + endif() + add_custom_command( + OUTPUT ${swig_custom_output} + ${swig_custom_products} + ${swig_cleanup_command} + # Let's create the ${outdir} at execution time, in case dir contains $(OutDir) + COMMAND "${CMAKE_COMMAND}" -E make_directory ${outdir} ${outfiledir} + ${swig_timestamp_command} + COMMAND "${CMAKE_COMMAND}" -E env "SWIG_LIB=${SWIG_DIR}" "${SWIG_EXECUTABLE}" + "-${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}" + "${swig_source_file_flags}" + -outdir "${swig_file_outdir}" + ${swig_special_flags} + ${swig_extra_flags} + "${swig_include_dirs}" + -o "${swig_generated_file_fullname}" + "${swig_source_file_fullname}" + ${swig_copy_command} + MAIN_DEPENDENCY "${swig_source_file_fullname}" + DEPENDS ${swig_dependencies} + IMPLICIT_DEPENDS CXX "${swig_source_file_fullname}" + COMMENT "Swig compile ${infile} for ${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}" + COMMAND_EXPAND_LISTS) + set_source_files_properties("${swig_generated_file_fullname}" ${swig_extra_generated_files} + PROPERTIES GENERATED 1) + + ## add all properties for generated file to various properties + get_property (include_directories SOURCE "${infile}" PROPERTY GENERATED_INCLUDE_DIRECTORIES) + set_property (SOURCE "${swig_generated_file_fullname}" PROPERTY INCLUDE_DIRECTORIES ${include_directories} $>) + + get_property (compile_definitions SOURCE "${infile}" PROPERTY GENERATED_COMPILE_DEFINITIONS) + set_property (SOURCE "${swig_generated_file_fullname}" PROPERTY COMPILE_DEFINITIONS $> ${compile_definitions}) + + get_property (compile_options SOURCE "${infile}" PROPERTY GENERATED_COMPILE_OPTIONS) + set_property (SOURCE "${swig_generated_file_fullname}" PROPERTY COMPILE_OPTIONS $> ${compile_options}) + + if (SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG MATCHES "php") + set_property (SOURCE "${swig_generated_file_fullname}" APPEND PROPERTY INCLUDE_DIRECTORIES "${outdir}") + endif() + + set(${outfiles} "${swig_generated_file_fullname}" ${swig_extra_generated_files} PARENT_SCOPE) + + # legacy support + set (swig_generated_file_fullname "${swig_generated_file_fullname}" PARENT_SCOPE) +endfunction() + +# +# Create Swig module +# +macro(SWIG_ADD_MODULE name language) + message(DEPRECATION "SWIG_ADD_MODULE is deprecated. Use SWIG_ADD_LIBRARY instead.") + swig_add_library(${name} + LANGUAGE ${language} + TYPE MODULE + SOURCES ${ARGN}) +endmacro() + + +function(SWIG_ADD_LIBRARY name) + set(options NO_PROXY) + set(oneValueArgs LANGUAGE + TYPE + OUTPUT_DIR + OUTFILE_DIR) + set(multiValueArgs SOURCES) + cmake_parse_arguments(_SAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if (_SAM_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "SWIG_ADD_LIBRARY: ${_SAM_UNPARSED_ARGUMENTS}: unexpected arguments") + endif() + + if(NOT DEFINED _SAM_LANGUAGE) + message(FATAL_ERROR "SWIG_ADD_LIBRARY: Missing LANGUAGE argument") + endif() + + if(NOT DEFINED _SAM_SOURCES) + message(FATAL_ERROR "SWIG_ADD_LIBRARY: Missing SOURCES argument") + endif() + + if(NOT DEFINED _SAM_TYPE) + set(_SAM_TYPE MODULE) + elseif(_SAM_TYPE STREQUAL "USE_BUILD_SHARED_LIBS") + unset(_SAM_TYPE) + endif() + + cmake_policy(GET CMP0078 target_name_policy) + if (target_name_policy STREQUAL "NEW") + set (UseSWIG_TARGET_NAME_PREFERENCE STANDARD) + else() + if (NOT target_name_policy) + cmake_policy(GET_WARNING CMP0078 _cmp0078_warning) + message(AUTHOR_WARNING "${_cmp0078_warning}\n") + endif() + if (NOT DEFINED UseSWIG_TARGET_NAME_PREFERENCE) + set (UseSWIG_TARGET_NAME_PREFERENCE LEGACY) + elseif (NOT UseSWIG_TARGET_NAME_PREFERENCE MATCHES "^(LEGACY|STANDARD)$") + message (FATAL_ERROR "UseSWIG_TARGET_NAME_PREFERENCE: ${UseSWIG_TARGET_NAME_PREFERENCE}: invalid value. 'LEGACY' or 'STANDARD' is expected.") + endif() + endif() + + if (NOT DEFINED UseSWIG_MODULE_VERSION) + set (UseSWIG_MODULE_VERSION 1) + elseif (NOT UseSWIG_MODULE_VERSION MATCHES "^(1|2)$") + message (FATAL_ERROR "UseSWIG_MODULE_VERSION: ${UseSWIG_MODULE_VERSION}: invalid value. 1 or 2 is expected.") + endif() + + set (SWIG_MODULE_${name}_NOPROXY ${_SAM_NO_PROXY}) + swig_module_initialize(${name} ${_SAM_LANGUAGE}) + + # compute real target name. + if (UseSWIG_TARGET_NAME_PREFERENCE STREQUAL "LEGACY" AND + SWIG_MODULE_${name}_LANGUAGE STREQUAL "PYTHON" AND NOT SWIG_MODULE_${name}_NOPROXY) + # swig will produce a module.py containing an 'import _modulename' statement, + # which implies having a corresponding _modulename.so (*NIX), _modulename.pyd (Win32), + # unless the -noproxy flag is used + set(target_name "_${name}") + else() + set(target_name "${name}") + endif() + + if (TARGET ${target_name}) + # a target with same name is already defined. + # call NOW add_library command to raise the most useful error message + add_library(${target_name}) + return() + endif() + + set (workingdir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${target_name}.dir") + # set special variable to pass extra information to command SWIG_ADD_SOURCE_TO_MODULE + # which cannot be changed due to legacy compatibility + set (SWIG_WORKING_DIR "${workingdir}") + set (SWIG_TARGET_NAME "${target_name}") + + set (outputdir "${_SAM_OUTPUT_DIR}") + if (NOT _SAM_OUTPUT_DIR) + if (CMAKE_SWIG_OUTDIR) + set (outputdir "${CMAKE_SWIG_OUTDIR}") + else() + if (UseSWIG_MODULE_VERSION VERSION_GREATER 1) + set (outputdir "${workingdir}/${_SAM_LANGUAGE}.files") + else() + set (outputdir "${CMAKE_CURRENT_BINARY_DIR}") + endif() + endif() + endif() + + set (outfiledir "${_SAM_OUTFILE_DIR}") + if(NOT _SAM_OUTFILE_DIR) + if (SWIG_OUTFILE_DIR) + set (outfiledir "${SWIG_OUTFILE_DIR}") + else() + if (_SAM_OUTPUT_DIR OR CMAKE_SWIG_OUTDIR) + set (outfiledir "${outputdir}") + else() + set (outfiledir "${workingdir}") + endif() + endif() + endif() + # set again, locally, predefined variables to ensure compatibility + # with command SWIG_ADD_SOURCE_TO_MODULE + set(CMAKE_SWIG_OUTDIR "${outputdir}") + set(SWIG_OUTFILE_DIR "${outfiledir}") + + # See if the user has specified source extensions for swig files? + if (NOT DEFINED SWIG_SOURCE_FILE_EXTENSIONS) + # Assume the default (*.i) file extension for Swig source files + set(SWIG_SOURCE_FILE_EXTENSIONS ".i") + endif() + + # Generate a regex out of file extensions. + string(REGEX REPLACE "([$^.*+?|()-])" "\\\\\\1" swig_source_ext_regex "${SWIG_SOURCE_FILE_EXTENSIONS}") + list (JOIN swig_source_ext_regex "|" swig_source_ext_regex) + string (PREPEND swig_source_ext_regex "(") + string (APPEND swig_source_ext_regex ")$") + + set(swig_dot_i_sources ${_SAM_SOURCES}) + list(FILTER swig_dot_i_sources INCLUDE REGEX ${swig_source_ext_regex}) + if (NOT swig_dot_i_sources) + message(FATAL_ERROR "SWIG_ADD_LIBRARY: no SWIG interface files specified") + endif() + set(swig_other_sources ${_SAM_SOURCES}) + list(REMOVE_ITEM swig_other_sources ${swig_dot_i_sources}) + + set(swig_generated_sources) + set(swig_generated_timestamps) + list(LENGTH swig_dot_i_sources swig_sources_count) + if (swig_sources_count GREATER "1") + # option -interface cannot be used + set(SWIG_USE_INTERFACE FALSE) + else() + set(SWIG_USE_INTERFACE TRUE) + endif() + foreach(swig_it IN LISTS swig_dot_i_sources) + SWIG_ADD_SOURCE_TO_MODULE(${name} swig_generated_source "${swig_it}") + list (APPEND swig_generated_sources "${swig_generated_source}") + if(CMAKE_GENERATOR MATCHES "Make") + __swig_compute_timestamp(${name} ${SWIG_MODULE_${name}_LANGUAGE} "${swig_it}" + "${workingdir}" swig_timestamp) + list (APPEND swig_generated_timestamps "${swig_timestamp}") + endif() + endforeach() + set_property (DIRECTORY APPEND PROPERTY + ADDITIONAL_CLEAN_FILES ${swig_generated_sources} ${swig_generated_timestamps}) + if (UseSWIG_MODULE_VERSION VERSION_GREATER 1) + set_property (DIRECTORY APPEND PROPERTY ADDITIONAL_CLEAN_FILES "${outputdir}") + endif() + + add_library(${target_name} + ${_SAM_TYPE} + ${swig_generated_sources} + ${swig_other_sources}) + if(CMAKE_GENERATOR MATCHES "Make") + # see IMPLICIT_DEPENDS above + add_custom_target(${name}_swig_compilation DEPENDS ${swig_generated_timestamps}) + add_dependencies(${target_name} ${name}_swig_compilation) + endif() + if(_SAM_TYPE STREQUAL "MODULE") + set_target_properties(${target_name} PROPERTIES NO_SONAME ON) + endif() + string(TOLOWER "${_SAM_LANGUAGE}" swig_lowercase_language) + if (swig_lowercase_language STREQUAL "octave") + set_target_properties(${target_name} PROPERTIES PREFIX "") + set_target_properties(${target_name} PROPERTIES SUFFIX ".oct") + elseif (swig_lowercase_language STREQUAL "go") + set_target_properties(${target_name} PROPERTIES PREFIX "") + elseif (swig_lowercase_language STREQUAL "java") + # In java you want: + # System.loadLibrary("LIBRARY"); + # then JNI will look for a library whose name is platform dependent, namely + # MacOS : libLIBRARY.jnilib + # Windows: LIBRARY.dll + # Linux : libLIBRARY.so + if (APPLE) + set_target_properties (${target_name} PROPERTIES SUFFIX ".jnilib") + endif() + if ((WIN32 AND MINGW) OR CYGWIN OR CMAKE_SYSTEM_NAME STREQUAL MSYS) + set_target_properties(${target_name} PROPERTIES PREFIX "") + endif() + elseif (swig_lowercase_language STREQUAL "lua") + if(_SAM_TYPE STREQUAL "MODULE") + set_target_properties(${target_name} PROPERTIES PREFIX "") + endif() + elseif (swig_lowercase_language STREQUAL "python") + if (UseSWIG_TARGET_NAME_PREFERENCE STREQUAL "STANDARD" AND NOT SWIG_MODULE_${name}_NOPROXY) + # swig will produce a module.py containing an 'import _modulename' statement, + # which implies having a corresponding _modulename.so (*NIX), _modulename.pyd (Win32), + # unless the -noproxy flag is used + set_target_properties(${target_name} PROPERTIES PREFIX "_") + else() + set_target_properties(${target_name} PROPERTIES PREFIX "") + endif() + # Python extension modules on Windows must have the extension ".pyd" + # instead of ".dll" as of Python 2.5. Older python versions do support + # this suffix. + # http://docs.python.org/whatsnew/ports.html#SECTION0001510000000000000000 + # + # Windows: .dll is no longer supported as a filename extension for extension modules. + # .pyd is now the only filename extension that will be searched for. + # + if(WIN32 AND NOT CYGWIN) + set_target_properties(${target_name} PROPERTIES SUFFIX ".pyd") + endif() + elseif (swig_lowercase_language STREQUAL "r") + set_target_properties(${target_name} PROPERTIES PREFIX "") + elseif (swig_lowercase_language STREQUAL "ruby") + # In ruby you want: + # require 'LIBRARY' + # then ruby will look for a library whose name is platform dependent, namely + # MacOS : LIBRARY.bundle + # Windows: LIBRARY.dll + # Linux : LIBRARY.so + set_target_properties (${target_name} PROPERTIES PREFIX "") + if (APPLE) + set_target_properties (${target_name} PROPERTIES SUFFIX ".bundle") + endif () + elseif (swig_lowercase_language STREQUAL "perl") + # assume empty prefix because we expect the module to be dynamically loaded + set_target_properties (${target_name} PROPERTIES PREFIX "") + if (APPLE) + set_target_properties (${target_name} PROPERTIES SUFFIX ".dylib") + endif () + elseif (swig_lowercase_language STREQUAL "fortran") + # Do *not* override the target's library prefix + else() + # assume empty prefix because we expect the module to be dynamically loaded + set_target_properties (${target_name} PROPERTIES PREFIX "") + endif () + + # target property SWIG_SUPPORT_FILES_DIRECTORY specify output directory of support files + set_property (TARGET ${target_name} PROPERTY SWIG_SUPPORT_FILES_DIRECTORY "${outputdir}") + # target property SWIG_SUPPORT_FILES lists principal proxy support files + if (NOT SWIG_MODULE_${name}_NOPROXY) + string(TOUPPER "${_SAM_LANGUAGE}" swig_uppercase_language) + set(swig_all_support_files) + foreach (swig_it IN LISTS SWIG_${swig_uppercase_language}_EXTRA_FILE_EXTENSIONS) + set (swig_support_files ${swig_generated_sources}) + list (FILTER swig_support_files INCLUDE REGEX ".*${swig_it}$") + list(APPEND swig_all_support_files ${swig_support_files}) + endforeach() + if (swig_all_support_files) + list(REMOVE_DUPLICATES swig_all_support_files) + endif() + set_property (TARGET ${target_name} PROPERTY SWIG_SUPPORT_FILES ${swig_all_support_files}) + endif() + + # to ensure legacy behavior, export some variables + set (SWIG_MODULE_${name}_LANGUAGE "${SWIG_MODULE_${name}_LANGUAGE}" PARENT_SCOPE) + set (SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG "${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}" PARENT_SCOPE) + set (SWIG_MODULE_${name}_REAL_NAME "${target_name}" PARENT_SCOPE) + set (SWIG_MODULE_${name}_NOPROXY "${SWIG_MODULE_${name}_NOPROXY}" PARENT_SCOPE) + set (SWIG_MODULE_${name}_EXTRA_FLAGS "${SWIG_MODULE_${name}_EXTRA_FLAGS}" PARENT_SCOPE) + # the last one is a bit crazy but it is documented, so... + # NOTA: works as expected if only ONE input file is specified + set (swig_generated_file_fullname "${swig_generated_file_fullname}" PARENT_SCOPE) +endfunction() + +# +# Like TARGET_LINK_LIBRARIES but for swig modules +# +function(SWIG_LINK_LIBRARIES name) + if (UseSWIG_TARGET_NAME_PREFERENCE STREQUAL "STANDARD") + message(DEPRECATION "SWIG_LINK_LIBRARIES is deprecated. Use TARGET_LINK_LIBRARIES instead.") + target_link_libraries(${name} ${ARGN}) + else() + if(SWIG_MODULE_${name}_REAL_NAME) + target_link_libraries(${SWIG_MODULE_${name}_REAL_NAME} ${ARGN}) + else() + message(SEND_ERROR "Cannot find Swig library \"${name}\".") + endif() + endif() +endfunction() diff --git a/cmake/modules/UseSWIG/ManageSupportFiles.cmake b/cmake/modules/UseSWIG/ManageSupportFiles.cmake new file mode 100644 index 0000000000000..4a03900b7fc78 --- /dev/null +++ b/cmake/modules/UseSWIG/ManageSupportFiles.cmake @@ -0,0 +1,31 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + + +if (ACTION STREQUAL "CLEAN") + # Collect current list of generated files + file (GLOB files LIST_DIRECTORIES FALSE RELATIVE "${SUPPORT_FILES_WORKING_DIRECTORY}" "${SUPPORT_FILES_WORKING_DIRECTORY}/*") + + if (files) + # clean-up the output directory + ## compute full paths + list (TRANSFORM files PREPEND "${SUPPORT_FILES_OUTPUT_DIRECTORY}/") + ## remove generated files from the output directory + file (REMOVE ${files}) + + # clean-up working directory + file (REMOVE_RECURSE "${SUPPORT_FILES_WORKING_DIRECTORY}") + endif() + + file (MAKE_DIRECTORY "${SUPPORT_FILES_WORKING_DIRECTORY}") +endif() + +if (ACTION STREQUAL "COPY") + # Collect current list of generated files + file (GLOB files LIST_DIRECTORIES FALSE "${SUPPORT_FILES_WORKING_DIRECTORY}/*") + + if (files) + # copy files to the output directory + file (COPY ${files} DESTINATION "${SUPPORT_FILES_OUTPUT_DIRECTORY}") + endif() +endif() diff --git a/cmake/modules/buildtools/FindSWIG.cmake b/cmake/modules/buildtools/FindSWIG.cmake index fba544baa2979..3a7584b6303a4 100644 --- a/cmake/modules/buildtools/FindSWIG.cmake +++ b/cmake/modules/buildtools/FindSWIG.cmake @@ -1,29 +1,110 @@ -#.rst: -# FindSWIG -# -------- -# Finds the SWIG executable -# -# This will define the following variables:: -# -# SWIG_FOUND - system has SWIG -# SWIG_EXECUTABLE - the SWIG executable - -find_program(SWIG_EXECUTABLE NAMES swig4.0 swig3.0 swig2.0 swig - PATH_SUFFIXES swig) +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindSWIG +-------- + +Find the Simplified Wrapper and Interface Generator (SWIG_) executable. + + +This module finds an installed SWIG and determines its version. If a +``COMPONENTS`` or ``OPTIONAL_COMPONENTS`` argument is given to ``find_package``, +it will also determine supported target languages. The module sents the +following variables: + +``SWIG_FOUND`` + Whether SWIG and any required components were found on the system. +``SWIG_EXECUTABLE`` + Path to the SWIG executable. +``SWIG_DIR`` + Path to the installed SWIG ``Lib`` directory (result of ``swig -swiglib``). +``SWIG_VERSION`` + SWIG executable version (result of ``swig -version``). +``SWIG__FOUND`` + If ``COMPONENTS`` or ``OPTIONAL_COMPONENTS`` are requested, each available + target language ```` (lowercase) will be set to TRUE. + +Any ``COMPONENTS`` given to ``find_package`` should be the names of supported +target languages as provided to the LANGUAGE argument of ``swig_add_library``, +such as ``python`` or ``perl5``. Language names *must* be lowercase. + +All information is collected from the ``SWIG_EXECUTABLE``, so the version +to be found can be changed from the command line by means of setting +``SWIG_EXECUTABLE``. + +Example usage requiring SWIG 4.0 or higher and Python language support, with +optional Fortran support: + +.. code-block:: cmake + + find_package(SWIG 4.0 COMPONENTS python OPTIONAL_COMPONENTS fortran) + if(SWIG_FOUND) + message("SWIG found: ${SWIG_EXECUTABLE}") + if(NOT SWIG_fortran_FOUND) + message(WARNING "SWIG Fortran bindings cannot be generated") + endif() + endif() + +.. _`SWIG`: http://swig.org + +#]=======================================================================] + +find_program(SWIG_EXECUTABLE NAMES swig4.0 swig3.0 swig2.0 swig) + if(SWIG_EXECUTABLE) execute_process(COMMAND ${SWIG_EXECUTABLE} -swiglib - OUTPUT_VARIABLE SWIG_DIR + OUTPUT_VARIABLE SWIG_swiglib_output ERROR_VARIABLE SWIG_swiglib_error RESULT_VARIABLE SWIG_swiglib_result) - execute_process(COMMAND ${SWIG_EXECUTABLE} -version - OUTPUT_VARIABLE SWIG_version_output - ERROR_VARIABLE SWIG_version_output - RESULT_VARIABLE SWIG_version_result) - string(REGEX REPLACE ".*SWIG Version[^0-9.]*\([0-9.]+\).*" "\\1" - SWIG_VERSION "${SWIG_version_output}") + + if(SWIG_swiglib_result) + if(SWIG_FIND_REQUIRED) + message(SEND_ERROR "Command \"${SWIG_EXECUTABLE} -swiglib\" failed with output:\n${SWIG_swiglib_error}") + else() + message(STATUS "Command \"${SWIG_EXECUTABLE} -swiglib\" failed with output:\n${SWIG_swiglib_error}") + endif() + else() + string(REGEX REPLACE "[\n\r]+" ";" SWIG_swiglib_output ${SWIG_swiglib_output}) + find_path(SWIG_DIR swig.swg PATHS ${SWIG_swiglib_output} NO_CMAKE_FIND_ROOT_PATH) + if(SWIG_DIR) + set(SWIG_USE_FILE ${CMAKE_CURRENT_LIST_DIR}/UseSWIG.cmake) + execute_process(COMMAND ${SWIG_EXECUTABLE} -version + OUTPUT_VARIABLE SWIG_version_output + ERROR_VARIABLE SWIG_version_output + RESULT_VARIABLE SWIG_version_result) + if(SWIG_version_result) + message(SEND_ERROR "Command \"${SWIG_EXECUTABLE} -version\" failed with output:\n${SWIG_version_output}") + else() + string(REGEX REPLACE ".*SWIG Version[^0-9.]*\([0-9.]+\).*" "\\1" + SWIG_version_output "${SWIG_version_output}") + set(SWIG_VERSION ${SWIG_version_output} CACHE STRING "Swig version" FORCE) + endif() + endif() + endif() + + if(SWIG_FIND_COMPONENTS) + execute_process(COMMAND ${SWIG_EXECUTABLE} -help + OUTPUT_VARIABLE SWIG_swighelp_output + ERROR_VARIABLE SWIG_swighelp_error + RESULT_VARIABLE SWIG_swighelp_result) + if(SWIG_swighelp_result) + message(SEND_ERROR "Command \"${SWIG_EXECUTABLE} -help\" failed with output:\n${SWIG_swiglib_error}") + else() + string(REPLACE "\n" ";" SWIG_swighelp_output "${SWIG_swighelp_output}") + foreach(SWIG_line IN LISTS SWIG_swighelp_output) + if(SWIG_line MATCHES "-([A-Za-z0-9_]+) +- *Generate.*wrappers") + set(SWIG_${CMAKE_MATCH_1}_FOUND TRUE) + endif() + endforeach() + endif() + endif() endif() include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(SWIG - REQUIRED_VARS SWIG_EXECUTABLE SWIG_DIR - VERSION_VAR SWIG_VERSION) +find_package_handle_standard_args( + SWIG HANDLE_COMPONENTS + REQUIRED_VARS SWIG_EXECUTABLE SWIG_DIR + VERSION_VAR SWIG_VERSION) + +mark_as_advanced(SWIG_DIR SWIG_VERSION SWIG_EXECUTABLE) diff --git a/cmake/scripts/common/AddonHelpers.cmake b/cmake/scripts/common/AddonHelpers.cmake index c541ad702e77c..c345ea58aedea 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}}) @@ -273,7 +267,7 @@ macro (build_addon target prefix libs) COMPONENT ${target}-${${prefix}_VERSION}-${PLATFORM_TAG}) endif() if(${prefix}_ADDITIONAL_BINARY) - install(FILES ${${prefix}_ADDITIONAL_BINARY} DESTINATION ${target} + install(PROGRAMS ${${prefix}_ADDITIONAL_BINARY} DESTINATION ${target} COMPONENT ${target}-${${prefix}_VERSION}-${PLATFORM_TAG}) endif() if(${prefix}_ADDITIONAL_BINARY_EXE) @@ -305,7 +299,7 @@ macro (build_addon target prefix libs) COMPONENT ${target}-${${prefix}_VERSION}-${PLATFORM_TAG}) endif() if(${prefix}_ADDITIONAL_BINARY) - install(FILES ${${prefix}_ADDITIONAL_BINARY} DESTINATION ${target} + install(PROGRAMS ${${prefix}_ADDITIONAL_BINARY} DESTINATION ${target} COMPONENT ${target}-${${prefix}_VERSION}-${PLATFORM_TAG}) endif() if(${prefix}_ADDITIONAL_BINARY_EXE) @@ -361,7 +355,7 @@ macro (build_addon target prefix libs) install(DIRECTORY ${${prefix}_CUSTOM_DATA} DESTINATION ${CMAKE_INSTALL_DATADIR}/addons/${target}/resources) endif() if(${prefix}_ADDITIONAL_BINARY) - install(FILES ${${prefix}_ADDITIONAL_BINARY} DESTINATION ${CMAKE_INSTALL_LIBDIR}/addons/${target}) + install(PROGRAMS ${${prefix}_ADDITIONAL_BINARY} DESTINATION ${CMAKE_INSTALL_LIBDIR}/addons/${target}) endif() if(${prefix}_ADDITIONAL_BINARY_EXE) install(PROGRAMS ${${prefix}_ADDITIONAL_BINARY_EXE} DESTINATION ${CMAKE_INSTALL_LIBDIR}/addons/${target}) diff --git a/cmake/scripts/common/HandleDepends.cmake b/cmake/scripts/common/HandleDepends.cmake index dc022bab64108..2db266acb19ea 100644 --- a/cmake/scripts/common/HandleDepends.cmake +++ b/cmake/scripts/common/HandleDepends.cmake @@ -179,7 +179,7 @@ function(add_addon_depends addon searchpath) "${extraflags}" -P ${PROJECT_SOURCE_DIR}/install.cmake) elseif(EXISTS ${dir}/noinstall.txt) - set(INSTALL_COMMAND INSTALL_COMMAND "") + set(INSTALL_COMMAND INSTALL_COMMAND ${CMAKE_COMMAND} -E true) endif() # check if there's a platform-specific or generic deps.txt containing dependencies on other libraries diff --git a/cmake/scripts/common/Macros.cmake b/cmake/scripts/common/Macros.cmake index 49198a1c437c9..2de421f53aeb9 100644 --- a/cmake/scripts/common/Macros.cmake +++ b/cmake/scripts/common/Macros.cmake @@ -717,15 +717,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_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_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() + 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) @@ -785,5 +821,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 848723af1fa50..0d9519cd9330c 100644 --- a/cmake/scripts/linux/ArchSetup.cmake +++ b/cmake/scripts/linux/ArchSetup.cmake @@ -202,3 +202,6 @@ endif() # Atomic library list(APPEND PLATFORM_REQUIRED_DEPS Atomic) + +# 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 index ba39702d99038..c626a06e86146 100644 --- a/cmake/treedata/common/addon_dev_kit.txt +++ b/cmake/treedata/common/addon_dev_kit.txt @@ -3,6 +3,7 @@ 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/platform addons_kodi-dev-kit_include_kodi_c-api_platform xbmc/addons/kodi-dev-kit/include/kodi/c-api/platform/android addons_kodi-dev-kit_include_kodi_c-api_platform_android xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance addons_kodi-dev-kit_include_kodi_c-api_addon-instance @@ -24,3 +25,6 @@ xbmc/addons/kodi-dev-kit/include/kodi/gui/controls addons_kodi-dev-kit_include_k xbmc/addons/kodi-dev-kit/include/kodi/gui/input addons_kodi-dev-kit_include_kodi_gui_input 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! +xbmc/addons/kodi-dev-kit/src/addon_runner addon_runner # 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..0245bf040fe3e --- /dev/null +++ b/cmake/treedata/common/addon_interface.txt @@ -0,0 +1,14 @@ +# 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/renderer addons_interface_renderer +xbmc/addons/interface/gui addons_interface_gui +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 006c7ab4f7716..0ce81c68e471d 100644 --- a/cmake/treedata/common/subdirs.txt +++ b/cmake/treedata/common/subdirs.txt @@ -1,13 +1,8 @@ xbmc xbmc xbmc/addons addons xbmc/addons/addoninfo addons_addoninfo -xbmc/addons/binary-addons addons_binary-addons xbmc/addons/gui addons_gui xbmc/addons/gui/skin addons_gui_skin -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/settings addons_settings xbmc/application application xbmc/commons commons @@ -42,5 +37,8 @@ xbmc/threads threads xbmc/utils utils xbmc/view view xbmc/weather weather +xbmc/web webaddons +xbmc/web/dialogs webaddons_dialogs +xbmc/web/windows webaddons_windows xbmc/windowing windowing xbmc/windows windows diff --git a/kodiInstance b/kodiInstance new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/system/addon-manifest.xml b/system/addon-manifest.xml index 7df13a6d6f5ad..fcb27a349bac0 100644 --- a/system/addon-manifest.xml +++ b/system/addon-manifest.xml @@ -5,24 +5,7 @@ game.controller.keyboard game.controller.mouse game.controller.snes - kodi.binary.global.audioengine - kodi.binary.global.filesystem - kodi.binary.global.general - kodi.binary.global.gui - kodi.binary.global.main - kodi.binary.global.network - 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/system/keymaps/Keymap.xml b/system/keymaps/Keymap.xml new file mode 100644 index 0000000000000..7765e9d87b691 --- /dev/null +++ b/system/keymaps/Keymap.xml @@ -0,0 +1,12 @@ + + + + + ActivateWindow(WebBrowserFullScreen) + ActivateWindow(WebBrowser) + XBMC.ReloadSkin() + Skin.ToggleSetting(DebugGrid) + Notification(Testing 123,Hello world) + + + diff --git a/system/keymaps/keyboard.xml b/system/keymaps/keyboard.xml index 1c64413d7c16b..7dc71b617c968 100644 --- a/system/keymaps/keyboard.xml +++ b/system/keymaps/keyboard.xml @@ -828,4 +828,18 @@ ToggleFont + + + ZoomIn + ZoomOut + ActivateWindow(Home) + + + + + ZoomIn + ZoomOut + PreviousMenu + + diff --git a/system/shaders/GL/1.2/gl_shader_frag_addon_backend.glsl b/system/shaders/GL/1.2/gl_shader_frag_addon_backend.glsl new file mode 100644 index 0000000000000..c4499623256e5 --- /dev/null +++ b/system/shaders/GL/1.2/gl_shader_frag_addon_backend.glsl @@ -0,0 +1,15 @@ +// uniforms +uniform sampler2D u_sampler; +uniform bool u_clearColor; +uniform vec4 u_backgroundColor; + +// varyings +varying vec2 v_coord; + +void main() +{ + if (u_clearColor) + gl_FragColor = u_backgroundColor; + else + gl_FragColor = vec4(texture2D(u_sampler, v_coord)); +} diff --git a/system/shaders/GL/1.2/gl_shader_vert_addon_backend.glsl b/system/shaders/GL/1.2/gl_shader_vert_addon_backend.glsl new file mode 100644 index 0000000000000..3e3bcd354a6bc --- /dev/null +++ b/system/shaders/GL/1.2/gl_shader_vert_addon_backend.glsl @@ -0,0 +1,15 @@ +// uniforms +uniform mat4 u_modelProjMatrix; + +// attributes +attribute vec4 a_position; +attribute vec2 a_coord; + +// varyings +varying vec2 v_coord; + +void main() +{ + gl_Position = u_modelProjMatrix * a_position; + v_coord = a_coord; +} diff --git a/system/shaders/GL/1.5/gl_shader_frag_addon_backend.glsl b/system/shaders/GL/1.5/gl_shader_frag_addon_backend.glsl new file mode 100644 index 0000000000000..566b70bcd5489 --- /dev/null +++ b/system/shaders/GL/1.5/gl_shader_frag_addon_backend.glsl @@ -0,0 +1,12 @@ +#version 150 + +out vec4 FragColor; + +in vec2 TexCoords; + +uniform sampler2D Texture1; + +void main() +{ + FragColor = texture(Texture1, TexCoords); +} diff --git a/system/shaders/GL/1.5/gl_shader_vert_addon_backend.glsl b/system/shaders/GL/1.5/gl_shader_vert_addon_backend.glsl new file mode 100644 index 0000000000000..704d4e929e3fd --- /dev/null +++ b/system/shaders/GL/1.5/gl_shader_vert_addon_backend.glsl @@ -0,0 +1,12 @@ +#version 150 + +in vec3 aPos; +in vec2 aTexCoords; + +out vec2 TexCoords; + +void main() +{ + TexCoords = aTexCoords; + gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); +} diff --git a/system/shaders/GLES/2.0/gles_shader_frag_addon_backend.glsl b/system/shaders/GLES/2.0/gles_shader_frag_addon_backend.glsl new file mode 100644 index 0000000000000..4d9c2ae84eb40 --- /dev/null +++ b/system/shaders/GLES/2.0/gles_shader_frag_addon_backend.glsl @@ -0,0 +1,17 @@ +#version 100 + +// uniforms +uniform sampler2D u_sampler; +uniform bool u_clearColor; +uniform vec4 u_backgroundColor; + +// varyings +varying vec2 v_coord; + +void main() +{ + if (u_clearColor) + gl_FragColor = u_backgroundColor; + else + gl_FragColor = vec4(texture2D(u_sampler, v_coord)); +} diff --git a/system/shaders/GLES/2.0/gles_shader_vert_addon_backend.glsl b/system/shaders/GLES/2.0/gles_shader_vert_addon_backend.glsl new file mode 100644 index 0000000000000..4b31d68db6e07 --- /dev/null +++ b/system/shaders/GLES/2.0/gles_shader_vert_addon_backend.glsl @@ -0,0 +1,17 @@ +#version 100 + +// uniforms +uniform mat4 u_modelProjMatrix; + +// attributes +attribute vec4 a_position; +attribute vec2 a_coord; + +// varyings +varying vec2 v_coord; + +void main() +{ + gl_Position = u_modelProjMatrix * a_position; + v_coord = a_coord; +} diff --git a/toKodi- b/toKodi- new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/xbmc/AppParamParser.cpp b/xbmc/AppParamParser.cpp index 66b1324aba1a2..696808d34a5ab 100644 --- a/xbmc/AppParamParser.cpp +++ b/xbmc/AppParamParser.cpp @@ -40,6 +40,8 @@ constexpr const char* helpText = --debug Enable debug logging --version Print version information --test Enable test mode. [FILE] required. + -ns or --nosandbox If set, do not run the installed addons in independent processes. They are then + performed within Kodi itself. --settings= Loads specified file after advancedsettings.xml replacing any settings specified specified file must exist in special://xbmc/system/ )"""; @@ -92,6 +94,8 @@ void CAppParamParser::ParseArg(const std::string &arg) { if (arg == "-fs" || arg == "--fullscreen") m_params->SetStartFullScreen(true); + else if (arg == "-ns" || arg == "--nosandbox") + m_params->SetNoSandbox(true); else if (arg == "-h" || arg == "--help") { DisplayHelp(); diff --git a/xbmc/AppParams.h b/xbmc/AppParams.h index 4452cd7383d8b..25dfcda338c62 100644 --- a/xbmc/AppParams.h +++ b/xbmc/AppParams.h @@ -28,6 +28,9 @@ class CAppParams bool IsStartFullScreen() const { return m_startFullScreen; } void SetStartFullScreen(bool startFullScreen) { m_startFullScreen = startFullScreen; } + bool IsNoSandbox() const { return m_noSandbox; } + void SetNoSandbox(bool noSandbox) { m_noSandbox = noSandbox; } + bool IsStandAlone() const { return m_standAlone; } void SetStandAlone(bool standAlone) { m_standAlone = standAlone; } @@ -74,6 +77,11 @@ class CAppParams int m_logLevel{LOG_LEVEL_NORMAL}; bool m_startFullScreen{false}; +#ifndef KODI_INHIBIT_SHARED + bool m_noSandbox{false}; +#else + bool m_noSandbox{true}; +#endif bool m_standAlone{false}; bool m_platformDirectories{true}; bool m_testmode{false}; diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp index d053d60cdd1cb..2dbc6617bf8e8 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp @@ -19,6 +19,7 @@ #include "Util.h" #include "addons/Skin.h" #include "addons/VFSEntry.h" +#include "addons/interface/Controller.h" #include "cores/AudioEngine/Engines/ActiveAE/ActiveAE.h" #include "cores/IPlayer.h" #include "cores/playercorefactory/PlayerCoreFactory.h" @@ -137,14 +138,16 @@ #include "pvr/PVRManager.h" #include "pvr/guilib/PVRGUIActions.h" -#include "dialogs/GUIDialogCache.h" -#include "utils/URIUtils.h" -#include "utils/XMLUtils.h" +#include "CompileInfo.h" #include "addons/AddonInstaller.h" #include "addons/AddonManager.h" #include "addons/RepositoryUpdater.h" +#include "dialogs/GUIDialogCache.h" #include "music/tags/MusicInfoTag.h" -#include "CompileInfo.h" +#include "utils/URIUtils.h" +#include "utils/XMLUtils.h" +#include "video/dialogs/GUIDialogFullScreenInfo.h" +#include "web/WebManager.h" #ifdef TARGET_WINDOWS #include "win32util.h" @@ -2001,6 +2004,9 @@ bool CApplication::Stop(int exitCode) bool success = true; + CLog::Log(LOGINFO, "Stopping webbrowser"); + CServiceBroker::GetWEBManager().Deinit(); + CLog::Log(LOGINFO, "Stopping player"); m_appPlayer.ClosePlayer(); @@ -2871,14 +2877,17 @@ bool CApplication::ExecuteXBMCAction(std::string actionStr, const CGUIListItemPt return true; } CFileItem item(actionStr, false); + if (item.IsWeb()) + { + CServiceBroker::GetWEBManager().ExecuteItem(item); + } #ifdef HAS_PYTHON - if (item.IsPythonScript()) + else if (item.IsPythonScript()) { // a python script CScriptInvocationManager::GetInstance().ExecuteAsync(item.GetPath()); } - else #endif - if (item.IsAudio() || item.IsVideo() || item.IsGame()) + else if (item.IsAudio() || item.IsVideo() || item.IsGame()) { // an audio or video file PlayFile(item, ""); } @@ -2997,6 +3006,15 @@ void CApplication::Process() m_frameMoveGuard.lock(); } + // The Chromium-based web browser addon needs the main thread in all + // circumstances, without massive error messages and uncontrollable + // crashes. Furthermore, processing the render information between + // different threads causes further problems. + // + // Unfortunately, this is due to the Chromium system, which was not + // constructed directly as a library, but as an independent exe. + CServiceBroker::GetWEBManager().MainLoop(); + // process messages, even if a movie is playing CServiceBroker::GetAppMessenger()->ProcessMessages(); if (m_bStop) return; //we're done, everything has been unloaded diff --git a/xbmc/DatabaseManager.cpp b/xbmc/DatabaseManager.cpp index 5398ff3175e88..ce68eadc498b3 100644 --- a/xbmc/DatabaseManager.cpp +++ b/xbmc/DatabaseManager.cpp @@ -19,6 +19,7 @@ #include "utils/log.h" #include "video/VideoDatabase.h" #include "view/ViewDatabase.h" +#include "web/WebDatabase.h" #include @@ -56,6 +57,10 @@ void CDatabaseManager::Initialize() { CVideoDatabase db; UpdateDatabase(db, &advancedSettings->m_databaseVideo); } { CPVRDatabase db; UpdateDatabase(db, &advancedSettings->m_databaseTV); } { CPVREpgDatabase db; UpdateDatabase(db, &advancedSettings->m_databaseEpg); } + { + KODI::WEB::CWebDatabase db; + UpdateDatabase(db, &advancedSettings->m_databaseWeb); + } CLog::Log(LOGDEBUG, "{}, updating databases... DONE", __FUNCTION__); diff --git a/xbmc/FileItem.cpp b/xbmc/FileItem.cpp index 4afeb5f84de49..128867fb37bf9 100644 --- a/xbmc/FileItem.cpp +++ b/xbmc/FileItem.cpp @@ -1126,7 +1126,7 @@ bool CFileItem::IsFileFolder(EFileFolderType types) const return true; } - if (CServiceBroker::IsBinaryAddonCacheUp() && + if (CServiceBroker::IsAddonInterfaceUp() && IsType(CServiceBroker::GetFileExtensionProvider().GetFileFolderExtensions().c_str()) && CServiceBroker::GetFileExtensionProvider().CanOperateExtension(m_strPath)) return true; @@ -1258,6 +1258,11 @@ bool CFileItem::IsAndroidApp() const return URIUtils::IsAndroidApp(m_strPath); } +bool CFileItem::IsWeb() const +{ + return URIUtils::IsWeb(m_strPath); +} + bool CFileItem::IsStack() const { return URIUtils::IsStack(m_strPath); diff --git a/xbmc/FileItem.h b/xbmc/FileItem.h index 881eb05b01fc3..2b861e097465a 100644 --- a/xbmc/FileItem.h +++ b/xbmc/FileItem.h @@ -255,6 +255,7 @@ class CFileItem : bool IsLiveTV() const; bool IsRSS() const; bool IsAndroidApp() const; + bool IsWeb() const; void RemoveExtension(); void CleanString(); diff --git a/xbmc/GUIInfoManager.cpp b/xbmc/GUIInfoManager.cpp index 2a2706ae90e9e..729e475989455 100644 --- a/xbmc/GUIInfoManager.cpp +++ b/xbmc/GUIInfoManager.cpp @@ -1291,6 +1291,12 @@ const infomap weather[] = {{ "isfetched", WEATHER_IS_FETCHED }, /// @return **True** if Kodi is running in standalone mode. ///

/// } +/// \table_row3{ `System.IsNoSandbox`, +/// \anchor System_IsNoSandbox +/// _boolean_, +/// @return **True** if do not run the installed addons in independent processes. +///

+/// } /// \table_row3{ `System.IsFullscreen`, /// \anchor System_IsFullscreen /// _boolean_, @@ -1884,6 +1890,7 @@ const infomap system_labels[] = { {"ismaster", SYSTEM_ISMASTER}, {"isfullscreen", SYSTEM_ISFULLSCREEN}, {"isstandalone", SYSTEM_ISSTANDALONE}, + {"isnosandbox", SYSTEM_ISNOSANDBOX}, {"loggedon", SYSTEM_LOGGEDON}, {"showexitbutton", SYSTEM_SHOW_EXIT_BUTTON}, {"canpowerdown", SYSTEM_CAN_POWERDOWN}, @@ -4697,12 +4704,20 @@ const infomap container_str[] = {{ "property", CONTAINER_PROPERTY }, /// @skinning_v19 **[New Boolean Condition]** \link ListItem_Property_AddonIsUpdate `ListItem.Property(Addon.IsUpdate)`\endlink ///

/// } +/// \table_row3{ `ListItem.Property(Addon.ProgrammingLanguage)`, +/// \anchor ListItem_Property_AddonProgrammingLanguage +/// _string_, +/// @return The programming language of the selected add-on. +///


+/// @skinning_v19 **[New Infolabel]** \link ListItem_Property_ProgrammingLanguage `ListItem.Property(Addon.ProgrammingLanguage)`\endlink +///

+/// } /// \table_row3{ `ListItem.Property(Addon.ValidUpdateOrigin)`, /// \anchor ListItem_Property_ValidUpdateOrigin /// _string_, /// @return The origin string of a valid update for the addon. Empty string if there is no valid update available. ///


-/// @skinning_v19 **[New Infolabel]** \link ListItem_Property_ValidUpdateOrigin `ListItem.Property(Addon.ValidUpdateOrigin)`\endlink +/// @skinning_v20 **[New Infolabel]** \link ListItem_Property_ValidUpdateOrigin `ListItem.Property(Addon.ValidUpdateOrigin)`\endlink ///

/// } /// \table_row3{ `ListItem.Property(Addon.ValidUpdateVersion)`, @@ -7518,6 +7533,96 @@ const infomap playlist[] = {{ "length", PLAYLIST_LENGTH }, { "isrepeat", PLAYLIST_ISREPEAT }, { "isrepeatone", PLAYLIST_ISREPEATONE }}; +// clang-format off +/// \page modules__infolabels_boolean_conditions +/// \subsection modules__infolabels_boolean_conditions_Web Web +/// \table_start +/// \table_h3{ Labels, Type, Description } +/// \table_row3{ `Web.HasAddons`, +/// \anchor Web_HasAddons +/// _integer_, +/// @return **True** when the system is have a internet related addon present. +///

+/// } +/// \table_row3{ `Web.HasBrowser`, +/// \anchor Web_HasBrowser +/// _integer_, +/// @return **True** when the system is have a web browser addon present. +///

+/// } +/// \table_end +/// +/// ----------------------------------------------------------------------------- +const infomap web[] = {{ "hasaddons", WEB_HAS_ADDONS }, + { "hasbrowser", WEB_HAS_BROWSER }}; +// clang-format on + +// clang-format off +/// \page modules__infolabels_boolean_conditions +/// \subsection modules__infolabels_boolean_conditions_WebControl Web GUI control +/// \table_start +/// \table_h3{ Labels, Type, Description } +/// \table_row3{ `WebControl.OpenedAddress`, +/// \anchor WebControl_OpenedAddress +/// _integer_, +/// @return The currently on shown web control opened website address. +///

+/// } +/// \table_row3{ `WebControl.OpenedTitle`, +/// \anchor WebControl_OpenedTitle +/// _integer_, +/// @return The currently on shown web control opened website title. +///

+/// } +/// \table_row3{ `WebControl.IconURL`, +/// \anchor WebControl_IconURL +/// _integer_, +/// @return The icon URL of currently opened website. +///

+/// } +/// \table_row3{ `WebControl.IsLoading`, +/// \anchor WebControl_IsLoading +/// _integer_, +/// @return **True** when the focused web control is loading. +///

+/// } +/// \table_row3{ `WebControl.CanGoBack`, +/// \anchor WebControl_CanGoBack +/// _integer_, +/// @return **True** when the focused web site allow to go back. +///

+/// } +/// \table_row3{ `WebControl.CanGoForward`, +/// \anchor WebControl_CanGoForward +/// _integer_, +/// @return **True** when the focused web site allow to go forward. +///

+/// } +/// \table_row3{ `WebControl.ToolTip`, +/// \anchor WebControl_ToolTip +/// _integer_, +/// @return The website tooltip of currently focused website content. +///

+/// } +/// \table_row3{ `WebControl.StatusMessage`, +/// \anchor WebControl_StatusMessage +/// _integer_, +/// @return The website status message of currently opened website. +///

+/// } +/// \table_end +/// +/// ----------------------------------------------------------------------------- +const infomap webcontrol[] = {{ "openedaddress", WEB_CONTROL_OPENED_ADDRESS }, + { "openedtitle", WEB_CONTROL_OPENED_TITLE }, + { "iconurl", WEB_CONTROL_ICONURL }, + { "isloading", WEB_CONTROL_IS_LOADING }, + { "cangoback", WEB_CONTROL_CAN_GO_BACK }, + { "cangoforward", WEB_CONTROL_CAN_GO_FORWARD }, + { "tooltip", WEB_CONTROL_TOOLTIP }, + { "statusmessage", WEB_CONTROL_STATUS_MESSAGE }}; +// clang-format on + /// \page modules__infolabels_boolean_conditions /// \subsection modules__infolabels_boolean_conditions_Pvr Pvr /// \table_start @@ -10398,6 +10503,22 @@ int CGUIInfoManager::TranslateSingleString(const std::string &strCondition, bool return rd.val; } } + else if (cat.name == "web") + { + for (const infomap& i : web) + { + if (prop.name == i.str) + return i.val; + } + } + else if (cat.name == "webcontrol") + { + for (const infomap& i : webcontrol) + { + if (prop.name == i.str) + return i.val; + } + } } else if (info.size() == 3 || info.size() == 4) { diff --git a/xbmc/GUIUserMessages.h b/xbmc/GUIUserMessages.h index 2662bb1af7305..c1a5a2a00e785 100644 --- a/xbmc/GUIUserMessages.h +++ b/xbmc/GUIUserMessages.h @@ -140,3 +140,28 @@ constexpr const int GUI_MSG_PLAYBACK_AVSTARTED = GUI_MSG_USER + 44; // Sent to notify system sleep/wake constexpr const int GUI_MSG_SYSTEM_SLEEP = GUI_MSG_USER + 45; constexpr const int GUI_MSG_SYSTEM_WAKE = GUI_MSG_USER + 46; + +/*! Web control messages */ +//@{ +// Sent to tell that web addon control is ready and related processes can be done +constexpr const int GUI_MSG_WEB_ADDON_READY = GUI_MSG_USER + 50; +// Sent to tell that control is already open and was only inactive +constexpr const int GUI_MSG_WEB_CONTROL_REOPEN = GUI_MSG_USER + 51; +// Sent to change on URL entry field the active string +constexpr const int GUI_MSG_WEB_UPDATE_ADDRESS = GUI_MSG_USER + 52; +constexpr const int GUI_MSG_WEB_UPDATE_NAME = GUI_MSG_USER + 53; +constexpr const int GUI_MSG_WEB_UPDATE_ICON = GUI_MSG_USER + 54; +constexpr const int GUI_MSG_WEB_NEW_TAB = GUI_MSG_USER + 55; +constexpr const int GUI_MSG_WEB_OPEN_TAB = GUI_MSG_USER + 56; + +/*! + * GUI messages send to add-on to handle steps inside control + */ +constexpr const int GUI_MSG_WEB_CONTROL_GO_BACK = GUI_MSG_USER + 60; +constexpr const int GUI_MSG_WEB_CONTROL_GO_FWD = GUI_MSG_USER + 61; +constexpr const int GUI_MSG_WEB_CONTROL_LOAD = GUI_MSG_USER + 62; +constexpr const int GUI_MSG_WEB_CONTROL_RELOAD = GUI_MSG_USER + 63; +constexpr const int GUI_MSG_WEB_CONTROL_HOME = GUI_MSG_USER + 64; +constexpr const int GUI_MSG_WEB_CONTROL_SETTINGS = GUI_MSG_USER + 65; +constexpr const int GUI_MSG_WEB_CONTROL_ADD_TO_FAVOURITES = GUI_MSG_USER + 66; +//@} diff --git a/xbmc/LangInfo.cpp b/xbmc/LangInfo.cpp index 1db7f79084065..4682e5cd3484e 100644 --- a/xbmc/LangInfo.cpp +++ b/xbmc/LangInfo.cpp @@ -29,6 +29,7 @@ #include "utils/XMLUtils.h" #include "utils/log.h" #include "weather/WeatherManager.h" +#include "web/WebManager.h" #include #include @@ -771,6 +772,7 @@ bool CLangInfo::SetLanguage(std::string language /* = "" */, bool reloadServices // also tell our weather and skin to reload as these are localized CServiceBroker::GetWeatherManager().Refresh(); CServiceBroker::GetPVRManager().LocalizationChanged(); + CServiceBroker::GetWEBManager().SetLanguage(language); CServiceBroker::GetAppMessenger()->PostMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, "ReloadSkin"); } diff --git a/xbmc/ServiceBroker.cpp b/xbmc/ServiceBroker.cpp index e0011a9bcd06c..c481e6afd4d18 100644 --- a/xbmc/ServiceBroker.cpp +++ b/xbmc/ServiceBroker.cpp @@ -82,14 +82,9 @@ 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(); -} - -ADDON::CBinaryAddonCache& CServiceBroker::GetBinaryAddonCache() -{ - return g_application.m_ServiceManager->GetBinaryAddonCache(); + return g_application.m_ServiceManager->GetAddonIfcCtrl(); } ADDONS::CExtsMimeSupportList& CServiceBroker::GetExtsMimeSupportList() @@ -213,7 +208,12 @@ CNetworkBase& CServiceBroker::GetNetwork() return g_application.m_ServiceManager->GetNetwork(); } -bool CServiceBroker::IsBinaryAddonCacheUp() +WEB::CWebManager& CServiceBroker::GetWEBManager() +{ + return g_application.m_ServiceManager->GetWEBManager(); +} + +bool CServiceBroker::IsAddonInterfaceUp() { return g_application.m_ServiceManager && g_application.m_ServiceManager->init_level > 1; } diff --git a/xbmc/ServiceBroker.h b/xbmc/ServiceBroker.h index 332d71b4f03ec..145db338bb57e 100644 --- a/xbmc/ServiceBroker.h +++ b/xbmc/ServiceBroker.h @@ -15,8 +15,6 @@ namespace ADDON { class CAddonMgr; -class CBinaryAddonManager; -class CBinaryAddonCache; class CVFSAddonCache; class CServiceAddonManager; class CRepositoryUpdater; @@ -52,6 +50,7 @@ class CApplicationMessenger; class CAppParams; class CContextMenuManager; + class XBPython; class CDataCacheCore; class IAE; @@ -85,10 +84,19 @@ class IWSDiscovery; namespace KODI { + namespace ADDONS { + class CExtsMimeSupportList; -} + +namespace INTERFACE +{ +class CController; +} /* namespace INTERFACE */ + +} /* namespace ADDONS */ + namespace GAME { @@ -100,6 +108,12 @@ namespace RETRO { class CGUIGameRenderManager; } + +namespace WEB +{ +class CWebManager; +} + } // namespace KODI namespace PERIPHERALS @@ -132,10 +146,9 @@ class CServiceBroker static void UnregisterAnnouncementManager(); static ADDON::CAddonMgr& GetAddonMgr(); - static ADDON::CBinaryAddonManager& GetBinaryAddonManager(); - static ADDON::CBinaryAddonCache& GetBinaryAddonCache(); static KODI::ADDONS::CExtsMimeSupportList& GetExtsMimeSupportList(); static ADDON::CVFSAddonCache& GetVFSAddonCache(); + static KODI::ADDONS::INTERFACE::CController& GetAddonIfcCtrl(); static XBPython& GetXBPython(); static WSDiscovery::IWSDiscovery& GetWSDiscovery(); static MEDIA_DETECT::CDetectDVDMedia& GetDetectDVDMedia(); @@ -153,7 +166,8 @@ class CServiceBroker static ADDON::CRepositoryUpdater& GetRepositoryUpdater(); static CInputManager& GetInputManager(); static CFileExtensionProvider& GetFileExtensionProvider(); - static bool IsBinaryAddonCacheUp(); + static KODI::WEB::CWebManager& GetWEBManager(); + static bool IsAddonInterfaceUp(); static bool IsServiceManagerUp(); static CNetworkBase& GetNetwork(); static CPowerManager& GetPowerManager(); diff --git a/xbmc/ServiceManager.cpp b/xbmc/ServiceManager.cpp index 72ae65c2eee84..250aa72a5a230 100644 --- a/xbmc/ServiceManager.cpp +++ b/xbmc/ServiceManager.cpp @@ -12,11 +12,10 @@ #include "DatabaseManager.h" #include "PlayListPlayer.h" #include "addons/AudioDecoder.h" -#include "addons/BinaryAddonCache.h" #include "addons/ExtsMimeSupportList.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" @@ -46,6 +45,7 @@ #include "utils/FileExtensionProvider.h" #include "utils/log.h" #include "weather/WeatherManager.h" +#include "web/WebManager.h" using namespace KODI; @@ -67,13 +67,19 @@ 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::{}: Unable to start KODI::ADDONS::INTERFACE::CController", + __func__); + return false; + } m_extsMimeSupportList.reset(new ADDONS::CExtsMimeSupportList(*m_addonMgr)); m_fileExtensionProvider.reset(new CFileExtensionProvider(*m_addonMgr)); @@ -87,7 +93,6 @@ void CServiceManager::DeinitTesting() init_level = 0; m_fileExtensionProvider.reset(); m_extsMimeSupportList.reset(); - m_binaryAddonManager.reset(); m_addonMgr.reset(); m_databaseManager.reset(); m_network.reset(); @@ -118,9 +123,6 @@ bool CServiceManager::InitStageTwo(const std::string& profilesUserDataFolder) // 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()) { @@ -128,6 +130,14 @@ bool CServiceManager::InitStageTwo(const std::string& profilesUserDataFolder) return false; } + m_addonIfcCtrl.reset(new KODI::ADDONS::INTERFACE::CController(*m_addonMgr)); + if (!m_addonIfcCtrl->Init()) + { + CLog::Log(LOGFATAL, "CServiceManager::{}: Unable to start KODI::ADDONS::INTERFACE::CController", + __func__); + return false; + } + m_repositoryUpdater.reset(new ADDON::CRepositoryUpdater(*m_addonMgr)); m_extsMimeSupportList.reset(new ADDONS::CExtsMimeSupportList(*m_addonMgr)); @@ -139,8 +149,7 @@ bool CServiceManager::InitStageTwo(const std::string& profilesUserDataFolder) m_dataCacheCore.reset(new CDataCacheCore()); - m_binaryAddonCache.reset(new ADDON::CBinaryAddonCache()); - m_binaryAddonCache->Init(); + m_webManager.reset(new WEB::CWebManager()); m_favouritesService.reset(new CFavouritesService(profilesUserDataFolder)); @@ -193,12 +202,16 @@ bool CServiceManager::InitStageThree(const std::shared_ptr& pro m_gameServices.reset(new GAME::CGameServices(*m_gameControllerManager, *m_gameRenderManager, *m_peripherals, *profileManager)); + m_gameServices->Init(); m_contextMenuManager->Init(); // Init PVR manager after login, not already on login screen if (!profileManager->UsingLoginScreen()) + { m_PVRManager->Init(); + m_webManager->Init(); + } m_playerCoreFactory.reset(new CPlayerCoreFactory(*profileManager)); @@ -233,6 +246,8 @@ void CServiceManager::DeinitStageTwo() m_WSDiscovery.reset(); #endif + m_webManager->Deinit(); + m_weatherManager.reset(); m_powerManager.reset(); m_fileExtensionProvider.reset(); @@ -243,13 +258,13 @@ void CServiceManager::DeinitStageTwo() m_contextMenuManager.reset(); m_serviceAddons.reset(); m_favouritesService.reset(); - m_binaryAddonCache.reset(); m_dataCacheCore.reset(); + m_webManager.reset(); m_PVRManager.reset(); m_extsMimeSupportList.reset(); m_vfsAddonCache.reset(); m_repositoryUpdater.reset(); - m_binaryAddonManager.reset(); + m_addonIfcCtrl.reset(); m_addonMgr.reset(); m_databaseManager.reset(); @@ -291,16 +306,6 @@ ADDONS::CExtsMimeSupportList& CServiceManager::GetExtsMimeSupportList() return *m_extsMimeSupportList; } -ADDON::CBinaryAddonCache& CServiceManager::GetBinaryAddonCache() -{ - return *m_binaryAddonCache; -} - -ADDON::CBinaryAddonManager& CServiceManager::GetBinaryAddonManager() -{ - return *m_binaryAddonManager; -} - ADDON::CVFSAddonCache& CServiceManager::GetVFSAddonCache() { return *m_vfsAddonCache; @@ -316,6 +321,11 @@ ADDON::CRepositoryUpdater& CServiceManager::GetRepositoryUpdater() return *m_repositoryUpdater; } +KODI::ADDONS::INTERFACE::CController& CServiceManager::GetAddonIfcCtrl() +{ + return *m_addonIfcCtrl; +} + #ifdef HAS_PYTHON XBPython& CServiceManager::GetXBPython() { @@ -395,6 +405,11 @@ CPowerManager& CServiceManager::GetPowerManager() return *m_powerManager; } +WEB::CWebManager& CServiceManager::GetWEBManager() +{ + return *m_webManager; +} + // deleters for unique_ptr void CServiceManager::delete_dataCacheCore::operator()(CDataCacheCore* p) const { diff --git a/xbmc/ServiceManager.h b/xbmc/ServiceManager.h index 9c99811a4068b..5dc60155cb34b 100644 --- a/xbmc/ServiceManager.h +++ b/xbmc/ServiceManager.h @@ -15,8 +15,6 @@ namespace ADDON { class CAddonMgr; -class CBinaryAddonManager; -class CBinaryAddonCache; class CVFSAddonCache; class CServiceAddonManager; class CRepositoryUpdater; @@ -51,10 +49,18 @@ class CWeatherManager; namespace KODI { + namespace ADDONS { + class CExtsMimeSupportList; -} + +namespace INTERFACE +{ +class CController; +} /* namespace INTERFACE */ + +} /* namespace ADDONS */ namespace GAME { @@ -66,6 +72,12 @@ namespace RETRO { class CGUIGameRenderManager; } + +namespace WEB +{ +class CWebManager; +} + } // namespace KODI namespace MEDIA_DETECT @@ -102,12 +114,11 @@ class CServiceManager void DeinitStageOne(); ADDON::CAddonMgr& GetAddonMgr(); - ADDON::CBinaryAddonManager& GetBinaryAddonManager(); - ADDON::CBinaryAddonCache& GetBinaryAddonCache(); KODI::ADDONS::CExtsMimeSupportList& GetExtsMimeSupportList(); ADDON::CVFSAddonCache& GetVFSAddonCache(); ADDON::CServiceAddonManager& GetServiceAddons(); ADDON::CRepositoryUpdater& GetRepositoryUpdater(); + KODI::ADDONS::INTERFACE::CController& GetAddonIfcCtrl(); CNetworkBase& GetNetwork(); #ifdef HAS_PYTHON XBPython& GetXBPython(); @@ -125,6 +136,7 @@ class CServiceManager KODI::GAME::CGameServices& GetGameServices(); KODI::RETRO::CGUIGameRenderManager& GetGameRenderManager(); PERIPHERALS::CPeripherals& GetPeripherals(); + KODI::WEB::CWebManager& GetWEBManager(); PLAYLIST::CPlayListPlayer& GetPlaylistPlayer(); int init_level = 0; @@ -164,12 +176,11 @@ class CServiceManager }; std::unique_ptr m_addonMgr; - std::unique_ptr m_binaryAddonManager; - std::unique_ptr m_binaryAddonCache; std::unique_ptr m_extsMimeSupportList; std::unique_ptr m_vfsAddonCache; std::unique_ptr m_serviceAddons; std::unique_ptr m_repositoryUpdater; + std::unique_ptr m_addonIfcCtrl; #if defined(HAS_FILESYSTEM_SMB) std::unique_ptr m_WSDiscovery; #endif @@ -194,6 +205,7 @@ class CServiceManager std::unique_ptr m_playerCoreFactory; std::unique_ptr m_databaseManager; std::unique_ptr m_mediaManager; + std::unique_ptr m_webManager; #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE) std::unique_ptr m_DetectDVDType; #endif diff --git a/xbmc/URL.cpp b/xbmc/URL.cpp index f4a66d0e802ed..62de53dac77dd 100644 --- a/xbmc/URL.cpp +++ b/xbmc/URL.cpp @@ -159,18 +159,10 @@ void CURL::Parse(const std::string& strURL1) //! @todo fix all Addon paths std::string strProtocol2 = GetTranslatedProtocol(); - if(IsProtocol("rss") || - IsProtocol("rsss") || - IsProtocol("rar") || - IsProtocol("apk") || - IsProtocol("xbt") || - IsProtocol("zip") || - IsProtocol("addons") || - IsProtocol("image") || - IsProtocol("videodb") || - IsProtocol("musicdb") || - IsProtocol("androidapp") || - IsProtocol("pvr")) + if (IsProtocol("rss") || IsProtocol("rsss") || IsProtocol("rar") || IsProtocol("apk") || + IsProtocol("xbt") || IsProtocol("zip") || IsProtocol("addons") || IsProtocol("image") || + IsProtocol("videodb") || IsProtocol("musicdb") || IsProtocol("androidapp") || + IsProtocol("pvr") || IsProtocol("web")) sep = "?"; else if( IsProtocolEqual(strProtocol2, "http") @@ -279,7 +271,8 @@ void CURL::Parse(const std::string& strURL1) m_strFileName = strURL.substr(iPos, iEnd - iPos); } - if (IsProtocol("musicdb") || IsProtocol("videodb") || IsProtocol("sources") || IsProtocol("pvr")) + if (IsProtocol("musicdb") || IsProtocol("videodb") || IsProtocol("sources") || + IsProtocol("pvr") || IsProtocol("web")) { if (m_strHostName != "" && m_strFileName != "") { diff --git a/xbmc/Util.cpp b/xbmc/Util.cpp index c30768c746b7c..721af2132e747 100644 --- a/xbmc/Util.cpp +++ b/xbmc/Util.cpp @@ -1487,7 +1487,7 @@ bool CUtil::SupportsWriteFileOperations(const std::string& strPath) return CMultiPathDirectory::SupportsWriteFileOperations(strPath); - if (CServiceBroker::IsBinaryAddonCacheUp()) + if (CServiceBroker::IsAddonInterfaceUp()) { CURL url(strPath); for (const auto& addon : CServiceBroker::GetVFSAddonCache().GetAddonInstances()) diff --git a/xbmc/addons/Addon.h b/xbmc/addons/Addon.h index 21cea8a011fe5..93210bdcf2c12 100644 --- a/xbmc/addons/Addon.h +++ b/xbmc/addons/Addon.h @@ -90,7 +90,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(); } @@ -397,6 +397,8 @@ class CAddon : public IAddon void OnPreUnInstall() override{}; void OnPostUnInstall() override{}; + AddonInfoPtr GetAddonInfo() override { return m_addonInfo; } + protected: /*! * \brief Whether or not the settings have been initialized. diff --git a/xbmc/addons/AddonBuilder.cpp b/xbmc/addons/AddonBuilder.cpp index 39dd3c9eed8e2..9b85931939522 100644 --- a/xbmc/addons/AddonBuilder.cpp +++ b/xbmc/addons/AddonBuilder.cpp @@ -21,7 +21,6 @@ #include "addons/Skin.h" #include "addons/UISoundsResource.h" #include "addons/Webinterface.h" -#include "games/addons/GameClient.h" #include "games/controllers/Controller.h" #include "pvr/addons/PVRClient.h" #include "utils/StringUtils.h" @@ -55,13 +54,14 @@ 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) { case ADDON_AUDIODECODER: case ADDON_AUDIOENCODER: + case ADDON_GAMEDLL: case ADDON_IMAGEDECODER: case ADDON_INPUTSTREAM: case ADDON_PERIPHERALDLL: @@ -69,9 +69,8 @@ AddonPtr CAddonBuilder::Generate(const AddonInfoPtr& info, TYPE type) case ADDON_VFS: case ADDON_VIZ: case ADDON_SCREENSAVER: - return std::make_shared(info, type); - case ADDON_GAMEDLL: - return std::make_shared(info); + case ADDON_WEB_MANAGER: + return std::make_shared(info, type); case ADDON_PLUGIN: case ADDON_SCRIPT: return std::make_shared(info, type); diff --git a/xbmc/addons/AddonDatabase.cpp b/xbmc/addons/AddonDatabase.cpp index 9b0d3ff9f51f5..ffad7b1f1702a 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 43f396561d318..d30310b33db7d 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 c0b2b516872c3..e2428439a056d 100644 --- a/xbmc/addons/AudioDecoder.cpp +++ b/xbmc/addons/AudioDecoder.cpp @@ -7,7 +7,13 @@ #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 "music/tags/MusicInfoTag.h" @@ -18,53 +24,38 @@ using namespace ADDON; using namespace KODI::ADDONS; +using namespace KODI::ADDONS::INTERFACE; CAudioDecoder::CAudioDecoder(const AddonInfoPtr& addonInfo) - : IAddonInstanceHandler(ADDON_INSTANCE_AUDIODECODER, addonInfo) + : IInstanceHandler(this, ADDON_INSTANCE_AUDIODECODER, addonInfo) { m_CodecName = addonInfo->Type(ADDON_AUDIODECODER)->GetValue("@name").asString(); 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_ifc.audiodecoder = new AddonInstance_AudioDecoder; - m_ifc.audiodecoder->toAddon = new KodiToAddonFuncTable_AudioDecoder(); - m_ifc.audiodecoder->toKodi = new AddonToKodiFuncTable_AudioDecoder(); - m_ifc.audiodecoder->toKodi->kodiInstance = this; } CAudioDecoder::~CAudioDecoder() { DestroyInstance(); - - delete m_ifc.audiodecoder->toKodi; - delete m_ifc.audiodecoder->toAddon; - delete m_ifc.audiodecoder; } bool CAudioDecoder::CreateDecoder() { - if (CreateInstance() != ADDON_STATUS_OK) - return false; - - return true; + return CreateInstance() == ADDON_STATUS_OK; } bool CAudioDecoder::SupportsFile(const std::string& filename) { // Create in case not available, possible as this done by IAddonSupportCheck - if ((!m_ifc.hdl && !CreateDecoder()) || !m_ifc.audiodecoder->toAddon->supports_file) + if ((!m_instance && !CreateDecoder())) return false; - return m_ifc.audiodecoder->toAddon->supports_file(m_ifc.hdl, filename.c_str()); + const auto ifc = m_ifc->kodi_addoninstance_audiodecoder_h; + return ifc->kodi_addon_audiodecoder_supports_file_v1(m_instance, filename.c_str()); } bool CAudioDecoder::Init(const CFileItem& file, unsigned int filecache) { - if (!m_ifc.audiodecoder->toAddon->init) - return false; - /// 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! @@ -76,9 +67,10 @@ bool CAudioDecoder::Init(const CFileItem& file, unsigned int filecache) AudioEngineDataFormat addonFormat = AUDIOENGINE_FMT_INVALID; AudioEngineChannel channelList[AUDIOENGINE_CH_MAX] = {AUDIOENGINE_CH_NULL}; - bool ret = m_ifc.audiodecoder->toAddon->init(m_ifc.hdl, file.GetDynPath().c_str(), filecache, - &channels, &sampleRate, &m_bitsPerSample, - &m_TotalTime, &m_bitRate, &addonFormat, channelList); + const auto ifc = m_ifc->kodi_addoninstance_audiodecoder_h; + bool ret = ifc->kodi_addon_audiodecoder_init_v1( + m_instance, 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) @@ -89,7 +81,7 @@ 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 (channelList[0] != AUDIOENGINE_CH_NULL) { @@ -98,7 +90,7 @@ bool CAudioDecoder::Init(const CFileItem& file, unsigned int filecache) { if (channel == AUDIOENGINE_CH_NULL) break; - layout += Interface_AudioEngine::TranslateAEChannelToKodi(channel); + layout += TranslateAEChannelToKodi(channel); } m_format.m_channelLayout = layout; @@ -112,18 +104,14 @@ bool CAudioDecoder::Init(const CFileItem& file, unsigned int filecache) int CAudioDecoder::ReadPCM(uint8_t* buffer, size_t size, size_t* actualsize) { - if (!m_ifc.audiodecoder->toAddon->read_pcm) - return 0; - - return m_ifc.audiodecoder->toAddon->read_pcm(m_ifc.hdl, buffer, size, actualsize); + const auto ifc = m_ifc->kodi_addoninstance_audiodecoder_h; + return ifc->kodi_addon_audiodecoder_read_pcm_v1(m_instance, buffer, size, actualsize); } bool CAudioDecoder::Seek(int64_t time) { - if (!m_ifc.audiodecoder->toAddon->seek) - return false; - - m_ifc.audiodecoder->toAddon->seek(m_ifc.hdl, time); + const auto ifc = m_ifc->kodi_addoninstance_audiodecoder_h; + ifc->kodi_addon_audiodecoder_seek_v1(m_instance, time); return true; } @@ -131,11 +119,9 @@ bool CAudioDecoder::Load(const std::string& fileName, MUSIC_INFO::CMusicInfoTag& tag, EmbeddedArt* art) { - if (!m_ifc.audiodecoder->toAddon->read_tag) - return false; - KODI_ADDON_AUDIODECODER_INFO_TAG ifcTag = {}; - bool ret = m_ifc.audiodecoder->toAddon->read_tag(m_ifc.hdl, fileName.c_str(), &ifcTag); + const auto ifc = m_ifc->kodi_addoninstance_audiodecoder_h; + bool ret = ifc->kodi_addon_audiodecoder_read_tag_v1(m_instance, fileName.c_str(), &ifcTag); if (ret) { if (ifcTag.title) @@ -234,11 +220,8 @@ bool CAudioDecoder::Load(const std::string& fileName, int CAudioDecoder::GetTrackCount(const std::string& strPath) { - if (!m_ifc.audiodecoder->toAddon->track_count) - return 0; - - int result = m_ifc.audiodecoder->toAddon->track_count(m_ifc.hdl, strPath.c_str()); - + const auto ifc = m_ifc->kodi_addoninstance_audiodecoder_h; + int result = ifc->kodi_addon_audiodecoder_track_count_v1(m_instance, strPath.c_str()); if (result > 1) { if (m_hasTags) diff --git a/xbmc/addons/AudioDecoder.h b/xbmc/addons/AudioDecoder.h index 7e2424e0d6d74..ab04e9105cc73 100644 --- a/xbmc/addons/AudioDecoder.h +++ b/xbmc/addons/AudioDecoder.h @@ -7,12 +7,14 @@ #pragma once +// Devkit API interface +#include "addons/AddonEvents.h" #include "addons/IAddonSupportCheck.h" #include "addons/IAddonSupportList.h" -#include "addons/binary-addons/AddonInstanceHandler.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/AudioDecoder.h" +#include "addons/interface/InstanceHandler.h" #include "cores/paplayer/ICodec.h" #include "filesystem/MusicFileDirectory.h" +#include "interface/api/addon-instance/audiodecoder.h" #include "music/tags/ImusicInfoTagLoader.h" namespace KODI @@ -20,8 +22,8 @@ namespace KODI namespace ADDONS { -class CAudioDecoder : public ADDON::IAddonInstanceHandler, - public IAddonSupportCheck, +class CAudioDecoder : public KODI::ADDONS::INTERFACE::IInstanceHandler, + public KODI::ADDONS::IAddonSupportCheck, public ICodec, public MUSIC_INFO::IMusicInfoTagLoader, public XFILE::CMusicFileDirectory diff --git a/xbmc/addons/BinaryAddonCache.cpp b/xbmc/addons/BinaryAddonCache.cpp deleted file mode 100644 index 52acf3df8a490..0000000000000 --- a/xbmc/addons/BinaryAddonCache.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2016-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 "BinaryAddonCache.h" - -#include "AddonManager.h" -#include "ServiceBroker.h" - -#include - -namespace ADDON -{ - -const std::vector ADDONS_TO_CACHE = {ADDON_GAMEDLL}; - -CBinaryAddonCache::~CBinaryAddonCache() -{ - Deinit(); -} - -void CBinaryAddonCache::Init() -{ - CServiceBroker::GetAddonMgr().Events().Subscribe(this, &CBinaryAddonCache::OnEvent); - Update(); -} - -void CBinaryAddonCache::Deinit() -{ - CServiceBroker::GetAddonMgr().Events().Unsubscribe(this); -} - -void CBinaryAddonCache::GetAddons(VECADDONS& addons, const TYPE& type) -{ - VECADDONS myAddons; - GetInstalledAddons(myAddons, type); - - for (auto &addon : myAddons) - { - if (!CServiceBroker::GetAddonMgr().IsAddonDisabled(addon->ID())) - addons.emplace_back(std::move(addon)); - } -} - -void CBinaryAddonCache::GetDisabledAddons(VECADDONS& addons, const TYPE& type) -{ - VECADDONS myAddons; - GetInstalledAddons(myAddons, type); - - for (auto &addon : myAddons) - { - if (CServiceBroker::GetAddonMgr().IsAddonDisabled(addon->ID())) - addons.emplace_back(std::move(addon)); - } -} - -void CBinaryAddonCache::GetInstalledAddons(VECADDONS& addons, const TYPE& type) -{ - std::unique_lock lock(m_critSection); - auto it = m_addons.find(type); - if (it != m_addons.end()) - addons = it->second; -} - -AddonPtr CBinaryAddonCache::GetAddonInstance(const std::string& strId, TYPE type) -{ - AddonPtr addon; - - std::unique_lock lock(m_critSection); - - auto it = m_addons.find(type); - if (it != m_addons.end()) - { - VECADDONS& addons = it->second; - auto itAddon = std::find_if(addons.begin(), addons.end(), - [&strId](const AddonPtr& addon) - { - return addon->ID() == strId; - }); - - if (itAddon != addons.end()) - addon = *itAddon; - } - - return addon; -} - -void CBinaryAddonCache::OnEvent(const AddonEvent& event) -{ - if (typeid(event) == typeid(AddonEvents::Enabled) || - typeid(event) == typeid(AddonEvents::Disabled) || - typeid(event) == typeid(AddonEvents::ReInstalled)) - { - for (auto &type : ADDONS_TO_CACHE) - { - if (CServiceBroker::GetAddonMgr().HasType(event.addonId, type)) - { - Update(); - break; - } - } - } - else if (typeid(event) == typeid(AddonEvents::UnInstalled)) - { - Update(); - } -} - -void CBinaryAddonCache::Update() -{ - using AddonMap = std::multimap; - AddonMap addonmap; - - for (auto &addonType : ADDONS_TO_CACHE) - { - VECADDONS addons; - CServiceBroker::GetAddonMgr().GetInstalledAddons(addons, addonType); - addonmap.insert(AddonMap::value_type(addonType, addons)); - } - - { - std::unique_lock lock(m_critSection); - m_addons = std::move(addonmap); - } -} - -} diff --git a/xbmc/addons/BinaryAddonCache.h b/xbmc/addons/BinaryAddonCache.h deleted file mode 100644 index 344cc5f05a35a..0000000000000 --- a/xbmc/addons/BinaryAddonCache.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2016-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 "Addon.h" -#include "AddonEvents.h" -#include "threads/CriticalSection.h" - -#include -#include - -namespace ADDON { - -class CBinaryAddonCache -{ -public: - virtual ~CBinaryAddonCache(); - void Init(); - void Deinit(); - void GetAddons(VECADDONS& addons, const TYPE& type); - void GetDisabledAddons(VECADDONS& addons, const TYPE& type); - void GetInstalledAddons(VECADDONS& addons, const TYPE& type); - AddonPtr GetAddonInstance(const std::string& strId, TYPE type); - -protected: - void Update(); - void OnEvent(const AddonEvent& event); - - CCriticalSection m_critSection; - std::multimap m_addons; -}; - -} diff --git a/xbmc/addons/CMakeLists.txt b/xbmc/addons/CMakeLists.txt index 0f24a6cea3733..8181e71fb5cbf 100644 --- a/xbmc/addons/CMakeLists.txt +++ b/xbmc/addons/CMakeLists.txt @@ -1,6 +1,5 @@ set(SOURCES Addon.cpp AddonBuilder.cpp - BinaryAddonCache.cpp AddonDatabase.cpp AddonInstaller.cpp AddonManager.cpp @@ -35,7 +34,6 @@ set(HEADERS Addon.h AddonBuilder.h AddonEvents.h AddonRepoInfo.h - BinaryAddonCache.h AddonDatabase.h AddonInstaller.h AddonManager.h diff --git a/xbmc/addons/IAddon.h b/xbmc/addons/IAddon.h index 43a0f7b8ea7de..d25e6a1b208b5 100644 --- a/xbmc/addons/IAddon.h +++ b/xbmc/addons/IAddon.h @@ -66,10 +66,12 @@ class IAddon : public std::enable_shared_from_this { public: virtual ~IAddon() = default; + virtual AddonInfoPtr GetAddonInfo() = 0; virtual TYPE MainType() const = 0; 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/ImageDecoder.cpp b/xbmc/addons/ImageDecoder.cpp index 2db12d66944a4..94ae9ae7cdd8f 100644 --- a/xbmc/addons/ImageDecoder.cpp +++ b/xbmc/addons/ImageDecoder.cpp @@ -7,6 +7,10 @@ #include "ImageDecoder.h" +// Devkit API interface +#include "interface/api/addon-instance/imagedecoder.h" + +// Kodi #include "guilib/TextureFormats.h" #include "pictures/PictureInfoTag.h" @@ -25,14 +29,8 @@ constexpr std::array, 4> KodiToA } /* namespace */ CImageDecoder::CImageDecoder(const AddonInfoPtr& addonInfo, const std::string& mimetype) - : IAddonInstanceHandler(ADDON_INSTANCE_IMAGEDECODER, addonInfo), m_mimetype(mimetype) + : IInstanceHandler(this, ADDON_INSTANCE_IMAGEDECODER, addonInfo), m_mimetype(mimetype) { - // Create all interface parts independent to make API changes easier if - // something is added - m_ifc.imagedecoder = new AddonInstance_ImageDecoder; - m_ifc.imagedecoder->toAddon = new KodiToAddonFuncTable_ImageDecoder(); - m_ifc.imagedecoder->toKodi = new AddonToKodiFuncTable_ImageDecoder(); - if (CreateInstance() != ADDON_STATUS_OK) return; @@ -42,28 +40,26 @@ CImageDecoder::CImageDecoder(const AddonInfoPtr& addonInfo, const std::string& m CImageDecoder::~CImageDecoder() { DestroyInstance(); - - delete m_ifc.imagedecoder->toKodi; - delete m_ifc.imagedecoder->toAddon; - delete m_ifc.imagedecoder; } bool CImageDecoder::SupportsFile(const std::string& filename) { // Create in case not available, possible as this done by IAddonSupportCheck - if (!m_created || !m_ifc.imagedecoder->toAddon->supports_file) + if (!m_created) return false; - return m_ifc.imagedecoder->toAddon->supports_file(m_ifc.hdl, filename.c_str()); + return m_ifc->kodi_addoninstance_imagedecoder_h->kodi_addon_imagedecoder_supports_file_v1( + m_instance, filename.c_str()); } bool CImageDecoder::LoadInfoTag(const std::string& fileName, CPictureInfoTag* tag) { - if (!m_created || !m_ifc.imagedecoder->toAddon->read_tag || !tag) + if (!m_created || !tag) return false; KODI_ADDON_IMAGEDECODER_INFO_TAG ifcTag = {}; - bool ret = m_ifc.imagedecoder->toAddon->read_tag(m_ifc.hdl, fileName.c_str(), &ifcTag); + bool ret = m_ifc->kodi_addoninstance_imagedecoder_h->kodi_addon_imagedecoder_read_tag_v1( + m_instance, fileName.c_str(), &ifcTag); if (ret) { /*! @@ -178,13 +174,14 @@ bool CImageDecoder::LoadImageFromMemory(unsigned char* buffer, unsigned int width, unsigned int height) { - if (!m_created || !m_ifc.imagedecoder->toAddon->load_image_from_memory) + if (!m_created) return false; m_width = width; m_height = height; - return m_ifc.imagedecoder->toAddon->load_image_from_memory(m_ifc.hdl, m_mimetype.c_str(), buffer, - bufSize, &m_width, &m_height); + return m_ifc->kodi_addoninstance_imagedecoder_h + ->kodi_addon_imagedecoder_load_image_from_memory_v1(m_instance, m_mimetype.c_str(), buffer, + bufSize, &m_width, &m_height); } bool CImageDecoder::Decode(unsigned char* const pixels, @@ -193,7 +190,7 @@ bool CImageDecoder::Decode(unsigned char* const pixels, unsigned int pitch, unsigned int format) { - if (!m_created || !m_ifc.imagedecoder->toAddon->decode) + if (!m_created) return false; const auto it = std::find_if(KodiToAddonFormat.begin(), KodiToAddonFormat.end(), @@ -203,8 +200,8 @@ bool CImageDecoder::Decode(unsigned char* const pixels, const ADDON_IMG_FMT addonFmt = std::get<1>(*it); const size_t size = width * height * std::get<2>(*it); - const bool result = - m_ifc.imagedecoder->toAddon->decode(m_ifc.hdl, pixels, size, width, height, pitch, addonFmt); + const bool result = m_ifc->kodi_addoninstance_imagedecoder_h->kodi_addon_imagedecoder_decode_v1( + m_instance, pixels, size, width, height, pitch, addonFmt); m_width = width; m_height = height; diff --git a/xbmc/addons/ImageDecoder.h b/xbmc/addons/ImageDecoder.h index 038c601e62838..adc05cd358aa4 100644 --- a/xbmc/addons/ImageDecoder.h +++ b/xbmc/addons/ImageDecoder.h @@ -8,9 +8,8 @@ #pragma once #include "addons/IAddonSupportCheck.h" -#include "addons/binary-addons/AddonInstanceHandler.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/ImageDecoder.h" #include "guilib/iimage.h" +#include "interface/InstanceHandler.h" class CPictureInfoTag; @@ -19,7 +18,7 @@ namespace KODI namespace ADDONS { -class CImageDecoder : public ADDON::IAddonInstanceHandler, +class CImageDecoder : public KODI::ADDONS::INTERFACE::IInstanceHandler, public KODI::ADDONS::IAddonSupportCheck, public IImage { diff --git a/xbmc/addons/ScreenSaver.cpp b/xbmc/addons/ScreenSaver.cpp index 06e1afdd233f0..79b14f84e109b 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" @@ -16,24 +17,9 @@ using namespace ADDON; using namespace KODI::ADDONS; -namespace -{ -void get_properties(const KODI_HANDLE hdl, struct KODI_ADDON_SCREENSAVER_PROPS* props) -{ - if (hdl) - static_cast(hdl)->GetProperties(props); -} -} // namespace - CScreenSaver::CScreenSaver(const AddonInfoPtr& addonInfo) - : IAddonInstanceHandler(ADDON_INSTANCE_SCREENSAVER, addonInfo) + : IInstanceHandler(this, ADDON_INSTANCE_SCREENSAVER, addonInfo) { - m_ifc.screensaver = new AddonInstance_Screensaver; - m_ifc.screensaver->toAddon = new KodiToAddonFuncTable_Screensaver(); - m_ifc.screensaver->toKodi = new AddonToKodiFuncTable_Screensaver(); - m_ifc.screensaver->toKodi->get_properties = get_properties; - - /* Open the class "kodi::addon::CInstanceScreensaver" on add-on side */ if (CreateInstance() != ADDON_STATUS_OK) CLog::Log(LOGFATAL, "Screensaver: failed to create instance for '{}' and not usable!", ID()); } @@ -42,29 +28,39 @@ CScreenSaver::~CScreenSaver() { /* Destroy the class "kodi::addon::CInstanceScreensaver" on add-on side */ DestroyInstance(); - - delete m_ifc.screensaver->toAddon; - delete m_ifc.screensaver->toKodi; - delete m_ifc.screensaver; } bool CScreenSaver::Start() { - if (m_ifc.screensaver->toAddon->start) - return m_ifc.screensaver->toAddon->start(m_ifc.hdl); - return false; + const auto ifc = m_ifc->kodi_addoninstance_screensaver_h; + return ifc->kodi_addon_screensaver_start_v1(this, m_instance); } void CScreenSaver::Stop() { - if (m_ifc.screensaver->toAddon->stop) - m_ifc.screensaver->toAddon->stop(m_ifc.hdl); + const auto ifc = m_ifc->kodi_addoninstance_screensaver_h; + return ifc->kodi_addon_screensaver_stop_v1(this, m_instance); } void CScreenSaver::Render() { - if (m_ifc.screensaver->toAddon->render) - m_ifc.screensaver->toAddon->render(m_ifc.hdl); + const auto ifc = m_ifc->kodi_addoninstance_screensaver_h; + return ifc->kodi_addon_screensaver_render_v1(this, m_instance); +} + +bool CScreenSaver::GetOffscreenRenderInfos(int& x, int& y, int& width, int& height, ADDON_HARDWARE_CONTEXT& context) +{ + const auto winSystem = CServiceBroker::GetWinSystem(); + if (!winSystem) + return false; + + x = 0; + y = 0; + context = winSystem->GetHWContext(); + width = winSystem->GetGfxContext().GetWidth(); + height = winSystem->GetGfxContext().GetHeight(); + + return true; } void CScreenSaver::GetProperties(struct KODI_ADDON_SCREENSAVER_PROPS* props) diff --git a/xbmc/addons/ScreenSaver.h b/xbmc/addons/ScreenSaver.h index 616d3e82c714a..770646f65beaa 100644 --- a/xbmc/addons/ScreenSaver.h +++ b/xbmc/addons/ScreenSaver.h @@ -8,15 +8,17 @@ #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" +#include "interface/IOffscreenRenderProcess.h" namespace KODI { namespace ADDONS { -class CScreenSaver : public ADDON::IAddonInstanceHandler +class CScreenSaver : public KODI::ADDONS::INTERFACE::IInstanceHandler, + public KODI::ADDONS::INTERFACE::IOffscreenRenderProcess { public: explicit CScreenSaver(const ADDON::AddonInfoPtr& addonInfo); @@ -28,6 +30,10 @@ class CScreenSaver : public ADDON::IAddonInstanceHandler // Addon callback functions void GetProperties(struct KODI_ADDON_SCREENSAVER_PROPS* props); + /*---AUTO_GEN_PARSE---*/ + +protected: + bool GetOffscreenRenderInfos(int& x, int& y, int& width, int& height, ADDON_HARDWARE_CONTEXT& context) override; }; } /* namespace ADDONS */ diff --git a/xbmc/addons/Service.cpp b/xbmc/addons/Service.cpp index c8a825288a87b..8d32e73dadec5 100644 --- a/xbmc/addons/Service.cpp +++ b/xbmc/addons/Service.cpp @@ -8,13 +8,15 @@ #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" #include - namespace ADDON { @@ -73,12 +75,36 @@ void CServiceAddonManager::Start(const std::string& addonId) void CServiceAddonManager::Start(const AddonPtr& addon) { std::unique_lock 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()); @@ -88,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() @@ -99,9 +126,19 @@ void CServiceAddonManager::Stop() std::unique_lock 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) @@ -110,11 +147,36 @@ void CServiceAddonManager::Stop(const std::string& addonId) 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); @@ -123,4 +185,5 @@ 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/Skin.cpp b/xbmc/addons/Skin.cpp index 0e1b876dff869..ff26c9970d736 100644 --- a/xbmc/addons/Skin.cpp +++ b/xbmc/addons/Skin.cpp @@ -328,6 +328,7 @@ bool CSkinInfo::LoadStartupWindows(const AddonInfoPtr& addonInfo) m_startupWindows.emplace_back(WINDOW_PICTURES, "1"); m_startupWindows.emplace_back(WINDOW_MUSIC_NAV, "2"); m_startupWindows.emplace_back(WINDOW_VIDEO_NAV, "3"); + m_startupWindows.emplace_back(WINDOW_WEB_BROWSER, "911"); m_startupWindows.emplace_back(WINDOW_FILES, "7"); m_startupWindows.emplace_back(WINDOW_SETTINGS_MENU, "5"); m_startupWindows.emplace_back(WINDOW_WEATHER, "8"); diff --git a/xbmc/addons/VFSEntry.cpp b/xbmc/addons/VFSEntry.cpp index a5d46e78882be..9b66fa1a55ace 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" @@ -42,6 +42,8 @@ #endif #endif +using namespace KODI::ADDONS::INTERFACE; + namespace ADDON { @@ -62,7 +64,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); @@ -149,7 +151,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); } } @@ -197,7 +199,8 @@ class CVFSURLWrapper url.protocol = m_strings[9].c_str(); } - VFSURL url; + KODI_ADDON_VFS_URL url; + protected: std::vector m_strings; }; @@ -216,7 +219,7 @@ CVFSEntry::ProtocolInfo::ProtocolInfo(const AddonInfoPtr& addonInfo) } CVFSEntry::CVFSEntry(const AddonInfoPtr& addonInfo) - : IAddonInstanceHandler(ADDON_INSTANCE_VFS, addonInfo), + : IInstanceHandler(this, ADDON_INSTANCE_VFS, addonInfo), m_protocols(addonInfo->Type(ADDON_VFS)->GetValue("@protocols").asString()), m_extensions(addonInfo->Type(ADDON_VFS)->GetValue("@extensions").asString()), m_zeroconf(addonInfo->Type(ADDON_VFS)->GetValue("@zeroconf").asString()), @@ -228,13 +231,6 @@ 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_ifc.vfs = new AddonInstance_VFSEntry; - m_ifc.vfs->props = new AddonProps_VFSEntry(); - m_ifc.vfs->toAddon = new KodiToAddonFuncTable_VFSEntry(); - m_ifc.vfs->toKodi = new AddonToKodiFuncTable_VFSEntry(); - - m_ifc.vfs->toKodi->kodiInstance = this; if (CreateInstance() != ADDON_STATUS_OK) CLog::Log(LOGFATAL, "CVFSEntry - Couldn't create instance on add-on '{}'", addonInfo->Name()); } @@ -242,50 +238,33 @@ CVFSEntry::CVFSEntry(const AddonInfoPtr& addonInfo) CVFSEntry::~CVFSEntry() { DestroyInstance(); - - // Delete "C" interface structures - delete m_ifc.vfs->toAddon; - delete m_ifc.vfs->toKodi; - delete m_ifc.vfs->props; - delete m_ifc.vfs; } void* CVFSEntry::Open(const CURL& url) { - if (!m_ifc.vfs->toAddon->open) - return nullptr; - CVFSURLWrapper url2(url); - return m_ifc.vfs->toAddon->open(m_ifc.vfs, &url2.url); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_open_v1(m_instance, &url2.url); } void* CVFSEntry::OpenForWrite(const CURL& url, bool bOverWrite) { - if (!m_ifc.vfs->toAddon->open_for_write) - return nullptr; - CVFSURLWrapper url2(url); - return m_ifc.vfs->toAddon->open_for_write(m_ifc.vfs, &url2.url, bOverWrite); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_open_for_write_v1( + m_instance, &url2.url, bOverWrite); } bool CVFSEntry::Exists(const CURL& url) { - if (!m_ifc.vfs->toAddon->exists) - return false; - CVFSURLWrapper url2(url); - return m_ifc.vfs->toAddon->exists(m_ifc.vfs, &url2.url); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_exists_v1(m_instance, &url2.url); } int CVFSEntry::Stat(const CURL& url, struct __stat64* buffer) { - int ret = -1; - if (!m_ifc.vfs->toAddon->stat) - return ret; - CVFSURLWrapper url2(url); - STAT_STRUCTURE statBuffer = {}; - ret = m_ifc.vfs->toAddon->stat(m_ifc.vfs, &url2.url, &statBuffer); + VFS_STAT_STRUCTURE statBuffer = {}; + int ret = + m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_stat_v1(m_instance, &url2.url, &statBuffer); buffer->st_dev = statBuffer.deviceId; buffer->st_ino = statBuffer.fileSerialNumber; @@ -314,64 +293,45 @@ int CVFSEntry::Stat(const CURL& url, struct __stat64* buffer) ssize_t CVFSEntry::Read(void* ctx, void* lpBuf, size_t uiBufSize) { - if (!m_ifc.vfs->toAddon->read) - return 0; - - return m_ifc.vfs->toAddon->read(m_ifc.vfs, ctx, static_cast(lpBuf), uiBufSize); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_read_v1( + m_instance, ctx, static_cast(lpBuf), uiBufSize); } ssize_t CVFSEntry::Write(void* ctx, const void* lpBuf, size_t uiBufSize) { - if (!m_ifc.vfs->toAddon->write) - return 0; - - return m_ifc.vfs->toAddon->write(m_ifc.vfs, ctx, static_cast(lpBuf), uiBufSize); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_write_v1( + m_instance, ctx, static_cast(lpBuf), uiBufSize); } int64_t CVFSEntry::Seek(void* ctx, int64_t position, int whence) { - if (!m_ifc.vfs->toAddon->seek) - return 0; - - return m_ifc.vfs->toAddon->seek(m_ifc.vfs, ctx, position, whence); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_seek_v1(m_instance, ctx, position, + whence); } int CVFSEntry::Truncate(void* ctx, int64_t size) { - if (!m_ifc.vfs->toAddon->truncate) - return 0; - - return m_ifc.vfs->toAddon->truncate(m_ifc.vfs, ctx, size); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_truncate_v1(m_instance, ctx, size); } void CVFSEntry::Close(void* ctx) { - if (m_ifc.vfs->toAddon->close) - m_ifc.vfs->toAddon->close(m_ifc.vfs, ctx); + m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_close_v1(m_instance, ctx); } int64_t CVFSEntry::GetPosition(void* ctx) { - if (!m_ifc.vfs->toAddon->get_position) - return 0; - - return m_ifc.vfs->toAddon->get_position(m_ifc.vfs, ctx); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_get_position_v1(m_instance, ctx); } int CVFSEntry::GetChunkSize(void* ctx) { - if (!m_ifc.vfs->toAddon->get_chunk_size) - return 0; - - return m_ifc.vfs->toAddon->get_chunk_size(m_ifc.vfs, ctx); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_get_chunk_size_v1(m_instance, ctx); } int64_t CVFSEntry::GetLength(void* ctx) { - if (!m_ifc.vfs->toAddon->get_length) - return 0; - - return m_ifc.vfs->toAddon->get_length(m_ifc.vfs, ctx); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_get_length_v1(m_instance, ctx); } int CVFSEntry::IoControl(void* ctx, XFILE::EIoControl request, void* param) @@ -380,21 +340,22 @@ int CVFSEntry::IoControl(void* ctx, XFILE::EIoControl request, void* param) { case XFILE::EIoControl::IOCTRL_SEEK_POSSIBLE: { - if (!m_ifc.vfs->toAddon->io_control_get_seek_possible) - return -1; - return m_ifc.vfs->toAddon->io_control_get_seek_possible(m_ifc.vfs, ctx) ? 1 : 0; + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_io_control_get_seek_possible_v1( + m_instance, ctx) + ? 1 + : 0; } case XFILE::EIoControl::IOCTRL_CACHE_STATUS: { - if (!m_ifc.vfs->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_ifc.vfs->toAddon->io_control_get_cache_status(m_ifc.vfs, 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_instance, ctx, &status) + ? 0 + : -1; if (ret >= 0) { kodiData->forward = status.forward; @@ -406,19 +367,19 @@ int CVFSEntry::IoControl(void* ctx, XFILE::EIoControl request, void* param) } case XFILE::EIoControl::IOCTRL_CACHE_SETRATE: { - if (!m_ifc.vfs->toAddon->io_control_set_cache_rate) - return -1; - uint32_t& iParam = *static_cast(param); - return m_ifc.vfs->toAddon->io_control_set_cache_rate(m_ifc.vfs, ctx, iParam) ? 1 : 0; + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_io_control_set_cache_rate_v1( + m_instance, ctx, iParam) + ? 1 + : 0; } case XFILE::EIoControl::IOCTRL_SET_RETRY: { - if (!m_ifc.vfs->toAddon->io_control_set_retry) - return -1; - bool& bParam = *static_cast(param); - return m_ifc.vfs->toAddon->io_control_set_retry(m_ifc.vfs, ctx, bParam) ? 0 : -1; + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_file_io_control_set_retry_v1( + m_instance, ctx, bParam) + ? 0 + : -1; } // Not by addon supported io's @@ -433,64 +394,48 @@ int CVFSEntry::IoControl(void* ctx, XFILE::EIoControl request, void* param) bool CVFSEntry::Delete(const CURL& url) { - if (!m_ifc.vfs->toAddon->delete_it) - return false; - CVFSURLWrapper url2(url); - return m_ifc.vfs->toAddon->delete_it(m_ifc.vfs, &url2.url); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_delete_it_v1(m_instance, &url2.url); } bool CVFSEntry::Rename(const CURL& url, const CURL& url2) { - if (!m_ifc.vfs->toAddon->rename) - return false; - CVFSURLWrapper url3(url); CVFSURLWrapper url4(url2); - return m_ifc.vfs->toAddon->rename(m_ifc.vfs, &url3.url, &url4.url); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_rename_v1(m_instance, &url3.url, + &url4.url); } void CVFSEntry::ClearOutIdle() { - if (m_ifc.vfs->toAddon->clear_out_idle) - m_ifc.vfs->toAddon->clear_out_idle(m_ifc.vfs); + m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_clear_out_idle_v1(m_instance); } void CVFSEntry::DisconnectAll() { - if (m_ifc.vfs->toAddon->disconnect_all) - m_ifc.vfs->toAddon->disconnect_all(m_ifc.vfs); + m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_disconnect_all_v1(m_instance); } bool CVFSEntry::DirectoryExists(const CURL& url) { - if (!m_ifc.vfs->toAddon->directory_exists) - return false; - CVFSURLWrapper url2(url); - return m_ifc.vfs->toAddon->directory_exists(m_ifc.vfs, &url2.url); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_directory_exists_v1(m_instance, &url2.url); } bool CVFSEntry::RemoveDirectory(const CURL& url) { - if (!m_ifc.vfs->toAddon->remove_directory) - return false; - CVFSURLWrapper url2(url); - return m_ifc.vfs->toAddon->remove_directory(m_ifc.vfs, &url2.url); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_directory_remove_v1(m_instance, &url2.url); } bool CVFSEntry::CreateDirectory(const CURL& url) { - if (!m_ifc.vfs->toAddon->create_directory) - return false; - CVFSURLWrapper url2(url); - return m_ifc.vfs->toAddon->create_directory(m_ifc.vfs, &url2.url); + return m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_directory_create_v1(m_instance, &url2.url); } static void VFSDirEntriesToCFileItemList(int num_entries, - VFSDirEntry* entries, + VFS_DIR_ENTRY* entries, CFileItemList& items) { for (int i=0;itoAddon->get_directory || !m_ifc.vfs->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_ifc.vfs->toAddon->get_directory(m_ifc.vfs, &url2.url, &entries, &num_entries, &callbacks); + bool ret = m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_directory_get_v1( + m_instance, &url2.url, &entries, &num_entries, ctx); if (ret) { VFSDirEntriesToCFileItemList(num_entries, entries, items); - m_ifc.vfs->toAddon->free_directory(m_ifc.vfs, entries, num_entries); + m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_directory_free_v1(entries, num_entries); } return ret; @@ -547,24 +482,24 @@ bool CVFSEntry::GetDirectory(const CURL& url, CFileItemList& items, bool CVFSEntry::ContainsFiles(const CURL& url, CFileItemList& items) { - if (!m_ifc.vfs->toAddon->contains_files || !m_ifc.vfs->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_ifc.vfs->toAddon->contains_files(m_ifc.vfs, &url2.url, &entries, &num_entries, rootpath); + bool ret = m_ifc->kodi_addoninstance_vfs_h->kodi_addon_vfs_directory_contains_files_v1( + m_instance, &url2.url, &entries, &num_entries, &rootpath); if (!ret) return false; VFSDirEntriesToCFileItemList(num_entries, entries, items); - m_ifc.vfs->toAddon->free_directory(m_ifc.vfs, 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; } @@ -706,10 +641,10 @@ bool CVFSEntryIDirectoryWrapper::GetDirectory(const CURL& url, return m_addon->GetDirectory(url, items, this); } -bool CVFSEntryIDirectoryWrapper::DoGetKeyboardInput(void* ctx, - const char* heading, - char** input, - bool hidden_input) +bool CVFSEntry::DoGetKeyboardInput(KODI_CTX_CB_HDL ctx, + const char* heading, + char** input, + bool hidden_input) { return static_cast(ctx)->GetKeyboardInput2(heading, input, hidden_input); } @@ -726,10 +661,11 @@ bool CVFSEntryIDirectoryWrapper::GetKeyboardInput2(const char* heading, return result; } -void CVFSEntryIDirectoryWrapper::DoSetErrorDialog(void* ctx, const char* heading, - const char* line1, - const char* line2, - const char* line3) +void CVFSEntry::DoSetErrorDialog(KODI_CTX_CB_HDL ctx, + const char* heading, + const char* line1, + const char* line2, + const char* line3) { static_cast(ctx)->SetErrorDialog2(heading, line1, line2, line3); @@ -750,8 +686,7 @@ void CVFSEntryIDirectoryWrapper::SetErrorDialog2(const char* heading, CVariant(std::string(line1)), l2, l3); } -void CVFSEntryIDirectoryWrapper::DoRequireAuthentication(void* ctx, - const char* url) +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 e7ec899315256..c83e70161ed26 100644 --- a/xbmc/addons/VFSEntry.h +++ b/xbmc/addons/VFSEntry.h @@ -7,11 +7,13 @@ #pragma once -#include "addons/binary-addons/AddonInstanceHandler.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/VFS.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" +#include "interface/InstanceHandler.h" #include @@ -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::IInstanceHandler { 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,26 @@ 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. @@ -223,25 +245,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 be9967314b220..09b0efb8581cd 100644 --- a/xbmc/addons/Visualization.cpp +++ b/xbmc/addons/Visualization.cpp @@ -8,42 +8,18 @@ #include "Visualization.h" +#include "addons/interface/api/addon-instance/visualization.h" #include "filesystem/SpecialProtocol.h" #include "guilib/GUIWindowManager.h" #include "utils/log.h" -namespace ADDON -{ +using namespace ADDON; +using namespace KODI::ADDONS; +using namespace KODI::ADDONS::INTERFACE; 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_ifc.visualization = new AddonInstance_Visualization; - - m_ifc.visualization->props = new AddonProps_Visualization(); - m_ifc.visualization->props->x = static_cast(x); - m_ifc.visualization->props->y = static_cast(y); - m_ifc.visualization->props->width = static_cast(w); - m_ifc.visualization->props->height = static_cast(h); - m_ifc.visualization->props->device = CServiceBroker::GetWinSystem()->GetHWContext(); - m_ifc.visualization->props->pixelRatio = - CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo().fPixelRatio; - m_ifc.visualization->props->name = m_name.c_str(); - m_ifc.visualization->props->presets = m_presetsPath.c_str(); - m_ifc.visualization->props->profile = m_profilePath.c_str(); - - m_ifc.visualization->toKodi = new AddonToKodiFuncTable_Visualization(); - m_ifc.visualization->toKodi->kodiInstance = this; - m_ifc.visualization->toKodi->transfer_preset = transfer_preset; - m_ifc.visualization->toKodi->clear_presets = clear_presets; - - m_ifc.visualization->toAddon = new KodiToAddonFuncTable_Visualization(); - + : IInstanceHandler(this, ADDON_INSTANCE_VISUALIZATION, addonInfo) +{ /* Open the class "kodi::addon::CInstanceVisualization" on add-on side */ if (CreateInstance() != ADDON_STATUS_OK) { @@ -52,115 +28,102 @@ CVisualization::CVisualization(const AddonInfoPtr& addonInfo, float x, float y, } /* presets becomes send with "transfer_preset" during call of function below */ - if (m_ifc.visualization->toAddon->get_presets) - m_ifc.visualization->toAddon->get_presets(m_ifc.visualization); + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + ifc->kodi_addon_visualization_get_presets_v1(m_instance); } CVisualization::~CVisualization() { /* Destroy the class "kodi::addon::CInstanceVisualization" on add-on side */ DestroyInstance(); - - delete m_ifc.visualization->toAddon; - delete m_ifc.visualization->toKodi; - delete m_ifc.visualization->props; - delete m_ifc.visualization; } -bool CVisualization::Start(int channels, int samplesPerSec, int bitsPerSample, const std::string& songName) +bool CVisualization::Start(int channels, + int samplesPerSec, + int bitsPerSample, + const std::string& songName) { - if (m_ifc.visualization->toAddon->start) - return m_ifc.visualization->toAddon->start(m_ifc.visualization, channels, samplesPerSec, - bitsPerSample, songName.c_str()); - return false; + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + return ifc->kodi_addon_visualization_start_v1(this, m_instance, channels, samplesPerSec, + bitsPerSample, songName.c_str()); } void CVisualization::Stop() { - if (m_ifc.visualization->toAddon->stop) - m_ifc.visualization->toAddon->stop(m_ifc.visualization); + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + ifc->kodi_addon_visualization_stop_v1(this, m_instance); } -void CVisualization::AudioData(const float* audioData, int audioDataLength, float *freqData, int freqDataLength) +void CVisualization::AudioData(const float* audioData, int audioDataLength) { - if (m_ifc.visualization->toAddon->audio_data) - m_ifc.visualization->toAddon->audio_data(m_ifc.visualization, audioData, audioDataLength, - freqData, freqDataLength); + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + ifc->kodi_addon_visualization_audio_data_v1(m_instance, audioData, audioDataLength); } bool CVisualization::IsDirty() { - if (m_ifc.visualization->toAddon->is_dirty) - return m_ifc.visualization->toAddon->is_dirty(m_ifc.visualization); - return false; + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + return ifc->kodi_addon_visualization_is_dirty_v1(m_instance); } void CVisualization::Render() { - if (m_ifc.visualization->toAddon->render) - m_ifc.visualization->toAddon->render(m_ifc.visualization); + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + ifc->kodi_addon_visualization_render_v1(this, m_instance); } -void CVisualization::GetInfo(VIS_INFO *info) +int CVisualization::GetSyncDelay() { - if (m_ifc.visualization->toAddon->get_info) - m_ifc.visualization->toAddon->get_info(m_ifc.visualization, info); + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + return ifc->kodi_addon_visualization_get_sync_delay_v1(m_instance); } bool CVisualization::NextPreset() { - if (m_ifc.visualization->toAddon->next_preset) - return m_ifc.visualization->toAddon->next_preset(m_ifc.visualization); - return false; + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + return ifc->kodi_addon_visualization_next_preset_v1(m_instance); } bool CVisualization::PrevPreset() { - if (m_ifc.visualization->toAddon->prev_preset) - return m_ifc.visualization->toAddon->prev_preset(m_ifc.visualization); - return false; + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + return ifc->kodi_addon_visualization_prev_preset_v1(m_instance); } bool CVisualization::LoadPreset(int select) { - if (m_ifc.visualization->toAddon->load_preset) - return m_ifc.visualization->toAddon->load_preset(m_ifc.visualization, select); - return false; + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + return ifc->kodi_addon_visualization_load_preset_v1(m_instance, select); } bool CVisualization::RandomPreset() { - if (m_ifc.visualization->toAddon->random_preset) - return m_ifc.visualization->toAddon->random_preset(m_ifc.visualization); - return false; + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + return ifc->kodi_addon_visualization_random_preset_v1(m_instance); } bool CVisualization::LockPreset() { - if (m_ifc.visualization->toAddon->lock_preset) - return m_ifc.visualization->toAddon->lock_preset(m_ifc.visualization); - return false; + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + return ifc->kodi_addon_visualization_lock_preset_v1(m_instance); } bool CVisualization::RatePreset(bool plus_minus) { - if (m_ifc.visualization->toAddon->rate_preset) - return m_ifc.visualization->toAddon->rate_preset(m_ifc.visualization, plus_minus); - return false; + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + return ifc->kodi_addon_visualization_rate_preset_v1(m_instance, plus_minus); } bool CVisualization::UpdateAlbumart(const char* albumart) { - if (m_ifc.visualization->toAddon->update_albumart) - return m_ifc.visualization->toAddon->update_albumart(m_ifc.visualization, albumart); - return false; + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + return ifc->kodi_addon_visualization_update_albumart_v1(m_instance, albumart); } -bool CVisualization::UpdateTrack(const VIS_TRACK* track) +bool CVisualization::UpdateTrack(const KODI_ADDON_VISUALIZATION_TRACK* track) { - if (m_ifc.visualization->toAddon->update_track) - return m_ifc.visualization->toAddon->update_track(m_ifc.visualization, track); - return false; + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + return ifc->kodi_addon_visualization_update_track_v1(m_instance, track); } bool CVisualization::HasPresets() @@ -168,7 +131,7 @@ bool CVisualization::HasPresets() return !m_presets.empty(); } -bool CVisualization::GetPresetList(std::vector &vecpresets) +bool CVisualization::GetPresetList(std::vector& vecpresets) { vecpresets = m_presets; return !m_presets.empty(); @@ -176,9 +139,8 @@ bool CVisualization::GetPresetList(std::vector &vecpresets) int CVisualization::GetActivePreset() { - if (m_ifc.visualization->toAddon->get_active_preset) - return m_ifc.visualization->toAddon->get_active_preset(m_ifc.visualization); - return -1; + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + return ifc->kodi_addon_visualization_get_active_preset_v1(m_instance); } std::string CVisualization::GetActivePresetName() @@ -190,33 +152,49 @@ std::string CVisualization::GetActivePresetName() bool CVisualization::IsLocked() { - if (m_ifc.visualization->toAddon->is_locked) - return m_ifc.visualization->toAddon->is_locked(m_ifc.visualization); - return false; + const auto ifc = m_ifc->kodi_addoninstance_visualization_h; + return ifc->kodi_addon_visualization_is_locked_v1(m_instance); } -void CVisualization::transfer_preset(void* kodiInstance, const char* preset) +bool CVisualization::GetOffscreenRenderInfos( + int& x, int& y, int& width, int& height, ADDON_HARDWARE_CONTEXT& context) { - CVisualization *addon = static_cast(kodiInstance); - if (!addon || !preset) - { - CLog::Log(LOGERROR, "CVisualization::{} - invalid handler data", __FUNCTION__); - return; - } + const auto winSystem = CServiceBroker::GetWinSystem(); + if (!winSystem) + return false; - addon->m_presets.emplace_back(preset); + x = 0; + y = 0; + context = winSystem->GetHWContext(); + width = winSystem->GetGfxContext().GetWidth(); + height = winSystem->GetGfxContext().GetHeight(); + + return true; } -void CVisualization::clear_presets(void* kodiInstance) +void CVisualization::get_properties(struct KODI_ADDON_VISUALIZATION_PROPS* props) { - CVisualization* addon = static_cast(kodiInstance); - if (!addon) - { - CLog::Log(LOGERROR, "CVisualization::{} - invalid handler data", __FUNCTION__); + if (!props) return; - } - addon->m_presets.clear(); + const auto winSystem = CServiceBroker::GetWinSystem(); + if (!winSystem) + return; + + props->x = 0; + props->y = 0; + props->device = winSystem->GetHWContext(); + props->width = winSystem->GetGfxContext().GetWidth(); + props->height = winSystem->GetGfxContext().GetHeight(); + props->pixelRatio = winSystem->GetGfxContext().GetResInfo().fPixelRatio; +} + +void CVisualization::transfer_preset(const char* preset) +{ + m_presets.emplace_back(preset); } -} /* namespace ADDON */ +void CVisualization::clear_presets() +{ + m_presets.clear(); +} diff --git a/xbmc/addons/Visualization.h b/xbmc/addons/Visualization.h index 43af24f006db4..da9d99c743de1 100644 --- a/xbmc/addons/Visualization.h +++ b/xbmc/addons/Visualization.h @@ -8,24 +8,28 @@ #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/IOffscreenRenderProcess.h" +#include "interface/InstanceHandler.h" -namespace ADDON +namespace KODI +{ +namespace ADDONS { -class CVisualization : public IAddonInstanceHandler +class CVisualization : public KODI::ADDONS::INTERFACE::IInstanceHandler, + public KODI::ADDONS::INTERFACE::IOffscreenRenderProcess { public: - CVisualization(const AddonInfoPtr& addonInfo, float x, float y, float w, float h); + CVisualization(const ADDON::AddonInfoPtr& addonInfo, float x, float y, float w, float h); ~CVisualization() override; bool Start(int channels, int samplesPerSec, int bitsPerSample, const std::string& songName); void Stop(); - void AudioData(const float* audioData, int audioDataLength, float *freqData, int freqDataLength); + void AudioData(const float* audioData, int audioDataLength); bool IsDirty(); void Render(); - void GetInfo(VIS_INFO *info); + int GetSyncDelay(); bool NextPreset(); bool PrevPreset(); bool LoadPreset(int select); @@ -33,22 +37,27 @@ class CVisualization : public IAddonInstanceHandler bool LockPreset(); bool RatePreset(bool plus_minus); bool UpdateAlbumart(const char* albumart); - bool UpdateTrack(const VIS_TRACK* track); + bool UpdateTrack(const KODI_ADDON_VISUALIZATION_TRACK* track); bool HasPresets(); bool GetPresetList(std::vector& vecpresets); int GetActivePreset(); std::string GetActivePresetName(); bool IsLocked(); + void get_properties(KODI_ADDON_VISUALIZATION_PROPS* props); + /*---AUTO_GEN_PARSE---*/ + void transfer_preset(const char* preset); + /*---AUTO_GEN_PARSE---*/ + void clear_presets(); + /*---AUTO_GEN_PARSE---*/ + +protected: + bool GetOffscreenRenderInfos( + int& x, int& y, int& width, int& height, ADDON_HARDWARE_CONTEXT& context) override; + 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 */ - - // 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); }; -} /* namespace ADDON */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/addoninfo/AddonInfo.cpp b/xbmc/addons/addoninfo/AddonInfo.cpp index babfaab16ba2a..5727ae52a649d 100644 --- a/xbmc/addons/addoninfo/AddonInfo.cpp +++ b/xbmc/addons/addoninfo/AddonInfo.cpp @@ -34,7 +34,7 @@ typedef struct } TypeMapping; // clang-format off -static constexpr const std::array types = +static constexpr const std::array types = {{ {"unknown", "", ADDON_UNKNOWN, 0, AddonInstanceSupport::SUPPORT_NONE, "" }, {"xbmc.metadata.scraper.albums", "", ADDON_SCRAPER_ALBUMS, 24016, AddonInstanceSupport::SUPPORT_NONE, "DefaultAddonAlbumInfo.png" }, @@ -76,6 +76,7 @@ static constexpr const std::array types = {"kodi.inputstream", "", ADDON_INPUTSTREAM, 24048, AddonInstanceSupport::SUPPORT_MANDATORY, "DefaultAddonInputstream.png" }, {"kodi.vfs", "", ADDON_VFS, 39013, AddonInstanceSupport::SUPPORT_MANDATORY, "DefaultAddonVfs.png" }, {"kodi.imagedecoder", "", ADDON_IMAGEDECODER, 39015, AddonInstanceSupport::SUPPORT_MANDATORY, "DefaultAddonImageDecoder.png" }, + {"kodi.web", "", ADDON_WEB_MANAGER, 29986, AddonInstanceSupport::SUPPORT_NONE, "DefaultAddonWeb.png" }, }}; // clang-format on @@ -169,7 +170,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/AddonInfoBuilder.cpp b/xbmc/addons/addoninfo/AddonInfoBuilder.cpp index e00266bca65f3..2eae8589ba3eb 100644 --- a/xbmc/addons/addoninfo/AddonInfoBuilder.cpp +++ b/xbmc/addons/addoninfo/AddonInfoBuilder.cpp @@ -8,7 +8,6 @@ #include "AddonInfoBuilder.h" -#include "CompileInfo.h" #include "LangInfo.h" #include "addons/addoninfo/AddonType.h" #include "filesystem/File.h" @@ -23,7 +22,6 @@ #include #include -#include namespace { @@ -146,6 +144,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. @@ -399,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)); } @@ -411,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)); } @@ -472,25 +472,19 @@ bool CAddonInfoBuilder::ParseXMLTypes(CAddonType& addonType, if (library != nullptr) { addonType.m_libname = library; + info->SetBinary(URIUtils::IsSharedLibrarySuffix(library)); - 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(library, libRegex)) - { - info->SetBinary(true); - CLog::Log(LOGDEBUG, "CAddonInfoBuilder::{}: Binary addon found: {}", __func__, - info->ID()); - } - } - catch (const std::regex_error& e) - { - CLog::Log(LOGERROR, "CAddonInfoBuilder::{}: Regex error caught: {}", __func__, - e.what()); - } + const char* language = child->Attribute("language"); + if (language) + addonType.SetLanguage(language); + else if (info->IsBinary()) + addonType.SetLanguage(AddonLanguage::CPP); + else + addonType.SetLanguage(DetectAddonLanguage(library)); + } + else if (addonType.Type() == ADDON_SKIN) + { + addonType.SetLanguage(AddonLanguage::Skin); } if (!ParseXMLExtension(addonType, child)) @@ -604,6 +598,32 @@ bool CAddonInfoBuilder::GetTextList(const TiXmlElement* element, const std::stri return !translatedValues.empty(); } +AddonLanguage CAddonInfoBuilder::DetectAddonLanguage(const std::string& library) +{ + AddonLanguage language = AddonLanguage::Unknown; + + const std::string ext = URIUtils::GetExtension(library); + if (ext.empty()) + return language; + + /*if (ext == ".py") + return AddonLanguage::Python3; + else */if (ext == ".java" || ext == ".jar") + return AddonLanguage::Java; + else if (ext == ".js") + return AddonLanguage::JavaScript; + else if (ext == ".exe") + return AddonLanguage::CPP; // Hopefully, but no matter there if C or C++ + else if (ext == ".groovy" || ext == ".gvy" || ext == ".gy" || ext == ".gsh") + return AddonLanguage::Groovy; + else if (ext == ".rb") + return AddonLanguage::Ruby; + else if (ext == ".xml") + return AddonLanguage::XML; + + return language; +} + const char* CAddonInfoBuilder::GetPlatformLibraryName(const TiXmlElement* element) { const char* libraryName; diff --git a/xbmc/addons/addoninfo/AddonInfoBuilder.h b/xbmc/addons/addoninfo/AddonInfoBuilder.h index 08fdaa6734305..4d263900e366e 100644 --- a/xbmc/addons/addoninfo/AddonInfoBuilder.h +++ b/xbmc/addons/addoninfo/AddonInfoBuilder.h @@ -98,6 +98,7 @@ class CAddonInfoBuilder static bool GetTextList(const TiXmlElement* element, const std::string& tag, std::unordered_map& translatedValues); static const char* GetPlatformLibraryName(const TiXmlElement* element); static bool PlatformSupportsAddon(const AddonInfoPtr& addon); + static AddonLanguage DetectAddonLanguage(const std::string& library); }; } diff --git a/xbmc/addons/addoninfo/AddonType.cpp b/xbmc/addons/addoninfo/AddonType.cpp index 0df7dda4f0a09..d08b1b09827ec 100644 --- a/xbmc/addons/addoninfo/AddonType.cpp +++ b/xbmc/addons/addoninfo/AddonType.cpp @@ -18,6 +18,29 @@ static const std::set dependencyTypes = { ADDON_SCRIPT_LIBRARY, ADDON_SCRIPT_MODULE, }; + +typedef struct +{ + AddonLanguage language; + std::string name; + int localizedStringID; +} LanguageMapping; + +// clang-format off +static const LanguageMapping languages[] = + {{ AddonLanguage::Unknown, "unknown", 2300 }, + { AddonLanguage::C, "C", 2301 }, + { AddonLanguage::CPP, "C++", 2302 }, + { AddonLanguage::Groovy, "Groovy", 2303 }, + { AddonLanguage::Java, "Java", 2304 }, + { AddonLanguage::JavaScript, "JavaScript", 2305 }, + { AddonLanguage::Python3, "Python3", 2306 }, + { AddonLanguage::Ruby, "Ruby", 2307 }, + { AddonLanguage::Skin, "Skin", 2308 }, + { AddonLanguage::XML, "XML", 2309 } + }; +// clang-format on + } /* namespace ADDON */ using namespace ADDON; @@ -29,6 +52,31 @@ 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; +} + +int CAddonType::LanguageLocalizedStringID() const +{ + for (const LanguageMapping& map : languages) + { + if (map.language == m_language) + return map.localizedStringID; + } + return languages[0].localizedStringID; +} + +void CAddonType::SetType(TYPE type) +{ + m_type = type; +} + void CAddonType::SetProvides(const std::string& content) { if (!content.empty()) @@ -52,6 +100,24 @@ void CAddonType::SetProvides(const std::string& content) } } +void CAddonType::SetLanguage(const std::string& name) +{ + for (const LanguageMapping& map : languages) + { + if (StringUtils::EqualsNoCase(map.name, name)) + { + m_language = map.language; + return; + } + } + m_language = AddonLanguage::Unknown; +} + +void CAddonType::SetLanguage(AddonLanguage lang) +{ + m_language = lang; +} + 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..f3f48a7bd6843 100644 --- a/xbmc/addons/addoninfo/AddonType.h +++ b/xbmc/addons/addoninfo/AddonType.h @@ -18,6 +18,20 @@ class TiXmlElement; namespace ADDON { +enum class AddonLanguage +{ + Unknown, + C, + CPP, + Groovy, + Java, + JavaScript, + Python3, + Ruby, + XML, + Skin +}; + typedef enum { ADDON_UNKNOWN, @@ -56,6 +70,7 @@ typedef enum ADDON_SCRIPT_MODULE, ADDON_GAME_CONTROLLER, ADDON_VIDEOCODEC, + ADDON_WEB_MANAGER, /** * @brief virtual addon types @@ -77,11 +92,14 @@ 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; + int LanguageLocalizedStringID() const; bool ProvidesSubContent(const TYPE& content) const { @@ -111,9 +129,13 @@ 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); + void SetLanguage(AddonLanguage lang); 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 882bb22a292dd..0000000000000 --- a/xbmc/addons/binary-addons/AddonDll.cpp +++ /dev/null @@ -1,548 +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_ADDON_INSTANCE_STRUCT* 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); - - // "C" ABI related call, if on add-on used. - if (status == ADDON_STATUS_OK && m_interface.toAddon->create) - status = m_interface.toAddon->create(m_interface.firstKodiInstance, &m_interface.addonBase); - - if (status == ADDON_STATUS_OK) - { - m_initialized = true; - } - else if (status == ADDON_STATUS_NEED_SETTINGS) - { - if ((status = TransferSettings(ADDON_SETTINGS_ID)) == ADDON_STATUS_OK) - m_initialized = true; - else - new CAddonStatusHandler(ID(), ADDON_SETTINGS_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_interface.addonBase); - 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(ADDON_SETTINGS_ID); - - m_initialized = false; -} - -ADDON_STATUS CAddonDll::CreateInstance(KODI_ADDON_INSTANCE_STRUCT* instance) -{ - assert(instance != nullptr); - assert(instance->functions != nullptr); - assert(instance->info != nullptr); - assert(instance->info->functions != nullptr); - - 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(instance->info->type)) - return ADDON_STATUS_PERMANENT_FAILURE; - - status = m_interface.toAddon->create_instance(m_interface.addonBase, instance); - - if (instance->info) - { - m_usedInstances[instance->info->kodi] = instance; - } - - return status; -} - -void CAddonDll::DestroyInstance(KODI_ADDON_INSTANCE_STRUCT* instance) -{ - if (m_usedInstances.empty()) - return; - - auto it = m_usedInstances.find(instance->info->kodi); - if (it != m_usedInstances.end()) - { - m_interface.toAddon->destroy_instance(m_interface.addonBase, it->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(AddonInstanceId id /* = ADDON_SETTINGS_ID */) -{ - // must save first, as TransferSettings() reloads saved settings! - CAddon::SaveSettings(id); - if (m_initialized) - TransferSettings(id); -} - -ADDON_STATUS CAddonDll::TransferSettings(AddonInstanceId instanceId) -{ - bool restart = false; - ADDON_STATUS reportStatus = ADDON_STATUS_OK; - - CLog::Log(LOGDEBUG, "Calling TransferSettings for: {}", Name()); - - LoadSettings(false, true, instanceId); - - auto settings = GetSettings(instanceId); - if (settings != nullptr) - { - KODI_ADDON_INSTANCE_FUNC* instanceTarget{nullptr}; - KODI_ADDON_INSTANCE_HDL instanceHandle{nullptr}; - if (instanceId != ADDON_SETTINGS_ID) - { - const auto it = std::find_if( - m_usedInstances.begin(), m_usedInstances.end(), - [instanceId](const auto& data) { return data.second->info->number == instanceId; }); - if (it == m_usedInstances.end()) - return ADDON_STATUS_UNKNOWN; - - instanceTarget = it->second->functions; - instanceHandle = it->second->hdl; - } - - for (const auto& section : settings->GetSections()) - { - for (const auto& category : section->GetCategories()) - { - for (const auto& group : category->GetGroups()) - { - for (const auto& setting : group->GetSettings()) - { - if (StringUtils::StartsWith(setting->GetId(), ADDON_SETTING_INSTANCE_GROUP)) - continue; // skip internal settings - - 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(); - if (instanceId == ADDON_SETTINGS_ID) - { - if (m_interface.toAddon->setting_change_boolean) - status = - m_interface.toAddon->setting_change_boolean(m_interface.addonBase, id, tmp); - } - else if (instanceTarget && instanceHandle) - { - if (instanceTarget->instance_setting_change_boolean) - status = - instanceTarget->instance_setting_change_boolean(instanceHandle, id, tmp); - } - break; - } - - case SettingType::Integer: - { - int tmp = std::static_pointer_cast(setting)->GetValue(); - if (instanceId == ADDON_SETTINGS_ID) - { - if (m_interface.toAddon->setting_change_integer) - status = - m_interface.toAddon->setting_change_integer(m_interface.addonBase, id, tmp); - } - else if (instanceTarget && instanceHandle) - { - if (instanceTarget->instance_setting_change_integer) - status = - instanceTarget->instance_setting_change_integer(instanceHandle, id, tmp); - } - break; - } - - case SettingType::Number: - { - float tmpf = static_cast(std::static_pointer_cast(setting)->GetValue()); - if (instanceId == ADDON_SETTINGS_ID) - { - if (m_interface.toAddon->setting_change_float) - status = - m_interface.toAddon->setting_change_float(m_interface.addonBase, id, tmpf); - } - else if (instanceTarget && instanceHandle) - { - if (instanceTarget->instance_setting_change_float) - status = - instanceTarget->instance_setting_change_float(instanceHandle, id, tmpf); - } - break; - } - - case SettingType::String: - { - if (instanceId == ADDON_SETTINGS_ID) - { - if (m_interface.toAddon->setting_change_string) - status = m_interface.toAddon->setting_change_string( - m_interface.addonBase, id, - std::static_pointer_cast(setting)->GetValue().c_str()); - } - else if (instanceTarget && instanceHandle) - { - if (instanceTarget->instance_setting_change_string) - status = instanceTarget->instance_setting_change_string( - instanceHandle, 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()); - if (instanceId == ADDON_SETTINGS_ID) - { - if (m_interface.toAddon->setting_change_string) - status = m_interface.toAddon->setting_change_string( - m_interface.addonBase, id, setting->ToString().c_str()); - } - else if (instanceTarget && instanceHandle) - { - if (instanceTarget->instance_setting_change_string) - status = instanceTarget->instance_setting_change_string( - instanceHandle, 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(), instanceId, 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(); - if (eventLog) - 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 701900fe89d22..0000000000000 --- a/xbmc/addons/binary-addons/AddonDll.h +++ /dev/null @@ -1,159 +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 = 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 ~CAddonDllInformer() = default; - - 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(AddonInstanceId id = ADDON_SETTINGS_ID) 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,out] instance The for addon used data structure for active instance - * @return The status of addon after the creation. - */ - ADDON_STATUS CreateInstance(KODI_ADDON_INSTANCE_STRUCT* instance); - - /*! - * @brief Function to destroy a on addon created instance class - * - * @param[in] instance The for addon used data structure for active instance - */ - void DestroyInstance(KODI_ADDON_INSTANCE_STRUCT* instance); - - 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_ADDON_INSTANCE_STRUCT* 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(AddonInstanceId instanceId); - - /*! - * 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 b1576e592cd7c..0000000000000 --- a/xbmc/addons/binary-addons/AddonInstanceHandler.cpp +++ /dev/null @@ -1,380 +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 "addons/settings/AddonSettings.h" -#include "filesystem/Directory.h" -#include "filesystem/SpecialProtocol.h" -#include "utils/StringUtils.h" -#include "utils/log.h" - -#include - -namespace ADDON -{ - -CCriticalSection IAddonInstanceHandler::m_cdSec; - -IAddonInstanceHandler::IAddonInstanceHandler( - ADDON_TYPE type, - const AddonInfoPtr& addonInfo, - AddonInstanceId instanceId /* = ADDON_INSTANCE_ID_UNUSED */, - KODI_HANDLE parentInstance /* = nullptr*/, - const std::string& uniqueWorkID /* = ""*/) - : m_type(type), m_instanceId(instanceId), 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_uniqueWorkID = !uniqueWorkID.empty() ? uniqueWorkID : StringUtils::Format("{}", fmt::ptr(this)); - m_addonBase = CServiceBroker::GetBinaryAddonManager().GetAddonBase(addonInfo, this, m_addon); - - KODI_ADDON_INSTANCE_INFO* info = new KODI_ADDON_INSTANCE_INFO(); - info->number = m_instanceId; // @todo change within next big API change to "instance_id" - info->id = m_uniqueWorkID.c_str(); // @todo change within next big API change to "unique_work_id" - info->version = kodi::addon::GetTypeVersion(m_type); - info->type = m_type; - info->kodi = this; - info->parent = m_parentInstance; - info->first_instance = m_addon && !m_addon->Initialized(); - info->functions = new KODI_ADDON_INSTANCE_FUNC_CB(); - info->functions->get_instance_user_path = get_instance_user_path; - info->functions->is_instance_setting_using_default = is_instance_setting_using_default; - info->functions->get_instance_setting_bool = get_instance_setting_bool; - info->functions->get_instance_setting_int = get_instance_setting_int; - info->functions->get_instance_setting_float = get_instance_setting_float; - info->functions->get_instance_setting_string = get_instance_setting_string; - info->functions->set_instance_setting_bool = set_instance_setting_bool; - info->functions->set_instance_setting_int = set_instance_setting_int; - info->functions->set_instance_setting_float = set_instance_setting_float; - info->functions->set_instance_setting_string = set_instance_setting_string; - m_ifc.info = info; - m_ifc.functions = new KODI_ADDON_INSTANCE_FUNC(); -} - -IAddonInstanceHandler::~IAddonInstanceHandler() -{ - CServiceBroker::GetBinaryAddonManager().ReleaseAddonBase(m_addonBase, this); - - delete m_ifc.functions; - if (m_ifc.info) - delete m_ifc.info->functions; - delete m_ifc.info; -} - -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() -{ - if (!m_addon) - return ADDON_STATUS_UNKNOWN; - - std::unique_lock lock(m_cdSec); - - ADDON_STATUS status = m_addon->CreateInstance(&m_ifc); - if (status != ADDON_STATUS_OK) - { - CLog::Log(LOGERROR, - "IAddonInstanceHandler::{}: {} returned bad status \"{}\" during instance creation", - __func__, m_addon->ID(), kodi::addon::TranslateAddonStatus(status)); - } - return status; -} - -void IAddonInstanceHandler::DestroyInstance() -{ - std::unique_lock lock(m_cdSec); - if (m_addon) - m_addon->DestroyInstance(&m_ifc); -} - -std::shared_ptr IAddonInstanceHandler::GetSetting(const std::string& setting) -{ - if (!m_addon->HasSettings(m_instanceId)) - { - CLog::Log(LOGERROR, "IAddonInstanceHandler::{} - couldn't get settings for add-on '{}'", - __func__, Name()); - return nullptr; - } - - auto value = m_addon->GetSettings(m_instanceId)->GetSetting(setting); - if (value == nullptr) - { - CLog::Log(LOGERROR, "IAddonInstanceHandler::{} - can't find setting '{}' in '{}'", __func__, - setting, Name()); - return nullptr; - } - - return value; -} - -char* IAddonInstanceHandler::get_instance_user_path(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl) -{ - IAddonInstanceHandler* instance = static_cast(hdl); - if (!instance) - return nullptr; - - const std::string path = CSpecialProtocol::TranslatePath(instance->m_addon->Profile()); - - XFILE::CDirectory::Create(path); - return strdup(path.c_str()); -} - -bool IAddonInstanceHandler::is_instance_setting_using_default( - const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id) -{ - IAddonInstanceHandler* instance = static_cast(hdl); - if (!instance || !id) - return false; - - auto setting = instance->GetSetting(id); - if (setting == nullptr) - return false; - - return setting->IsDefault(); -} - -bool IAddonInstanceHandler::get_instance_setting_bool(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - bool* value) -{ - IAddonInstanceHandler* instance = static_cast(hdl); - if (!instance || !id || !value) - return false; - - auto setting = instance->GetSetting(id); - if (setting == nullptr) - return false; - - if (setting->GetType() != SettingType::Boolean) - { - CLog::Log(LOGERROR, "IAddonInstanceHandler::{} - setting '{}' is not a boolean in '{}'", - __func__, id, instance->Name()); - return false; - } - - *value = std::static_pointer_cast(setting)->GetValue(); - return true; -} - -bool IAddonInstanceHandler::get_instance_setting_int(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - int* value) -{ - IAddonInstanceHandler* instance = static_cast(hdl); - if (!instance || !id || !value) - return false; - - auto setting = instance->GetSetting(id); - if (setting == nullptr) - return false; - - if (setting->GetType() != SettingType::Integer && setting->GetType() != SettingType::Number) - { - CLog::Log(LOGERROR, "IAddonInstanceHandler::{} - setting '{}' is not a integer in '{}'", - __func__, id, instance->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 IAddonInstanceHandler::get_instance_setting_float(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - float* value) -{ - IAddonInstanceHandler* instance = static_cast(hdl); - if (!instance || !id || !value) - return false; - - auto setting = instance->GetSetting(id); - if (setting == nullptr) - return false; - - if (setting->GetType() != SettingType::Number) - { - CLog::Log(LOGERROR, "IAddonInstanceHandler::{} - setting '{}' is not a number in '{}'", - __func__, id, instance->Name()); - return false; - } - - *value = static_cast(std::static_pointer_cast(setting)->GetValue()); - return true; -} - -bool IAddonInstanceHandler::get_instance_setting_string(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - char** value) -{ - IAddonInstanceHandler* instance = static_cast(hdl); - if (!instance || !id || !value) - return false; - - auto setting = instance->GetSetting(id); - if (setting == nullptr) - return false; - - if (setting->GetType() != SettingType::String) - { - CLog::Log(LOGERROR, "IAddonInstanceHandler::{} - setting '{}' is not a string in '{}'", - __func__, id, instance->Name()); - return false; - } - - *value = strdup(std::static_pointer_cast(setting)->GetValue().c_str()); - return true; -} - -bool IAddonInstanceHandler::set_instance_setting_bool(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - bool value) -{ - IAddonInstanceHandler* instance = static_cast(hdl); - if (!instance || !id) - return false; - - if (Interface_Base::UpdateSettingInActiveDialog(instance->m_addon.get(), instance->m_instanceId, - id, value ? "true" : "false")) - return true; - - if (!instance->m_addon->UpdateSettingBool(id, value, instance->m_instanceId)) - { - CLog::Log(LOGERROR, "IAddonInstanceHandler::{} - invalid setting type", __func__); - return false; - } - - instance->m_addon->SaveSettings(instance->m_instanceId); - - return true; -} - -bool IAddonInstanceHandler::set_instance_setting_int(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - int value) -{ - IAddonInstanceHandler* instance = static_cast(hdl); - if (!instance || !id) - { - CLog::Log(LOGERROR, "IAddonInstanceHandler::{} - invalid data (instance='{}', id='{}')", - __func__, hdl, static_cast(id)); - - return false; - } - - if (Interface_Base::UpdateSettingInActiveDialog(instance->m_addon.get(), instance->m_instanceId, - id, std::to_string(value))) - return true; - - if (!instance->m_addon->UpdateSettingInt(id, value, instance->m_instanceId)) - { - CLog::Log(LOGERROR, "IAddonInstanceHandler::{} - invalid setting type", __func__); - return false; - } - - instance->m_addon->SaveSettings(instance->m_instanceId); - - return true; -} - -bool IAddonInstanceHandler::set_instance_setting_float(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - float value) -{ - IAddonInstanceHandler* instance = static_cast(hdl); - if (!instance || !id) - { - CLog::Log(LOGERROR, "IAddonInstanceHandler::{} - invalid data (instance='{}', id='{}')", - __func__, hdl, static_cast(id)); - - return false; - } - - if (Interface_Base::UpdateSettingInActiveDialog(instance->m_addon.get(), instance->m_instanceId, - id, StringUtils::Format("{:f}", value))) - return true; - - if (!instance->m_addon->UpdateSettingNumber(id, static_cast(value), - instance->m_instanceId)) - { - CLog::Log(LOGERROR, "IAddonInstanceHandler::{} - invalid setting type", __func__); - return false; - } - - instance->m_addon->SaveSettings(instance->m_instanceId); - - return true; -} - -bool IAddonInstanceHandler::set_instance_setting_string(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - const char* value) -{ - IAddonInstanceHandler* instance = static_cast(hdl); - if (!instance || !id || !value) - { - CLog::Log(LOGERROR, - "IAddonInstanceHandler::{} - invalid data (instance='{}', id='{}', value='{}')", - __func__, hdl, static_cast(id), static_cast(value)); - - return false; - } - - if (Interface_Base::UpdateSettingInActiveDialog(instance->m_addon.get(), instance->m_instanceId, - id, value)) - return true; - - if (!instance->m_addon->UpdateSettingString(id, value, instance->m_instanceId)) - { - CLog::Log(LOGERROR, "IAddonInstanceHandler::{} - invalid setting type", __func__); - return false; - } - - instance->m_addon->SaveSettings(instance->m_instanceId); - - return true; -} - -} /* namespace ADDON */ diff --git a/xbmc/addons/binary-addons/AddonInstanceHandler.h b/xbmc/addons/binary-addons/AddonInstanceHandler.h deleted file mode 100644 index 6f2ed739140fd..0000000000000 --- a/xbmc/addons/binary-addons/AddonInstanceHandler.h +++ /dev/null @@ -1,124 +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 - -class CSetting; - -namespace ADDON -{ - -class IAddonInstanceHandler -{ -public: - /** - * @brief Class constructor for handling add-on instance processes, allowing - * an add-on to handle multiple work simultaneously and independently. - * - * @param[in] type The associated add-on type which is processed in the running - * instance. - * @param[in] addonInfo Class for querying available add-on information (e.g. - * content declared in addon.xml). - * @param[in] parentInstance *[opt]* Above running add-on instance which starts this - * instance. Used to have the associated class for - * work to open in the add-on.\n\n - * **Currently used values:** - * | Parent | Target | Description - * |--------|--------|------------- - * | @ref kodi::addon::CInstanceInputStream | @ref kodi::addon::CInstanceVideoCodec | In order to be able to access the overlying input stream instance in the video codec created by Kodi on the add-on. - * @param[in] uniqueWorkID *[opt]* Identification value intended to pass any special - * values to the instance to be opened. - * If not used, the IAddonInstanceHandler class pointer - * is used as a string.\n\n - * **Currently used values:** - * | Add-on instance type | Description - * |----------------------|--------------------- - * | @ref kodi::addon::CInstanceInputStream "Inputstream" | To transfer special values to inputstream using the property @ref STREAM_PROPERTY_INPUTSTREAM_INSTANCE_ID from external space, for example PVR add-on which also supports inputstream can exchange special values with it, e.g. select the necessary add-on processing class, since it is not known at the start what is being executed ( live TV, radio, recordings...) and add-on may use different classes. - * | All other | The used class pointer of Kodi's @ref IAddonInstanceHandler is used as a value to have an individually different value. - */ - IAddonInstanceHandler(ADDON_TYPE type, - const AddonInfoPtr& addonInfo, - AddonInstanceId instanceId = ADDON_INSTANCE_ID_UNUSED, - KODI_HANDLE parentInstance = nullptr, - const std::string& uniqueWorkID = ""); - virtual ~IAddonInstanceHandler(); - - ADDON_TYPE UsedType() const { return m_type; } - AddonInstanceId InstanceId() const { return m_instanceId; } - const std::string& UniqueWorkID() { return m_uniqueWorkID; } - - 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(); - 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() {} - -protected: - KODI_ADDON_INSTANCE_INFO m_info{}; - KODI_ADDON_INSTANCE_STRUCT m_ifc{}; - -private: - std::shared_ptr GetSetting(const std::string& setting); - - static char* get_instance_user_path(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl); - static bool is_instance_setting_using_default(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id); - static bool get_instance_setting_bool(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - bool* value); - static bool get_instance_setting_int(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - int* value); - static bool get_instance_setting_float(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - float* value); - static bool get_instance_setting_string(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - char** value); - static bool set_instance_setting_bool(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - bool value); - static bool set_instance_setting_int(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - int value); - static bool set_instance_setting_float(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - float value); - static bool set_instance_setting_string(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - const char* value); - - const ADDON_TYPE m_type; - const AddonInstanceId m_instanceId; - std::string m_uniqueWorkID; - 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 44ce3220b0292..0000000000000 --- a/xbmc/addons/binary-addons/BinaryAddonBase.cpp +++ /dev/null @@ -1,105 +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 "utils/log.h" - -#include - -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; - } - - std::unique_lock 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; - } - - std::unique_lock 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 information - if (m_activeAddonHandlers.empty()) - { - m_activeAddon.reset(); - } -} - -size_t CBinaryAddonBase::UsedInstanceCount() const -{ - std::unique_lock lock(m_critSection); - return m_activeAddonHandlers.size(); -} - -AddonDllPtr CBinaryAddonBase::GetActiveAddon() -{ - std::unique_lock 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 6593bc362394e..0000000000000 --- a/xbmc/addons/binary-addons/BinaryAddonManager.cpp +++ /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. - */ - -#include "BinaryAddonManager.h" - -#include "BinaryAddonBase.h" -#include "utils/log.h" - -#include - -using namespace ADDON; - -BinaryAddonBasePtr CBinaryAddonManager::GetAddonBase(const AddonInfoPtr& addonInfo, - IAddonInstanceHandler* handler, - AddonDllPtr& addon) -{ - std::unique_lock 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 -{ - std::unique_lock 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 -{ - std::unique_lock 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 dbcf89301e3f6..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) = 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_METHOD1(ADDON_STATUS, Create, (void* p1)) - 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/interface/CMakeLists.txt b/xbmc/addons/interface/CMakeLists.txt new file mode 100644 index 0000000000000..f98a4dbf5f36a --- /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 + IMsgHdl.cpp + IOffscreenRenderProcess.cpp + InstanceHandler.cpp + Interface.cpp + RunningProcess.cpp + RunningThread.cpp +) + +set(HEADERS + Controller.h + IMsgHdl.h + IOffscreenRenderProcess.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..fd02205fcc3a6 --- /dev/null +++ b/xbmc/addons/interface/Controller.cpp @@ -0,0 +1,308 @@ +/* + * 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 "AppParams.h" +#include "Application.h" +#include "CompileInfo.h" +#include "ServiceBroker.h" +#include "addons/interface/RunningProcess.h" +#include "addons/interface/gui/GUIDialogCrashReporter.h" +#include "filesystem/Directory.h" +#include "filesystem/File.h" +#include "filesystem/SpecialProtocol.h" +#include "settings/AdvancedSettings.h" +#include "settings/SettingsComponent.h" +#include "utils/StringUtils.h" +#include "utils/URIUtils.h" +#include "utils/log.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_devkitPath(CSpecialProtocol::TranslatePath("special://xbmcbinaddons/kodi.binary.devkit/")), + m_devkitLib(CSpecialProtocol::TranslatePath( + "special://xbmcbinaddons/kodi.binary.devkit/" DEVKIT_LIBRARY)), + m_devkitLaunchExe(CSpecialProtocol::TranslatePath( + "special://xbmcbinaddons/kodi.binary.devkit/" DEVKIT_LAUNCH_EXE)), + m_devkitReportPath(CSpecialProtocol::TranslatePath("special://temp")) +{ +} + +CController::~CController() +{ + Deinit(); +} + +bool CController::Init() +{ + using namespace XFILE; + + if (!CFile::Exists(m_devkitLib, false)) + { + CLog::Log(LOGFATAL, "Needed DevKit library {} not present!", m_devkitLib); + return false; + } + if (!CFile::Exists(m_devkitLaunchExe, false)) + { + CLog::Log(LOGFATAL, "Needed DevKit help launch executable {} not present!", m_devkitLaunchExe); + return false; + } + + CThread::Create(); + m_running = true; + m_onSystemStop = false; + return true; +} + +void CController::Deinit() +{ + if (m_running) + { + m_running = false; + CThread::StopThread(); + } +} + +void CController::StopReport() +{ + std::unique_lock lock(m_lock); + m_onSystemStop = true; +} + +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(), CheckNoSandboxUsage(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, + IInstanceHandler* handler, + const KODI_ADDON_INSTANCE_INFO* firstInstance, + std::shared_ptr& addon) +{ + + std::shared_ptr newProcess; + + { + std::unique_lock lock(m_lock); + + 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(), + CheckNoSandboxUsage(addon), firstInstance); + std::vector argv; + if (!newProcess->Launch(argv, false)) + { + return nullptr; + } + + m_runningProcesses.emplace(addonInfo->ID(), newProcess); + } + } + + newProcess->SetEndtime(3000); + 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, + IInstanceHandler* 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. + */ + const ChildStatus status = it->second->ProcessActive(); + if (status != ChildStatus::Running) + { + const auto addonId = it->second->GetAddonID(); + + CLog::Log(LOGFATAL, "CController::{}: Addon '{}' process was uncontrolled stopped!", + __func__, addonId); + it->second->InformStopReport(status); + it->second->Kill(); + + const auto uuid = it->second->GetUUID(); + const auto stacktrace = it->second->GetStackTrace(); + + m_runningProcesses.erase(it++); + + /* + * Check for case user interrupt Kodi with a e.g. Strg+C + * and not start a GUI in this case! + */ + if (!m_onSystemStop) + { + // Show Dialog with a non blocking call and to have this thread further available + MESSAGING::HELPERS::ShowReportCrashDialog(std::move(addonId), std::move(uuid), std::move(stacktrace)); + } + 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() == 0ms) + { + 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::CheckNoSandboxUsage(const std::shared_ptr& addon) +{ + if (CServiceBroker::GetAppParams()->IsNoSandbox()) + return true; + + const std::string path = addon->Type(addon->MainType())->LibPath(); + if (URIUtils::IsSharedLibrarySuffix(path)) + { + const auto advanced = CServiceBroker::GetSettingsComponent()->GetAdvancedSettings(); + return !advanced->m_addonsSimulateBinaryLibAsExe; + } + + 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..cfde17a1d7d70 --- /dev/null +++ b/xbmc/addons/interface/Controller.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 "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 IInstanceHandler; + +class CController : private CThread +{ +public: + CController(ADDON::CAddonMgr& addonMgr); + ~CController(); + + bool Init(); + void Deinit(); + void StopReport(); + + 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, + IInstanceHandler* handler, + const KODI_ADDON_INSTANCE_INFO* firstInstance, + std::shared_ptr& addon); + void ReleaseAddonProcess(const std::shared_ptr& process, + IInstanceHandler* 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& GetDevkitPath() const { return m_devkitPath; } + const std::string& GetDevkitLibPath() const { return m_devkitLib; } + const std::string& GetDevkitLaunchExe() const { return m_devkitLaunchExe; } + const std::string& GetDevkitReportPath() const { return m_devkitReportPath; } + +private: + void Process() override; + + bool CheckNoSandboxUsage(const std::shared_ptr& addon); + + ADDON::CAddonMgr& m_addonMgr; + const std::string m_devkitPath; + const std::string m_devkitLib; + const std::string m_devkitLaunchExe; + const std::string m_devkitReportPath; + std::atomic_bool m_running{false}; + bool m_onSystemStop{false}; + mutable std::mutex m_lock; + std::map> m_runningProcesses; +}; + +} /* 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..98b8f6f301a60 --- /dev/null +++ b/xbmc/addons/interface/IMsgHdl.cpp @@ -0,0 +1,25 @@ +/* + * 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/IOffscreenRenderProcess.cpp b/xbmc/addons/interface/IOffscreenRenderProcess.cpp new file mode 100644 index 0000000000000..1bf42832c0efb --- /dev/null +++ b/xbmc/addons/interface/IOffscreenRenderProcess.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 "IOffscreenRenderProcess.h" +#include "addons/interface/RunningProcess.h" +#include "utils/StringUtils.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +namespace +{ +static uint64_t nextUsableId = 0; +} /* namespace */ + +IOffscreenRenderProcess::IOffscreenRenderProcess() + : m_usedId(nextUsableId++) +{ +} + +bool IOffscreenRenderProcess::CreateRenderHelper(CRunningProcess* process) +{ + if (m_renderHelper) + return true; + + const std::string id = StringUtils::Format("{}-{:04}", process->GetUUID(), m_usedId); + m_renderHelper = std::make_unique(id); + return true; +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/IOffscreenRenderProcess.h b/xbmc/addons/interface/IOffscreenRenderProcess.h new file mode 100644 index 0000000000000..5157151bed480 --- /dev/null +++ b/xbmc/addons/interface/IOffscreenRenderProcess.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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/interface/renderer/IRenderHelper.h" +#include "addons/kodi-dev-kit/src/shared/SharedGL.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon_base.h" + +#include + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CRunningProcess; + +class IOffscreenRenderProcess +{ +public: + IOffscreenRenderProcess(); + virtual ~IOffscreenRenderProcess() = default; + virtual bool GetOffscreenRenderInfos(int& x, int& y, int& width, int& height, ADDON_HARDWARE_CONTEXT& context) = 0; + + uint64_t GetUsedId() const { return m_usedId; } + void SetAddonOffscreenHdl(uint64_t hdl) { m_addonHdl = hdl; } + uint64_t GetAddonOffscreenHdl() const { return m_addonHdl; } + bool CreateRenderHelper(CRunningProcess* process); + IRenderHelper* GetRenderHelper() { return m_renderHelper.get(); } + +private: + const uint64_t m_usedId; + uint64_t m_addonHdl{0}; + + std::unique_ptr m_renderHelper; +}; + +} /* 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..6e23c36949f30 --- /dev/null +++ b/xbmc/addons/interface/InstanceHandler.cpp @@ -0,0 +1,323 @@ +/* + * 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 "ServiceBroker.h" +#include "addons/interface/Controller.h" +#include "addons/interface/api/addon_base.h" +#include "addons/settings/AddonSettings.h" +#include "filesystem/Directory.h" +#include "filesystem/SpecialProtocol.h" +#include "utils/StringUtils.h" +#include "utils/log.h" + +using namespace ADDON; +using namespace KODI::ADDONS::INTERFACE; + +std::mutex IInstanceHandler::m_cdSec; + +IInstanceHandler::IInstanceHandler(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + KODI_ADDON_INSTANCE_TYPE type, + const AddonInfoPtr& addonInfo, + AddonInstanceId instanceId /* = ADDON_INSTANCE_ID_UNUSED */, + KODI_HANDLE parentInstance /* = nullptr*/, + const std::string& uniqueWorkID /* = ""*/) + : m_type(type), m_instanceId(instanceId), 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_uniqueWorkID = !uniqueWorkID.empty() ? uniqueWorkID : StringUtils::Format("{}", fmt::ptr(this)); + + m_info.instance_id = instanceId; + m_info.unique_work_id = m_uniqueWorkID.c_str(); + m_info.type = m_type; + m_info.kodi = hdl; + m_info.parent = m_parentInstance; +} + +IInstanceHandler::~IInstanceHandler() +{ +} + +std::string IInstanceHandler::ID() const +{ + return m_addonInfo ? m_addonInfo->ID() : ""; +} + +std::string IInstanceHandler::Name() const +{ + return m_addonInfo ? m_addonInfo->Name() : ""; +} + +std::string IInstanceHandler::Author() const +{ + return m_addonInfo ? m_addonInfo->Author() : ""; +} + +std::string IInstanceHandler::Icon() const +{ + return m_addonInfo ? m_addonInfo->Icon() : ""; +} + +std::string IInstanceHandler::Path() const +{ + return m_addonInfo ? m_addonInfo->Path() : ""; +} + +std::string IInstanceHandler::Profile() const +{ + return m_addonInfo ? m_addonInfo->ProfilePath() : ""; +} + +AddonVersion IInstanceHandler::Version() const +{ + return m_addonInfo ? m_addonInfo->Version() : AddonVersion(); +} + +ADDON_STATUS IInstanceHandler::CreateInstance() +{ + m_process = + CServiceBroker::GetAddonIfcCtrl().GetAddonProcess(m_addonInfo, this, &m_info, m_addon); + if (!m_process) + { + CLog::Log(LOGERROR, + "IInstanceHandler::{}: {} 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_info, &m_instance); + if (status != ADDON_STATUS_OK) + { + CLog::Log(LOGERROR, + "IInstanceHandler::{}: {} returned bad status \"{}\" during instance creation", + __func__, m_addonInfo->ID(), status); + } + return status; +} + +void IInstanceHandler::DestroyInstance() +{ + 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_info, m_instance); + m_ifc = nullptr; + } + + CServiceBroker::GetAddonIfcCtrl().ReleaseAddonProcess(m_process, this); + m_process = nullptr; +} + +std::shared_ptr IInstanceHandler::GetSetting(const std::string& setting) +{ + if (!m_addon->HasSettings()) + { + CLog::Log(LOGERROR, "IInstanceHandler::{} - couldn't get settings for add-on '{}'", __func__, + Name()); + return nullptr; + } + + auto value = m_addon->GetSettings()->GetSetting(setting); + if (value == nullptr) + { + CLog::Log(LOGERROR, "IInstanceHandler::{} - can't find setting '{}' in '{}'", __func__, setting, + Name()); + return nullptr; + } + + return value; +} + +char* IInstanceHandler::get_instance_user_path() +{ + const std::string path = CSpecialProtocol::TranslatePath(m_addon->Profile()); + + XFILE::CDirectory::Create(path); + return strdup(path.c_str()); +} + +bool IInstanceHandler::is_instance_setting_using_default(const char* id) +{ + if (!id) + return false; + + auto setting = GetSetting(id); + if (setting == nullptr) + return false; + + return setting->IsDefault(); +} + +bool IInstanceHandler::get_instance_setting_bool(const char* id, bool* value) +{ + if (!id || !value) + return false; + + auto setting = GetSetting(id); + if (setting == nullptr) + return false; + + if (setting->GetType() != SettingType::Boolean) + { + CLog::Log(LOGERROR, "IInstanceHandler::{} - setting '{}' is not a boolean in '{}'", __func__, + id, Name()); + return false; + } + + *value = std::static_pointer_cast(setting)->GetValue(); + return true; +} + +bool IInstanceHandler::get_instance_setting_int(const char* id, int* value) +{ + if (!id || !value) + return false; + + auto setting = GetSetting(id); + if (setting == nullptr) + return false; + + if (setting->GetType() != SettingType::Integer && setting->GetType() != SettingType::Number) + { + CLog::Log(LOGERROR, "IInstanceHandler::{} - setting '{}' is not a integer in '{}'", __func__, + id, 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 IInstanceHandler::get_instance_setting_float(const char* id, double* value) +{ + if (!id || !value) + return false; + + auto setting = GetSetting(id); + if (setting == nullptr) + return false; + + if (setting->GetType() != SettingType::Number) + { + CLog::Log(LOGERROR, "IInstanceHandler::{} - setting '{}' is not a number in '{}'", __func__, id, + Name()); + return false; + } + + *value = std::static_pointer_cast(setting)->GetValue(); + return true; +} + +bool IInstanceHandler::get_instance_setting_string(const char* id, char** value) +{ + if (!id || !value) + return false; + + auto setting = GetSetting(id); + if (setting == nullptr) + return false; + + if (setting->GetType() != SettingType::String) + { + CLog::Log(LOGERROR, "IInstanceHandler::{} - setting '{}' is not a string in '{}'", __func__, id, + Name()); + return false; + } + + *value = strdup(std::static_pointer_cast(setting)->GetValue().c_str()); + return true; +} + +bool IInstanceHandler::set_instance_setting_bool(const char* id, bool value) +{ + if (!id) + return false; + + if (CHdl_kodi_addon_base_h::UpdateSettingInActiveDialog(ID(), id, value ? "true" : "false")) + return true; + + if (!m_addon->UpdateSettingBool(id, value)) + { + CLog::Log(LOGERROR, "IInstanceHandler::{} - invalid setting type", __func__); + return false; + } + + m_addon->SaveSettings(); + + return true; +} + +bool IInstanceHandler::set_instance_setting_int(const char* id, int value) +{ + if (!id) + return false; + + if (CHdl_kodi_addon_base_h::UpdateSettingInActiveDialog(ID(), id, std::to_string(value))) + return true; + + if (!m_addon->UpdateSettingInt(id, value)) + { + CLog::Log(LOGERROR, "IInstanceHandler::{} - invalid setting type", __func__); + return false; + } + + m_addon->SaveSettings(); + + return true; +} + +bool IInstanceHandler::set_instance_setting_float(const char* id, double value) +{ + if (!id) + return false; + + if (CHdl_kodi_addon_base_h::UpdateSettingInActiveDialog(ID(), id, + StringUtils::Format("{:f}", value))) + return true; + + if (!m_addon->UpdateSettingNumber(id, static_cast(value))) + { + CLog::Log(LOGERROR, "IInstanceHandler::{} - invalid setting type", __func__); + return false; + } + + m_addon->SaveSettings(); + + return true; +} + +bool IInstanceHandler::set_instance_setting_string(const char* id, const char* value) +{ + if (!id || !value) + return false; + + if (CHdl_kodi_addon_base_h::UpdateSettingInActiveDialog(ID(), id, value)) + return true; + + if (!m_addon->UpdateSettingString(id, value)) + { + CLog::Log(LOGERROR, "IInstanceHandler::{} - invalid setting type", __func__); + return false; + } + + m_addon->SaveSettings(); + + return true; +} diff --git a/xbmc/addons/interface/InstanceHandler.h b/xbmc/addons/interface/InstanceHandler.h new file mode 100644 index 0000000000000..299b9781a27ce --- /dev/null +++ b/xbmc/addons/interface/InstanceHandler.h @@ -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. + */ + +#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 + +class CSetting; + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CInterface; +typedef void* ADDON_HANDLE; +typedef void* KODI_HANDLE; + +class IInstanceHandler +{ +public: + IInstanceHandler(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + KODI_ADDON_INSTANCE_TYPE type, + const std::shared_ptr& addonInfo, + ADDON::AddonInstanceId instanceId = ADDON::ADDON_INSTANCE_ID_UNUSED, + ADDON_HANDLE parentInstance = nullptr, + const std::string& uniqueWorkID = ""); + virtual ~IInstanceHandler(); + + KODI_ADDON_INSTANCE_TYPE UsedType() const { return m_type; } + ADDON::AddonInstanceId InstanceId() const { return m_instanceId; } + const std::string& UniqueWorkID() { return m_uniqueWorkID; } + + 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(); + void DestroyInstance(); + 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; } + const KODI_ADDON_INSTANCE_INFO* GetCInfo() const { return &m_info; } + + virtual void StopReport(ChildStatus status) {} + virtual void OnPreInstall() {} + virtual void OnPostInstall(bool update, bool modal) {} + virtual void OnPreUnInstall() {} + virtual void OnPostUnInstall() {} + + char* get_instance_user_path(); + /*---AUTO_GEN_PARSE---*/ + bool is_instance_setting_using_default(const char* id); + /*---AUTO_GEN_PARSE---*/ + bool get_instance_setting_bool(const char* id, bool* value); + /*---AUTO_GEN_PARSE---*/ + bool get_instance_setting_int(const char* id, int* value); + /*---AUTO_GEN_PARSE---*/ + bool get_instance_setting_float(const char* id, double* value); + /*---AUTO_GEN_PARSE---*/ + bool get_instance_setting_string(const char* id, char** value); + /*---AUTO_GEN_PARSE---*/ + bool set_instance_setting_bool(const char* id, bool value); + /*---AUTO_GEN_PARSE---*/ + bool set_instance_setting_int(const char* id, int value); + /*---AUTO_GEN_PARSE---*/ + bool set_instance_setting_float(const char* id, double value); + /*---AUTO_GEN_PARSE---*/ + bool set_instance_setting_string(const char* id, const char* value); + /*---AUTO_GEN_PARSE---*/ + +protected: + CInterface* m_ifc; + KODI_ADDON_INSTANCE_INFO m_info{}; + KODI_HANDLE m_instance{}; + +private: + std::shared_ptr GetSetting(const std::string& setting); + + const KODI_ADDON_INSTANCE_TYPE m_type; + const ADDON::AddonInstanceId m_instanceId; + std::string m_uniqueWorkID; + 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..1b03424d36061 --- /dev/null +++ b/xbmc/addons/interface/Interface.cpp @@ -0,0 +1,274 @@ +/* + * 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-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/addon-instance/web.h" +#include "api/addon_base.h" +#include "api/audio_engine.h" +#include "api/filesystem.h" +#include "api/general.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" +#include "api/gui/general.h" +#include "api/gui/list_item.h" +#include "api/gui/window.h" +#include "api/monitor.h" +#include "api/network.h" +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +CInterface::CInterface(CRunningProcess* process, bool directDll) + : m_process(process), + m_directIfc(directDll ? std::make_unique() : 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_addoninstance_web_h = new CHdl_kodi_addoninstance_web_h(*this); + m_handlers[funcGroup_addoninstance_web_h] = kodi_addoninstance_web_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_addoninstance_web_h->InitDirect(&m_directIfc->to_kodi.addoninstance_web_h, + &m_directIfc->to_addon.addoninstance_web_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..f174e84905087 --- /dev/null +++ b/xbmc/addons/interface/Interface.h @@ -0,0 +1,156 @@ +/* + * 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_addoninstance_web_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_addoninstance_web_h* kodi_addoninstance_web_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; + std::unique_ptr 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..6721cd82e640c --- /dev/null +++ b/xbmc/addons/interface/RunningProcess.cpp @@ -0,0 +1,550 @@ +/* + * 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 +{ +#ifndef STR_HELPER +#define STR_HELPER(x) #x +#endif +#ifndef STR +#define STR(x) STR_HELPER(x) +#endif +constexpr const char* EXE_FLAG = "--addon"; +constexpr const char* API_VERSION_FLAG = "--api"; +constexpr const char* API_VERSION_VALUE = STR(__KDK_MAJOR__); +constexpr const char* DEBUG_FLAG = "--debug"; +constexpr const char* DEVKIT_LIB_FLAG = "--dl"; +constexpr const char* DEVKIT_DIR_FLAG = "--dir"; +constexpr const char* DEVKIT_MAIN_SHARED_FLAG = "--main-shared"; +constexpr const char* DEVKIT_DIRECT_API_FLAG = "--direct-api"; +constexpr const char* DEVKIT_REPORT_PATH = "--report-path"; +} // namespace + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +CRunningProcess::CRunningProcess(const std::shared_ptr& addon, + const std::string& uuid, + bool noSandbox, + const KODI_ADDON_INSTANCE_INFO* firstInstance) + : CThread("CRunningProcess"), + m_addon(addon), + m_uuid(uuid), +#ifndef KODI_INHIBIT_SHARED + m_noSandbox(noSandbox), +#else + m_noSandbox(true), +#endif + m_kodiInitInstancePtr(firstInstance), + m_mainThread(m_threadIdentfier++, this), + m_interface(this, m_noSandbox), + m_cmdValue_exe(m_addon->Type(m_addon->MainType())->LibPath()), + m_cmdValue_direct_api( + StringUtils::Format("{}", static_cast(m_interface.m_directIfc.get()))), + m_endMilliseconds(0ms) +{ + if (m_noSandbox) + 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::MakeCommandLineValues(std::vector& argv_cstr) +{ + argv_cstr.reserve(m_argv.size() + 16); + + if (!m_noSandbox) + { + argv_cstr.emplace_back( + const_cast(CServiceBroker::GetAddonIfcCtrl().GetDevkitLaunchExe().c_str())); + argv_cstr.emplace_back(const_cast(EXE_FLAG)); + } + + argv_cstr.emplace_back(const_cast(m_cmdValue_exe.c_str())); + + if (m_noSandbox) + { + argv_cstr.emplace_back(const_cast(DEVKIT_DIRECT_API_FLAG)); + argv_cstr.emplace_back(const_cast(m_cmdValue_direct_api.c_str())); + } + + argv_cstr.emplace_back(const_cast(API_VERSION_FLAG)); + argv_cstr.emplace_back(const_cast(API_VERSION_VALUE)); + + argv_cstr.emplace_back(const_cast(DEVKIT_MAIN_SHARED_FLAG)); + argv_cstr.emplace_back(const_cast(m_uuid.c_str())); + + argv_cstr.emplace_back(const_cast(DEVKIT_LIB_FLAG)); + argv_cstr.emplace_back( + const_cast(CServiceBroker::GetAddonIfcCtrl().GetDevkitLibPath().c_str())); + + argv_cstr.emplace_back(const_cast(DEVKIT_DIR_FLAG)); + argv_cstr.emplace_back( + const_cast(CServiceBroker::GetAddonIfcCtrl().GetDevkitPath().c_str())); + + argv_cstr.emplace_back(const_cast(DEVKIT_REPORT_PATH)); + argv_cstr.emplace_back( + const_cast(CServiceBroker::GetAddonIfcCtrl().GetDevkitReportPath().c_str())); + + argv_cstr.emplace_back(const_cast(DEBUG_FLAG)); + + for (const auto& arg : m_argv) + argv_cstr.emplace_back(const_cast(arg.c_str())); + + argv_cstr.emplace_back(nullptr); + + return true; +} + +bool CRunningProcess::Launch(const std::vector& argv, bool waitForExit) +{ + /* + * Confirm the wanted executable is really present. + */ + if (m_cmdValue_exe.empty() || !XFILE::CFile::Exists(m_cmdValue_exe)) + { + CLog::Log(LOGERROR, "CRunningProcess::{}: Wanted add-on '{}' to run not present", __func__, m_cmdValue_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_noSandbox && m_launcher->SupportNonBlocking(m_cmdValue_exe))) + { + std::vector argv_cstr; + if (!MakeCommandLineValues(argv_cstr)) + { + CLog::Log(LOGERROR, + "CRunningProcess::{}: Failed to parse command values for addon '{}' process", + __func__, m_addon->ID()); + m_startFailed = true; + m_startDone = true; + return false; + } + + 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(); + fprintf(stderr, "--------------> %i\n", ProcessActive()); + while (!m_startDone) + { + fprintf(stderr, "--------------> %i\n", ProcessActive()); + CThread::Sleep(100ms); + } + } + + return !m_startFailed; +} + +bool CRunningProcess::Kill() +{ + // Check addon is running, if yes stop by normal way + if (ProcessActive() == ChildStatus::Running) + { + // Inform addon of requested kill and to allow him needed work (e.g. stop process thread). + if (!m_noSandbox) + { + 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(IInstanceHandler* 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; + } + + bool empty; + + { + std::unique_lock lock(m_mutex); + + empty = m_activeAddonHandlers.empty(); + + // add the instance handler to the info to know used amount on addon + m_activeAddonHandlers.insert(handler); + } + + // Call addon create if no instances was used before, done without lock to prevent hangs if + // target produces problems and not return and background controller also then blocked to + // check. + if (empty) + m_interface.kodi_addon_base_h->kodi_addon_create_v1(handler->GetCInfo(), &m_hdl); +} + +void CRunningProcess::ReleaseAddonInstance(IInstanceHandler* 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; + } + + bool empty; + + { + std::unique_lock lock(m_mutex); + + auto presentHandler = m_activeAddonHandlers.find(handler); + if (presentHandler == m_activeAddonHandlers.end()) + return; + + m_activeAddonHandlers.erase(presentHandler); + + empty = m_activeAddonHandlers.empty(); + } + + if (empty) + m_interface.kodi_addon_base_h->kodi_addon_destroy_v1(m_hdl); +} + +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(); +} + +const std::string& CRunningProcess::GetStackTrace() const +{ + return m_launcher ? m_launcher->GetStackTrace() : StringUtils::Empty; +} + +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 = std::chrono::milliseconds(milliseconds); + m_endTimer.Set(m_endMilliseconds); +} + +std::chrono::milliseconds CRunningProcess::EndTimeLeft() const +{ + return m_endTimer.GetTimeLeft(); +} + +bool CRunningProcess::UseEndTime() const +{ + return m_endMilliseconds > 0ms; +} + +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() +{ + { +fprintf(stderr, "----------------> %s\n", m_addon->ID().c_str()); + /* + * 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. + */ + std::vector argv_cstr; + if (!MakeCommandLineValues(argv_cstr)) + { + CLog::Log(LOGERROR, + "CRunningProcess::{}: Failed to parse command values for addon '{}' process", + __func__, m_addon->ID()); + m_startFailed = true; + m_startDone = true; + return; + } + + 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..98eebfa4b2902 --- /dev/null +++ b/xbmc/addons/interface/RunningProcess.h @@ -0,0 +1,114 @@ +/* + * 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 "Interface.h" +#include "RunningThread.h" +#include "addons/Addon.h" +#include "launcher/ILauncher.h" +#include "processinfo/ProcessInfo.h" +#include "threads/SystemClock.h" +#include "threads/Thread.h" + +#include +#include +#include +#include +#include +#include + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CRunningThread; +class IInstanceHandler; + +class CRunningProcess : private CThread +{ +public: + CRunningProcess(const std::shared_ptr& addon, + const std::string& uuid, + bool noSandbox, + const KODI_ADDON_INSTANCE_INFO* firstInstance); + ~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(IInstanceHandler* handler); + void ReleaseAddonInstance(IInstanceHandler* 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; + const std::string& GetStackTrace() const; + + CInterface& GetIfc() { return m_interface; } + + void SetEndtime(unsigned int milliseconds); + std::chrono::milliseconds EndTimeLeft() const; + bool UseEndTime() const; + bool IsInUse() const; + + ProcessInfoData GetProcessInfoData(); + + const KODI_ADDON_INSTANCE_INFO* GetInitInstancePtr() { return m_kodiInitInstancePtr; } + + void* m_hdl; + +private: + void Process() override; + + bool MakeCommandLineValues(std::vector& argv_cstr); + + const std::shared_ptr m_addon; + const std::string m_uuid; + const bool m_noSandbox; + const KODI_ADDON_INSTANCE_INFO* m_kodiInitInstancePtr; + int64_t m_threadIdentfier{0}; + CRunningThread m_mainThread; + CInterface m_interface; + const std::string m_cmdValue_exe; + const std::string m_cmdValue_direct_api; + + std::atomic_bool m_startDone{false}; + bool m_startFailed{false}; + std::vector m_argv; + 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; + std::chrono::milliseconds m_endMilliseconds; + 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..f0d5020e38388 --- /dev/null +++ b/xbmc/addons/interface/RunningThread.cpp @@ -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. + */ + +#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..a57c1b1d62eb9 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/CMakeLists.txt @@ -0,0 +1,36 @@ +# 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 + web.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 + web.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..a59840fbad212 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/audiodecoder.cpp @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 + +bool CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_supports_file_v1( + const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_SUPPORTS_FILE_V1)(const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_supports_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_supports_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_supports_file_v1(PtrValue(hdl), file)); + if (!m_process->SendMessage(funcGroup_addoninstance_audiodecoder_h, + funcChild_kodi_addon_audiodecoder_supports_file_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_audiodecoder_supports_file_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_audiodecoder_supports_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..f167dff826ef9 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/audiodecoder.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 + + bool kodi_addon_audiodecoder_supports_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..5634b5efc1710 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/audioencoder.cpp @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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/interface/RunningProcess.h" +#include "cdrip/EncoderAddon.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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, ssize_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_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + ssize_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 + +bool CHdl_kodi_addoninstance_audioencoder_h::kodi_addon_audioencoder_start_v1( + KODI_ADDON_AUDIOENCODER_HDL hdl, const struct KODI_ADDON_AUDIOENCODER_INFO_TAG* tag) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_START_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl, const struct KODI_ADDON_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_ADDON_INSTANCE_BACKEND_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 "KODI::CDRIP::CEncoderAddon" with "ssize_t Write(const uint8_t* data, size_t len)" on "cdrip/EncoderAddon.h". + + KODI::CDRIP::CEncoderAddon* 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_ADDON_INSTANCE_BACKEND_HDL hdl, ssize_t pos, int whence) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return -1; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::CDRIP::CEncoderAddon" with "ssize_t Seek(ssize_t pos, int whence)" on "cdrip/EncoderAddon.h". + + KODI::CDRIP::CEncoderAddon* 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..5dc64e01ccd4a --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/audioencoder.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 + + bool kodi_addon_audioencoder_start_v1( + KODI_ADDON_AUDIOENCODER_HDL hdl, + const struct KODI_ADDON_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_ADDON_INSTANCE_BACKEND_HDL hdl, + const uint8_t* data, + size_t len); // Added with API 1 + + static ssize_t kodi_addon_audioencoder_seek_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + ssize_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..8d9ae01fe145a --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/game.cpp @@ -0,0 +1,518 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_game_hw_get_proc_address_v1 = kodi_addon_game_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_ADDON_INSTANCE_BACKEND_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_GAME_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_CREATE_V1)(KODI_ADDON_INSTANCE_BACKEND_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); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_rc_generate_hash_from_file_v1( + const KODI_ADDON_GAME_HDL hdl, char** hash, unsigned int console_id, const char* file_path) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RC_GENERATE_HASH_FROM_FILE_V1)(const KODI_ADDON_GAME_HDL hdl, char** hash, unsigned int console_id, const char* file_path); + + return m_ifcToAddon->kodi_addon_game_rc_generate_hash_from_file_v1( + m_ifcToAddon->thisClassHdl, hdl, hash, console_id, file_path); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_rc_get_game_id_url_v1( + const KODI_ADDON_GAME_HDL hdl, char** url, const char* hash) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RC_GET_GAME_ID_URL_V1)(const KODI_ADDON_GAME_HDL hdl, char** url, const char* hash); + + return m_ifcToAddon->kodi_addon_game_rc_get_game_id_url_v1(m_ifcToAddon->thisClassHdl, hdl, url, + hash); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_rc_get_patch_file_url_v1( + const KODI_ADDON_GAME_HDL hdl, + char** url, + const char* username, + const char* token, + unsigned int game_id) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RC_GET_PATCH_FILE_URL_V1)(const KODI_ADDON_GAME_HDL hdl, char** url, const char* username, const char* token, unsigned int game_id); + + return m_ifcToAddon->kodi_addon_game_rc_get_patch_file_url_v1(m_ifcToAddon->thisClassHdl, hdl, + url, username, token, game_id); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_rc_post_rich_presence_url_v1( + const KODI_ADDON_GAME_HDL hdl, + char** url, + char** post_data, + const char* username, + const char* token, + unsigned int game_id, + const char* rich_presence) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RC_POST_RICH_PRESENCE_URL_V1)(const KODI_ADDON_GAME_HDL hdl, char** url, char** post_data, const char* username, const char* token, unsigned int game_id, const char* rich_presence); + + return m_ifcToAddon->kodi_addon_game_rc_post_rich_presence_url_v1( + m_ifcToAddon->thisClassHdl, hdl, url, post_data, username, token, game_id, rich_presence); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_rc_enable_rich_presence_v1( + const KODI_ADDON_GAME_HDL hdl, const char* script) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RC_ENABLE_RICH_PRESENCE_V1)(const KODI_ADDON_GAME_HDL hdl, const char* script); + + return m_ifcToAddon->kodi_addon_game_rc_enable_rich_presence_v1(m_ifcToAddon->thisClassHdl, hdl, + script); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_rc_get_rich_presence_evaluation_v1( + const KODI_ADDON_GAME_HDL hdl, char** evaluation, unsigned int console_id) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RC_GET_RICH_PRESENCE_EVALUATION_V1)(const KODI_ADDON_GAME_HDL hdl, char** evaluation, unsigned int console_id); + + return m_ifcToAddon->kodi_addon_game_rc_get_rich_presence_evaluation_v1( + m_ifcToAddon->thisClassHdl, hdl, evaluation, console_id); +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_rc_reset_runtime_v1( + const KODI_ADDON_GAME_HDL hdl) +{ + // Original API call: typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RC_RESET_RUNTIME_V1)(const KODI_ADDON_GAME_HDL hdl); + + return m_ifcToAddon->kodi_addon_game_rc_reset_runtime_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +// Callbacks from addon to Kodi + +void CHdl_kodi_addoninstance_game_h::kodi_addon_game_close_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_game_hw_get_proc_address_v1( + void* thisClassHdl, KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* symbol) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::GAME::CGameClient" with "game_proc_address_t cb_hw_get_proc_address(const char* sym)" on "games/addons/GameClient.h". + + KODI::GAME::CGameClient* cb = static_cast(hdl); + return cb->cb_hw_get_proc_address(symbol); + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addoninstance_game_h::kodi_addon_game_input_event_v1( + void* thisClassHdl, KODI_ADDON_INSTANCE_BACKEND_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..1769c34b68846 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/game.h @@ -0,0 +1,233 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_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 + + enum GAME_ERROR kodi_addon_game_rc_generate_hash_from_file_v1( + const KODI_ADDON_GAME_HDL hdl, + char** hash, + unsigned int console_id, + const char* file_path); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_rc_get_game_id_url_v1(const KODI_ADDON_GAME_HDL hdl, + char** url, + const char* hash); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_rc_get_patch_file_url_v1( + const KODI_ADDON_GAME_HDL hdl, + char** url, + const char* username, + const char* token, + unsigned int game_id); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_rc_post_rich_presence_url_v1( + const KODI_ADDON_GAME_HDL hdl, + char** url, + char** post_data, + const char* username, + const char* token, + unsigned int game_id, + const char* rich_presence); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_rc_enable_rich_presence_v1( + const KODI_ADDON_GAME_HDL hdl, const char* script); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_rc_get_rich_presence_evaluation_v1( + const KODI_ADDON_GAME_HDL hdl, + char** evaluation, + unsigned int console_id); // Added with API 1 + + enum GAME_ERROR kodi_addon_game_rc_reset_runtime_v1( + const KODI_ADDON_GAME_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_game_close_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl); // Added with API 1 + + static KODI_GAME_STREAM_HANDLE kodi_addon_game_open_stream_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const struct game_stream_properties* properties); // Added with API 1 + + static bool kodi_addon_game_get_stream_buffer_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl); // Added with API 1 + + static game_proc_address_t kodi_addon_game_hw_get_proc_address_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* symbol); // Added with API 1 + + static bool kodi_addon_game_input_event_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_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..89bac6e40c3a8 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/imagedecoder.cpp @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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/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; +} + +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) + { + 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 + +bool CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_supports_file_v1( + const KODI_ADDON_IMAGEDECODER_HDL hdl, const char* file) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_SUPPORTS_FILE_V1)(const KODI_ADDON_IMAGEDECODER_HDL hdl, const char* file); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_supports_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_supports_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_imagedecoder_supports_file_v1(PtrValue(hdl), file)); + if (!m_process->SendMessage(funcGroup_addoninstance_imagedecoder_h, + funcChild_kodi_addon_imagedecoder_supports_file_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_imagedecoder_supports_file_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_imagedecoder_supports_file_v1(m_ifcToAddon->thisClassHdl, hdl, + file); +} + +bool CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_read_tag_v1( + const KODI_ADDON_IMAGEDECODER_HDL hdl, + const char* file, + struct KODI_ADDON_IMAGEDECODER_INFO_TAG* info) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_READ_TAG_V1)(const KODI_ADDON_IMAGEDECODER_HDL hdl, const char* file, struct KODI_ADDON_IMAGEDECODER_INFO_TAG* info); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_read_tag_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_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_imagedecoder_read_tag_v1(PtrValue(hdl), file)); + if (!m_process->SendMessage(funcGroup_addoninstance_imagedecoder_h, + funcChild_kodi_addon_imagedecoder_read_tag_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_imagedecoder_read_tag_v1 t = ident.get().as(); + std::get<1>(t).SetCStructure(info); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_imagedecoder_read_tag_v1(m_ifcToAddon->thisClassHdl, hdl, file, + info); +} + +bool CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_load_image_from_memory_v1( + const KODI_ADDON_IMAGEDECODER_HDL hdl, + const char* mimetype, + 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)(const KODI_ADDON_IMAGEDECODER_HDL hdl, const char* mimetype, 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), mimetype, 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, mimetype, buffer, buf_size, width, height); +} + +bool CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_decode_v1( + const 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)(const 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 +/* 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/imagedecoder.h b/xbmc/addons/interface/api/addon-instance/imagedecoder.h new file mode 100644 index 0000000000000..09caff9d3aade --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/imagedecoder.h @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 + + bool kodi_addon_imagedecoder_supports_file_v1(const KODI_ADDON_IMAGEDECODER_HDL hdl, + const char* file); // Added with API 1 + + bool kodi_addon_imagedecoder_read_tag_v1( + const KODI_ADDON_IMAGEDECODER_HDL hdl, + const char* file, + struct KODI_ADDON_IMAGEDECODER_INFO_TAG* info); // Added with API 1 + + bool kodi_addon_imagedecoder_load_image_from_memory_v1(const KODI_ADDON_IMAGEDECODER_HDL hdl, + const char* mimetype, + const uint8_t* buffer, + size_t buf_size, + unsigned int* width, + unsigned int* height); // Added with API 1 + + bool kodi_addon_imagedecoder_decode_v1(const 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 + + 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..92d417faac963 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/inputstream.cpp @@ -0,0 +1,404 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_INPUTSTREAM_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_CREATE_V1)(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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..5bd7bbda8e8c4 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/inputstream.h @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, int data_size); // Added with API 1 + + static struct DEMUX_PACKET* kodi_addon_inputstream_allocate_encrypted_demux_packet_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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..99f659c3d67e6 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/peripheral.cpp @@ -0,0 +1,344 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_PERIPHERAL_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_CREATE_V1)(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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..c027b5e1822fb --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/peripheral.h @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl); // Added with API 1 + + static void kodi_addon_peripheral_refresh_button_maps_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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..9c14823f0cfdc --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/pvr.cpp @@ -0,0 +1,2230 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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 */ + PVR_MENUHOOK hook; + msgParent__IN_kodi_addon_pvr_add_menu_hook_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + enum EPG_EVENT_STATE newState = std::get<1>(t); + struct EPG_TAG tag = {}; + 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_ADDON_INSTANCE_BACKEND_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 */ + PVR_CHANNEL chan; + msgParent__IN_kodi_addon_pvr_transfer_channel_entry_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + 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_ADDON_INSTANCE_BACKEND_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 */ + PVR_PROVIDER chanProvider; + msgParent__IN_kodi_addon_pvr_transfer_provider_entry_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + 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_ADDON_INSTANCE_BACKEND_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 */ + PVR_CHANNEL_GROUP group; + msgParent__IN_kodi_addon_pvr_transfer_channel_group_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + 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_ADDON_INSTANCE_BACKEND_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 */ + PVR_CHANNEL_GROUP_MEMBER member; + msgParent__IN_kodi_addon_pvr_transfer_channel_group_member_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + 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_ADDON_INSTANCE_BACKEND_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 */ + EPG_TAG epgentry; + msgParent__IN_kodi_addon_pvr_transfer_epg_entry_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + 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_ADDON_INSTANCE_BACKEND_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 */ + PVR_RECORDING recording; + msgParent__IN_kodi_addon_pvr_transfer_recording_entry_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + 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_ADDON_INSTANCE_BACKEND_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 */ + PVR_TIMER timer; + msgParent__IN_kodi_addon_pvr_transfer_timer_entry_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + 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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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(const KODI_ADDON_PVR_TRANSFER_HDL 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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "PVR::CPVRClient" with "void cb_trigger_provider_update()" on "pvr/addons/PVRClient.h". + + PVR::CPVRClient* cb = static_cast(hdl); + cb->cb_trigger_provider_update(); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_pvr_h::kodi_addon_pvr_trigger_channel_groups_update_v1( + void* thisClassHdl, KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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..afcd4225ad1e0 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/pvr.h @@ -0,0 +1,371 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_HDL hdl); // Added with API 1 + + static int kodi_addon_pvr_get_epg_max_past_days_v1( + void* thisClassHdl, KODI_ADDON_INSTANCE_BACKEND_HDL hdl); // Added with API 1 + + static void kodi_addon_pvr_add_menu_hook_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const struct PVR_MENUHOOK* hook); // Added with API 1 + + static void kodi_addon_pvr_recording_notification_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl); // Added with API 1 + + static void kodi_addon_pvr_trigger_providers_update_v1( + void* thisClassHdl, KODI_ADDON_INSTANCE_BACKEND_HDL hdl); // Added with API 1 + + static void kodi_addon_pvr_trigger_channel_groups_update_v1( + void* thisClassHdl, KODI_ADDON_INSTANCE_BACKEND_HDL hdl); // Added with API 1 + + static void kodi_addon_pvr_trigger_epg_update_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + unsigned int iChannelUid); // Added with API 1 + + static void kodi_addon_pvr_trigger_recording_update_v1( + void* thisClassHdl, KODI_ADDON_INSTANCE_BACKEND_HDL hdl); // Added with API 1 + + static void kodi_addon_pvr_trigger_timer_update_v1( + void* thisClassHdl, KODI_ADDON_INSTANCE_BACKEND_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..2baa722be28a5 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/screensaver.cpp @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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/IOffscreenRenderProcess.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( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, struct KODI_ADDON_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_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + struct KODI_ADDON_SCREENSAVER_PROPS props = {}; + kodi_addon_screensaver_get_properties_v1(this, hdl, &props); + msgpack::pack(out, msgParent_OUT_kodi_addon_screensaver_get_properties_v1(&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 + +bool CHdl_kodi_addoninstance_screensaver_h::kodi_addon_screensaver_start_v1( + IOffscreenRenderProcess* proc, const KODI_ADDON_SCREENSAVER_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_START_V1)(const 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) + { + int x = 0; + int y = 0; + int width = 0; + int height = 0; + ADDON_HARDWARE_CONTEXT context = nullptr; + if (!proc || !proc->GetOffscreenRenderInfos(x, y, width, height, context) || + !proc->CreateRenderHelper(m_process)) + return false; + + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_screensaver_start_v1( + PtrKodiOffscreen(proc), proc->GetUsedId(), x, y, width, height, + PtrValue(context), 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(); + if (std::get<1>(t) == 0 || std::get<2>(t) == false) + return false; + proc->SetAddonOffscreenHdl(std::get<1>(t)); + proc->GetRenderHelper()->Init(); + 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( + IOffscreenRenderProcess* proc, const KODI_ADDON_SCREENSAVER_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_STOP_V1)(const 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) + { + if (!proc) + return; + + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_screensaver_stop_v1(proc->GetAddonOffscreenHdl(), + PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_screensaver_h, + funcChild_kodi_addon_screensaver_stop_v1, in); + + proc->GetRenderHelper()->Deinit(); + 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( + IOffscreenRenderProcess* proc, const KODI_ADDON_SCREENSAVER_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_RENDER_V1)(const 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) + { + if (!proc) + return; + + proc->GetRenderHelper()->Begin(); + + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_screensaver_render_v1(proc->GetAddonOffscreenHdl(), + PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_screensaver_h, + funcChild_kodi_addon_screensaver_render_v1, in); + + proc->GetRenderHelper()->End(); + 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, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + struct KODI_ADDON_SCREENSAVER_PROPS* props) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::ADDONS::CScreenSaver" with "void GetProperties(struct KODI_ADDON_SCREENSAVER_PROPS* props)" on "addons/ScreenSaver.h". + + KODI::ADDONS::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..3ec2d8c0ff177 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/screensaver.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 +{ + +class IOffscreenRenderProcess; +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 + + bool kodi_addon_screensaver_start_v1(IOffscreenRenderProcess* proc, + const KODI_ADDON_SCREENSAVER_HDL hdl); // Added with API 1 + + void kodi_addon_screensaver_stop_v1(IOffscreenRenderProcess* proc, + const KODI_ADDON_SCREENSAVER_HDL hdl); // Added with API 1 + + void kodi_addon_screensaver_render_v1(IOffscreenRenderProcess* proc, + const 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, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + struct KODI_ADDON_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..415d81868dcbe --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/vfs.cpp @@ -0,0 +1,888 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_VFS_FILE_HDL CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_open_v1( + const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url) +{ + // Original API call: typedef KODI_VFS_FILE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_OPEN_V1)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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( + const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url, bool overwrite) +{ + // Original API call: typedef KODI_VFS_FILE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_OPEN_FOR_WRITE_V1)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_CLOSE_V1)(const 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(const 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)(const 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(const 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)(const 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(const 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)(const 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(const 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)(const 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( + const 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)(const 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( + const 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)(const 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( + const 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)(const 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( + const 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)(const 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( + const 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)(const 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( + const KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, uint32_t rate) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_CACHE_RATE_V1)(const KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, uint32_t 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( + const 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)(const 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(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url, + struct VFS_STAT_STRUCTURE* buffer) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_STAT_V1)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_EXISTS_V1)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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(const KODI_ADDON_VFS_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_CLEAR_OUT_IDLE_V1)(const 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(const KODI_ADDON_VFS_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DISCONNECT_ALL_V1)(const 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( + const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DELETE_IT_V1)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url, + const struct KODI_ADDON_VFS_URL* url2) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_RENAME_V1)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url, const struct KODI_ADDON_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( + const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_EXISTS_V1)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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( + const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_REMOVE_V1)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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( + const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_CREATE_V1)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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( + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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( + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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..218097c86b9f4 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/vfs.h @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_VFS_FILE_HDL kodi_addon_vfs_file_open_v1( + const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url); // Added with API 1 + + KODI_VFS_FILE_HDL kodi_addon_vfs_file_open_for_write_v1(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url, + bool overwrite); // Added with API 1 + + bool kodi_addon_vfs_file_close_v1(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); // Added with API 1 + + ssize_t kodi_addon_vfs_file_read_v1(const 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(const 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(const 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(const 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(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); // Added with API 1 + + int64_t kodi_addon_vfs_file_get_position_v1(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); // Added with API 1 + + int kodi_addon_vfs_file_get_chunk_size_v1(const 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( + const 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( + const 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(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + uint32_t rate); // Added with API 1 + + bool kodi_addon_vfs_file_io_control_set_retry_v1(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + bool retry); // Added with API 1 + + int kodi_addon_vfs_stat_v1(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url, + struct VFS_STAT_STRUCTURE* buffer); // Added with API 1 + + bool kodi_addon_vfs_exists_v1(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url); // Added with API 1 + + void kodi_addon_vfs_clear_out_idle_v1(const KODI_ADDON_VFS_HDL hdl); // Added with API 1 + + void kodi_addon_vfs_disconnect_all_v1(const KODI_ADDON_VFS_HDL hdl); // Added with API 1 + + bool kodi_addon_vfs_delete_it_v1(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url); // Added with API 1 + + bool kodi_addon_vfs_rename_v1(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url, + const struct KODI_ADDON_VFS_URL* url2); // Added with API 1 + + bool kodi_addon_vfs_directory_exists_v1(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url); // Added with API 1 + + bool kodi_addon_vfs_directory_remove_v1(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url); // Added with API 1 + + bool kodi_addon_vfs_directory_create_v1(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url); // Added with API 1 + + bool kodi_addon_vfs_directory_get_v1(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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..614877e7c77e9 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/videocodec.cpp @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_VIDEOCODEC_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_CREATE_V1)(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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..42976aa4ab3a1 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/videocodec.h @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, + struct VIDEOCODEC_PICTURE* picture); // Added with API 1 + + static void kodi_addon_videocodec_release_frame_buffer_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_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..14775f17979fe --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/visualization.cpp @@ -0,0 +1,623 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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/IOffscreenRenderProcess.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(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, struct KODI_ADDON_VISUALIZATION_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_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + struct KODI_ADDON_VISUALIZATION_PROPS props = {}; + kodi_addon_visualization_get_properties_v1(this, hdl, &props); + msgpack::pack(out, msgParent_OUT_kodi_addon_visualization_get_properties_v1(&props)); + return true; + } + case funcParent_kodi_addon_visualization_transfer_preset_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_visualization_transfer_preset(const KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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(const KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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 + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_start_v1( + IOffscreenRenderProcess* proc, + const 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)(const 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) + { + int x = 0; + int y = 0; + int width = 0; + int height = 0; + ADDON_HARDWARE_CONTEXT context = nullptr; + if (!proc || !proc->GetOffscreenRenderInfos(x, y, width, height, context) || + !proc->CreateRenderHelper(m_process)) + return false; + + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_start_v1( + PtrKodiOffscreen(proc), proc->GetUsedId(), x, y, width, height, + PtrValue(context), 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(); + if (std::get<1>(t) == 0 || std::get<2>(t) == false) + return false; + proc->SetAddonOffscreenHdl(std::get<1>(t)); + proc->GetRenderHelper()->Init(); + 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( + IOffscreenRenderProcess* proc, const KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_STOP_V1)(const 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) + { + if (!proc) + return; + + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_stop_v1(proc->GetAddonOffscreenHdl(), + PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_stop_v1, in); + + proc->GetRenderHelper()->Deinit(); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_visualization_stop_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +int CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_get_sync_delay_v1( + const KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_SYNC_DELAY_V1)(const KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_get_sync_delay_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_get_sync_delay_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_sync_delay_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_get_sync_delay_v1, in, out)) + return -1; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_visualization_get_sync_delay_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_visualization_get_sync_delay_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_audio_data_v1( + const KODI_ADDON_VISUALIZATION_HDL hdl, const float* audio_data, size_t audio_data_length) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_AUDIO_DATA_V1)(const KODI_ADDON_VISUALIZATION_HDL hdl, const float* audio_data, size_t audio_data_length); + // Tuple in: typedef std::tuple, 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)); + 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); +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_is_dirty_v1( + const KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_IS_DIRTY_V1)(const 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( + IOffscreenRenderProcess* proc, const KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RENDER_V1)(const 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) + { + if (!proc) + return; + + proc->GetRenderHelper()->Begin(); + + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_visualization_render_v1(proc->GetAddonOffscreenHdl(), + PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_visualization_h, + funcChild_kodi_addon_visualization_render_v1, in); + + proc->GetRenderHelper()->End(); + 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( + const KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef unsigned int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_PRESETS_V1)(const 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( + const KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_ACTIVE_PRESET_V1)(const 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( + const KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_PREV_PRESET_V1)(const 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( + const KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_NEXT_PRESET_V1)(const 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( + const KODI_ADDON_VISUALIZATION_HDL hdl, int select) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_LOAD_PRESET_V1)(const 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( + const KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RANDOM_PRESET_V1)(const 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( + const KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_LOCK_PRESET_V1)(const 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( + const KODI_ADDON_VISUALIZATION_HDL hdl, bool plus_minus) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RATE_PRESET_V1)(const 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( + const KODI_ADDON_VISUALIZATION_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_IS_LOCKED_V1)(const 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( + const KODI_ADDON_VISUALIZATION_HDL hdl, const char* albumart) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_UPDATE_ALBUMART_V1)(const 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( + const KODI_ADDON_VISUALIZATION_HDL hdl, const struct KODI_ADDON_VISUALIZATION_TRACK* track) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_UPDATE_TRACK_V1)(const KODI_ADDON_VISUALIZATION_HDL hdl, const struct KODI_ADDON_VISUALIZATION_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, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + struct KODI_ADDON_VISUALIZATION_PROPS* props) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::ADDONS::CVisualization" with "void get_properties(KODI_ADDON_VISUALIZATION_PROPS* props)" on "addons/Visualization.h". + + KODI::ADDONS::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, const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* preset) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::ADDONS::CVisualization" with "void transfer_preset(const char* preset)" on "addons/Visualization.h". + + KODI::ADDONS::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, const KODI_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::ADDONS::CVisualization" with "void clear_presets()" on "addons/Visualization.h". + + KODI::ADDONS::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..bb457f3acad42 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/visualization.h @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 +{ + +class IOffscreenRenderProcess; +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 + + bool kodi_addon_visualization_start_v1(IOffscreenRenderProcess* proc, + const 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(IOffscreenRenderProcess* proc, + const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + int kodi_addon_visualization_get_sync_delay_v1( + const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + void kodi_addon_visualization_audio_data_v1(const KODI_ADDON_VISUALIZATION_HDL hdl, + const float* audio_data, + size_t audio_data_length); // Added with API 1 + + bool kodi_addon_visualization_is_dirty_v1( + const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + void kodi_addon_visualization_render_v1( + IOffscreenRenderProcess* proc, const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + unsigned int kodi_addon_visualization_get_presets_v1( + const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + int kodi_addon_visualization_get_active_preset_v1( + const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + bool kodi_addon_visualization_prev_preset_v1( + const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + bool kodi_addon_visualization_next_preset_v1( + const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + bool kodi_addon_visualization_load_preset_v1(const KODI_ADDON_VISUALIZATION_HDL hdl, + int select); // Added with API 1 + + bool kodi_addon_visualization_random_preset_v1( + const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + bool kodi_addon_visualization_lock_preset_v1( + const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + bool kodi_addon_visualization_rate_preset_v1(const KODI_ADDON_VISUALIZATION_HDL hdl, + bool plus_minus); // Added with API 1 + + bool kodi_addon_visualization_is_locked_v1( + const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + bool kodi_addon_visualization_update_albumart_v1(const KODI_ADDON_VISUALIZATION_HDL hdl, + const char* albumart); // Added with API 1 + + bool kodi_addon_visualization_update_track_v1( + const KODI_ADDON_VISUALIZATION_HDL hdl, + const struct KODI_ADDON_VISUALIZATION_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, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + struct KODI_ADDON_VISUALIZATION_PROPS* props); // Added with API 1 + + static void kodi_addon_visualization_transfer_preset_v1(void* thisClassHdl, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* preset); // Added with API 1 + + static void kodi_addon_visualization_clear_presets_v1( + void* thisClassHdl, const KODI_ADDON_INSTANCE_BACKEND_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-instance/web.cpp b/xbmc/addons/interface/api/addon-instance/web.cpp new file mode 100644 index 0000000000000..38105b8358761 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/web.cpp @@ -0,0 +1,1147 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 "web.h" + +// Shared API +#include "addons/kodi-dev-kit/src/shared/api/addon-instance/web.h" + +// Kodi +#include "addons/interface/IOffscreenRenderProcess.h" +#include "addons/interface/RunningProcess.h" +#include "utils/log.h" +#include "web/WebAddon.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_web_h::InitDirect(directFuncToKodi_addoninstance_web_h* ifcToKodi, + directFuncToAddon_addoninstance_web_h* ifcToAddon) +{ + ifcToKodi->thisClassHdl = this; + m_ifcToAddon = ifcToAddon; + ifcToKodi->kodi_addon_web_inhibit_shutdown_v1 = kodi_addon_web_inhibit_shutdown_v1; + ifcToKodi->kodi_addon_web_inhibit_screensaver_v1 = kodi_addon_web_inhibit_screensaver_v1; + ifcToKodi->kodi_addon_web_is_muted_v1 = kodi_addon_web_is_muted_v1; + ifcToKodi->kodi_addon_web_control_set_control_ready_v1 = + kodi_addon_web_control_set_control_ready_v1; + ifcToKodi->kodi_addon_web_control_set_opened_address_v1 = + kodi_addon_web_control_set_opened_address_v1; + ifcToKodi->kodi_addon_web_control_set_opened_title_v1 = + kodi_addon_web_control_set_opened_title_v1; + ifcToKodi->kodi_addon_web_control_set_icon_url_v1 = kodi_addon_web_control_set_icon_url_v1; + ifcToKodi->kodi_addon_web_control_set_fullscreen_v1 = kodi_addon_web_control_set_fullscreen_v1; + ifcToKodi->kodi_addon_web_control_set_loading_state_v1 = + kodi_addon_web_control_set_loading_state_v1; + ifcToKodi->kodi_addon_web_control_set_tooltip_v1 = kodi_addon_web_control_set_tooltip_v1; + ifcToKodi->kodi_addon_web_control_set_status_message_v1 = + kodi_addon_web_control_set_status_message_v1; + ifcToKodi->kodi_addon_web_control_request_open_site_in_new_tab_v1 = + kodi_addon_web_control_request_open_site_in_new_tab_v1; +} + +bool CHdl_kodi_addoninstance_web_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_web_h) + return false; + + switch (func) + { + case funcParent_kodi_addon_web_inhibit_shutdown_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_inhibit_shutdown(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, bool inhibit); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_inhibit_shutdown_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_inhibit_shutdown_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_web_inhibit_shutdown_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + bool inhibit = std::get<1>(t); + kodi_addon_web_inhibit_shutdown_v1(this, hdl, inhibit); + return true; + } + case funcParent_kodi_addon_web_inhibit_screensaver_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_inhibit_screensaver(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, bool inhibit); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_inhibit_screensaver_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_inhibit_screensaver_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_web_inhibit_screensaver_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + bool inhibit = std::get<1>(t); + kodi_addon_web_inhibit_screensaver_v1(this, hdl, inhibit); + return true; + } + case funcParent_kodi_addon_web_is_muted_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_web_is_muted(KODI_ADDON_INSTANCE_BACKEND_HDL hdl); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_is_muted_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_is_muted_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_web_is_muted_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + bool auto_gen_ret = kodi_addon_web_is_muted_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_addon_web_is_muted_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_addon_web_control_set_control_ready_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_control_ready(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, bool ready); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_control_ready_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_control_ready_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_web_control_set_control_ready_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + bool ready = std::get<2>(t); + kodi_addon_web_control_set_control_ready_v1(this, hdl, handle, ready); + return true; + } + case funcParent_kodi_addon_web_control_set_opened_address_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_opened_address(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* title); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_opened_address_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_opened_address_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_web_control_set_opened_address_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + const std::string& title = std::get<2>(t); + kodi_addon_web_control_set_opened_address_v1(this, hdl, handle, title.c_str()); + return true; + } + case funcParent_kodi_addon_web_control_set_opened_title_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_opened_title(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* title); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_opened_title_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_opened_title_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_web_control_set_opened_title_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + const std::string& title = std::get<2>(t); + kodi_addon_web_control_set_opened_title_v1(this, hdl, handle, title.c_str()); + return true; + } + case funcParent_kodi_addon_web_control_set_icon_url_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_icon_url(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* icon); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_icon_url_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_icon_url_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_web_control_set_icon_url_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + const std::string& icon = std::get<2>(t); + kodi_addon_web_control_set_icon_url_v1(this, hdl, handle, icon.c_str()); + return true; + } + case funcParent_kodi_addon_web_control_set_fullscreen_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_fullscreen(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, bool fullscreen); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_fullscreen_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_fullscreen_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_web_control_set_fullscreen_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + bool fullscreen = std::get<2>(t); + kodi_addon_web_control_set_fullscreen_v1(this, hdl, handle, fullscreen); + return true; + } + case funcParent_kodi_addon_web_control_set_loading_state_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_loading_state(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, bool isLoading, bool canGoBack, bool canGoForward); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_loading_state_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_loading_state_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_web_control_set_loading_state_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + bool isLoading = std::get<2>(t); + bool canGoBack = std::get<3>(t); + bool canGoForward = std::get<4>(t); + kodi_addon_web_control_set_loading_state_v1(this, hdl, handle, isLoading, canGoBack, + canGoForward); + return true; + } + case funcParent_kodi_addon_web_control_set_tooltip_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_tooltip(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* tooltip); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_tooltip_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_tooltip_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_web_control_set_tooltip_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + const std::string& tooltip = std::get<2>(t); + kodi_addon_web_control_set_tooltip_v1(this, hdl, handle, tooltip.c_str()); + return true; + } + case funcParent_kodi_addon_web_control_set_status_message_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_status_message(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* status); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_status_message_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_status_message_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_web_control_set_status_message_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + const std::string& status = std::get<2>(t); + kodi_addon_web_control_set_status_message_v1(this, hdl, handle, status.c_str()); + return true; + } + case funcParent_kodi_addon_web_control_request_open_site_in_new_tab_v1: + { + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_request_open_site_in_new_tab(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* url); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_request_open_site_in_new_tab_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_request_open_site_in_new_tab_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_web_control_request_open_site_in_new_tab_v1 t = + in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + const std::string& url = std::get<2>(t); + kodi_addon_web_control_request_open_site_in_new_tab_v1(this, hdl, handle, url.c_str()); + return true; + } + default: + CLog::Log(LOGERROR, + "CHdl_kodi_addoninstance_web_h::{}: addon called with unknown function id '{}' on " + "group 'addoninstance_web_h'", + __func__, func); + } + + return false; +} + +// Function calls from Kodi to addon + +enum WEB_ADDON_ERROR CHdl_kodi_addoninstance_web_h::kodi_addon_web_start_instance_v1( + const KODI_ADDON_WEB_HDL hdl) +{ + // Original API call: typedef enum WEB_ADDON_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_START_INSTANCE_V1)(const KODI_ADDON_WEB_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_start_instance_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_start_instance_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_web_start_instance_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_start_instance_v1, in, out)) + return WEB_ADDON_ERROR_PERMANENT_FAILED; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_web_start_instance_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_web_start_instance_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_stop_instance_v1(const KODI_ADDON_WEB_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_STOP_INSTANCE_V1)(const KODI_ADDON_WEB_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_stop_instance_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_stop_instance_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_web_stop_instance_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_web_h, funcChild_kodi_addon_web_stop_instance_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_web_stop_instance_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_main_initialize_v1(const KODI_ADDON_WEB_HDL hdl) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_MAIN_INITIALIZE_V1)(const KODI_ADDON_WEB_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_main_initialize_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_main_initialize_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_web_main_initialize_v1(PtrValue(hdl))); + if (!m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_main_initialize_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_web_main_initialize_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_web_main_initialize_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_main_loop_v1(const KODI_ADDON_WEB_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_MAIN_LOOP_V1)(const KODI_ADDON_WEB_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_main_loop_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_main_loop_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_web_main_loop_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_web_h, funcChild_kodi_addon_web_main_loop_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_web_main_loop_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_main_shutdown_v1(const KODI_ADDON_WEB_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_MAIN_SHUTDOWN_V1)(const KODI_ADDON_WEB_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_main_shutdown_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_main_shutdown_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_web_main_shutdown_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addoninstance_web_h, funcChild_kodi_addon_web_main_shutdown_v1, + in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_web_main_shutdown_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_set_mute_v1(const KODI_ADDON_WEB_HDL hdl, + bool mute) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_SET_MUTE_V1)(const KODI_ADDON_WEB_HDL hdl, bool mute); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_set_mute_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_set_mute_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_web_set_mute_v1(PtrValue(hdl), mute)); + m_process->SendMessage(funcGroup_addoninstance_web_h, funcChild_kodi_addon_web_set_mute_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_web_set_mute_v1(m_ifcToAddon->thisClassHdl, hdl, mute); +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_set_language_v1(const KODI_ADDON_WEB_HDL hdl, + const char* language) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_SET_LANGUAGE_V1)(const KODI_ADDON_WEB_HDL hdl, const char* language); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_set_language_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_set_language_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_web_set_language_v1(PtrValue(hdl), language)); + if (!m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_set_language_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_web_set_language_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_web_set_language_v1(m_ifcToAddon->thisClassHdl, hdl, language); +} + +enum WEB_ADDON_ERROR CHdl_kodi_addoninstance_web_h::kodi_addon_web_create_control_v1( + const KODI_ADDON_WEB_HDL hdl, + const struct WEB_ADDON_GUI_PROPS* props, + const char* start_url, + WEB_KODI_CONTROL* handle) +{ + // Original API call: typedef enum WEB_ADDON_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CREATE_CONTROL_V1)(const KODI_ADDON_WEB_HDL hdl, const struct WEB_ADDON_GUI_PROPS* props, const char* start_url, WEB_KODI_CONTROL* handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_create_control_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_create_control_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_web_create_control_v1(PtrValue(hdl), props, start_url)); + if (!m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_create_control_v1, in, out)) + return WEB_ADDON_ERROR_PERMANENT_FAILED; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_web_create_control_v1 t = ident.get().as(); + *handle = reinterpret_cast(std::get<1>(t)); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_web_create_control_v1(m_ifcToAddon->thisClassHdl, hdl, props, + start_url, handle); +} + +enum WEB_ADDON_ERROR CHdl_kodi_addoninstance_web_h::kodi_addon_web_destroy_control_v1( + const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, bool complete) +{ + // Original API call: typedef enum WEB_ADDON_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_DESTROY_CONTROL_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, bool complete); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_destroy_control_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_destroy_control_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_web_destroy_control_v1(PtrValue(hdl), + PtrValue(handle), complete)); + if (!m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_destroy_control_v1, in, out)) + return WEB_ADDON_ERROR_PERMANENT_FAILED; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_web_destroy_control_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_web_destroy_control_v1(m_ifcToAddon->thisClassHdl, hdl, handle, + complete); +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_render_init_v1( + IOffscreenRenderProcess* proc, const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_RENDER_INIT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_render_init_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_render_init_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + int x = 0; + int y = 0; + int width = 0; + int height = 0; + ADDON_HARDWARE_CONTEXT context = nullptr; + if (!proc || !proc->GetOffscreenRenderInfos(x, y, width, height, context) || + !proc->CreateRenderHelper(m_process)) + return false; + + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_web_control_render_init_v1( + PtrKodiOffscreen(proc), proc->GetUsedId(), x, y, width, height, + PtrValue(context), PtrValue(hdl), PtrValue(handle))); + if (!m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_render_init_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_web_control_render_init_v1 t = ident.get().as(); + if (std::get<1>(t) == 0 || std::get<2>(t) == false) + return false; + proc->SetAddonOffscreenHdl(std::get<1>(t)); + proc->GetRenderHelper()->Init(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_web_control_render_init_v1(m_ifcToAddon->thisClassHdl, hdl, + handle); +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_render_deinit_v1( + IOffscreenRenderProcess* proc, const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_RENDER_DEINIT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_render_deinit_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_render_deinit_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + if (!proc) + return; + + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_web_control_render_deinit_v1( + proc->GetAddonOffscreenHdl(), PtrValue(hdl), PtrValue(handle))); + m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_render_deinit_v1, in); + + proc->GetRenderHelper()->Deinit(); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_web_control_render_deinit_v1(m_ifcToAddon->thisClassHdl, hdl, handle); +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_render_v1(IOffscreenRenderProcess* proc, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_RENDER_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_render_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_render_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + if (!proc) + return; + + proc->GetRenderHelper()->Begin(); + + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_web_control_render_v1( + proc->GetAddonOffscreenHdl(), PtrValue(hdl), PtrValue(handle))); + m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_render_v1, in); + + proc->GetRenderHelper()->End(); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_web_control_render_v1(m_ifcToAddon->thisClassHdl, hdl, handle); +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_dirty_v1(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_DIRTY_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_dirty_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_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_web_control_dirty_v1(PtrValue(hdl), PtrValue(handle))); + if (!m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_dirty_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_web_control_dirty_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_web_control_dirty_v1(m_ifcToAddon->thisClassHdl, hdl, handle); +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_on_init_v1(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_ON_INIT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_on_init_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_on_init_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, + msgChild__IN_kodi_addon_web_control_on_init_v1(PtrValue(hdl), PtrValue(handle))); + if (!m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_on_init_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_web_control_on_init_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_web_control_on_init_v1(m_ifcToAddon->thisClassHdl, hdl, handle); +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_on_action_v1( + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const struct KODI_ADDON_ACTION_DATA* action, + int* nextItem) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_ON_ACTION_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, const struct KODI_ADDON_ACTION_DATA* action, int* nextItem); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_on_action_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_on_action_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_web_control_on_action_v1( + PtrValue(hdl), PtrValue(handle), action, *nextItem)); + if (!m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_on_action_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_web_control_on_action_v1 t = ident.get().as(); + *nextItem = std::get<1>(t); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_web_control_on_action_v1(m_ifcToAddon->thisClassHdl, hdl, handle, + action, nextItem); +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_on_mouse_event_v1( + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + int id, + double x, + double y, + double offsetX, + double offsetY, + int state) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_ON_MOUSE_EVENT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, int id, double x, double y, double offsetX, double offsetY, int state); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_on_mouse_event_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_on_mouse_event_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_web_control_on_mouse_event_v1( + PtrValue(hdl), PtrValue(handle), id, x, y, offsetX, offsetY, state)); + if (!m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_on_mouse_event_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_web_control_on_mouse_event_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_web_control_on_mouse_event_v1( + m_ifcToAddon->thisClassHdl, hdl, handle, id, x, y, offsetX, offsetY, state); +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_open_website_v1( + const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, const char* url) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_OPEN_WEBSITE_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, const char* url); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_open_website_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_open_website_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_web_control_open_website_v1(PtrValue(hdl), + PtrValue(handle), url)); + if (!m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_open_website_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_web_control_open_website_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_web_control_open_website_v1(m_ifcToAddon->thisClassHdl, hdl, + handle, url); +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_get_history_v1( + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + char*** list, + size_t* entries, + bool behind_current) +{ + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_GET_HISTORY_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, char*** list, size_t* entries, bool behind_current); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_get_history_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgChild_OUT_kodi_addon_web_control_get_history_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_web_control_get_history_v1( + PtrValue(hdl), PtrValue(handle), *entries, behind_current)); + if (!m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_get_history_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_web_control_get_history_v1 t = ident.get().as(); + const std::vector& cpp_list = std::get<1>(t); + + *entries = std::get<2>(t); + assert(cpp_list.size() == *entries); + if (!cpp_list.empty()) + { + *list = static_cast(malloc(*entries * sizeof(char*))); + for (size_t i = 0; i < *entries; ++i) + (*list)[i] = strdup(cpp_list[i].c_str()); + } + else + { + *list = nullptr; + } + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_web_control_get_history_v1(m_ifcToAddon->thisClassHdl, hdl, + handle, list, entries, behind_current); +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_search_text_v1( + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const char* text, + bool forward, + bool matchCase, + bool findNext) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SEARCH_TEXT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, const char* text, bool forward, bool matchCase, bool findNext); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_search_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_search_text_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_web_control_search_text_v1( + PtrValue(hdl), PtrValue(handle), text, forward, matchCase, findNext)); + m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_search_text_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_web_control_search_text_v1(m_ifcToAddon->thisClassHdl, hdl, handle, text, + forward, matchCase, findNext); +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_stop_search_v1( + const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, bool clearSelection) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_STOP_SEARCH_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, bool clearSelection); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_stop_search_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_stop_search_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_web_control_stop_search_v1( + PtrValue(hdl), PtrValue(handle), clearSelection)); + m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_stop_search_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_web_control_stop_search_v1(m_ifcToAddon->thisClassHdl, hdl, handle, + clearSelection); +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_web_cmd_reload_v1( + const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_RELOAD_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_web_cmd_reload_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_cmd_reload_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack( + in, msgChild__IN_kodi_addon_web_control_web_cmd_reload_v1(PtrValue(hdl), PtrValue(handle))); + m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_web_cmd_reload_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_web_control_web_cmd_reload_v1(m_ifcToAddon->thisClassHdl, hdl, handle); +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_web_cmd_stop_load_v1( + const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_STOP_LOAD_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_web_cmd_stop_load_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_cmd_stop_load_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_web_control_web_cmd_stop_load_v1(PtrValue(hdl), + PtrValue(handle))); + m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_web_cmd_stop_load_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_web_control_web_cmd_stop_load_v1(m_ifcToAddon->thisClassHdl, hdl, + handle); +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_web_cmd_nav_back_v1( + const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_BACK_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_web_cmd_nav_back_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_cmd_nav_back_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_web_control_web_cmd_nav_back_v1(PtrValue(hdl), + PtrValue(handle))); + m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_web_cmd_nav_back_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_web_control_web_cmd_nav_back_v1(m_ifcToAddon->thisClassHdl, hdl, handle); +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_web_cmd_nav_forward_v1( + const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_FORWARD_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_web_cmd_nav_forward_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_cmd_nav_forward_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_web_control_web_cmd_nav_forward_v1(PtrValue(hdl), + PtrValue(handle))); + m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_web_cmd_nav_forward_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_web_control_web_cmd_nav_forward_v1(m_ifcToAddon->thisClassHdl, hdl, + handle); +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_web_open_own_context_menu_v1( + const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_OPEN_OWN_CONTEXT_MENU_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_web_open_own_context_menu_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_open_own_context_menu_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_web_control_web_open_own_context_menu_v1( + PtrValue(hdl), PtrValue(handle))); + m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_web_open_own_context_menu_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_web_control_web_open_own_context_menu_v1(m_ifcToAddon->thisClassHdl, hdl, + handle); +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_screen_size_change_v1( + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + float x, + float y, + float width, + float height, + bool fullscreen) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SCREEN_SIZE_CHANGE_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, float x, float y, float width, float height, bool fullscreen); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_screen_size_change_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_screen_size_change_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_web_control_screen_size_change_v1( + PtrValue(hdl), PtrValue(handle), x, y, width, height, fullscreen)); + m_process->SendMessage(funcGroup_addoninstance_web_h, + funcChild_kodi_addon_web_control_screen_size_change_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_web_control_screen_size_change_v1( + m_ifcToAddon->thisClassHdl, hdl, handle, x, y, width, height, fullscreen); +} + +// Callbacks from addon to Kodi + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_inhibit_shutdown_v1( + void* thisClassHdl, KODI_ADDON_INSTANCE_BACKEND_HDL hdl, bool inhibit) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::WEB::CWebAddon" with "void cb_inhibit_shutdown(bool inhibit)" on "web/WebAddon.h". + + KODI::WEB::CWebAddon* cb = static_cast(hdl); + cb->cb_inhibit_shutdown(inhibit); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_inhibit_screensaver_v1( + void* thisClassHdl, KODI_ADDON_INSTANCE_BACKEND_HDL hdl, bool inhibit) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::WEB::CWebAddon" with "void cb_inhibit_screensaver(bool inhibit)" on "web/WebAddon.h". + + KODI::WEB::CWebAddon* cb = static_cast(hdl); + cb->cb_inhibit_screensaver(inhibit); + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_is_muted_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::WEB::CWebAddon" with "bool cb_is_muted()" on "web/WebAddon.h". + + KODI::WEB::CWebAddon* cb = static_cast(hdl); + return cb->cb_is_muted(); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_set_control_ready_v1( + void* thisClassHdl, KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, bool ready) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::WEB::CWebAddon" with "void cb_control_set_control_ready(WEB_KODI_CONTROL handle, bool ready)" on "web/WebAddon.h". + + KODI::WEB::CWebAddon* cb = static_cast(hdl); + cb->cb_control_set_control_ready(handle, ready); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_set_opened_address_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* title) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::WEB::CWebAddon" with "void cb_control_set_opened_address(WEB_KODI_CONTROL handle, const char* address)" on "web/WebAddon.h". + + KODI::WEB::CWebAddon* cb = static_cast(hdl); + cb->cb_control_set_opened_address(handle, title); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_set_opened_title_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* title) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::WEB::CWebAddon" with "void cb_control_set_opened_title(WEB_KODI_CONTROL handle, const char* title)" on "web/WebAddon.h". + + KODI::WEB::CWebAddon* cb = static_cast(hdl); + cb->cb_control_set_opened_title(handle, title); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_set_icon_url_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* icon) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::WEB::CWebAddon" with "void cb_control_set_icon_url(WEB_KODI_CONTROL handle, const char* icon)" on "web/WebAddon.h". + + KODI::WEB::CWebAddon* cb = static_cast(hdl); + cb->cb_control_set_icon_url(handle, icon); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_set_fullscreen_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + bool fullscreen) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::WEB::CWebAddon" with "void cb_control_set_fullscreen(WEB_KODI_CONTROL handle, bool fullscreen)" on "web/WebAddon.h". + + KODI::WEB::CWebAddon* cb = static_cast(hdl); + cb->cb_control_set_fullscreen(handle, fullscreen); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_set_loading_state_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + bool isLoading, + bool canGoBack, + bool canGoForward) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::WEB::CWebAddon" with "void cb_control_set_loading_state(WEB_KODI_CONTROL handle, bool isLoading, bool canGoBack, bool canGoForward)" on "web/WebAddon.h". + + KODI::WEB::CWebAddon* cb = static_cast(hdl); + cb->cb_control_set_loading_state(handle, isLoading, canGoBack, canGoForward); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_set_tooltip_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* tooltip) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::WEB::CWebAddon" with "void cb_control_set_tooltip(WEB_KODI_CONTROL handle, const char* tooltip)" on "web/WebAddon.h". + + KODI::WEB::CWebAddon* cb = static_cast(hdl); + cb->cb_control_set_tooltip(handle, tooltip); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_set_status_message_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* status) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::WEB::CWebAddon" with "void cb_control_set_status_message(WEB_KODI_CONTROL handle, const char* status)" on "web/WebAddon.h". + + KODI::WEB::CWebAddon* cb = static_cast(hdl); + cb->cb_control_set_status_message(handle, status); + /*---AUTO_GEN_PARSE---*/ +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_request_open_site_in_new_tab_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* url) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::WEB::CWebAddon" with "void cb_control_request_open_site_in_new_tab(WEB_KODI_CONTROL handle, const char* url)" on "web/WebAddon.h". + + KODI::WEB::CWebAddon* cb = static_cast(hdl); + cb->cb_control_request_open_site_in_new_tab(handle, url); + /*---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/web.h b/xbmc/addons/interface/api/addon-instance/web.h new file mode 100644 index 0000000000000..48a3a2846ca95 --- /dev/null +++ b/xbmc/addons/interface/api/addon-instance/web.h @@ -0,0 +1,229 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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/web.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 +{ + +class IOffscreenRenderProcess; +struct directFuncToAddon_addoninstance_web_h; +struct directFuncToKodi_addoninstance_web_h; + +/* Code below becomes on auto generation reused, hand edited parts should included here */ +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ + +class CHdl_kodi_addoninstance_web_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_web_h(CInterface& interface) : IMsgHdl(interface) {} + + void InitDirect(directFuncToKodi_addoninstance_web_h* ifcToKodi, + directFuncToAddon_addoninstance_web_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 WEB_ADDON_ERROR kodi_addon_web_start_instance_v1( + const KODI_ADDON_WEB_HDL hdl); // Added with API 1 + + void kodi_addon_web_stop_instance_v1(const KODI_ADDON_WEB_HDL hdl); // Added with API 1 + + bool kodi_addon_web_main_initialize_v1(const KODI_ADDON_WEB_HDL hdl); // Added with API 1 + + void kodi_addon_web_main_loop_v1(const KODI_ADDON_WEB_HDL hdl); // Added with API 1 + + void kodi_addon_web_main_shutdown_v1(const KODI_ADDON_WEB_HDL hdl); // Added with API 1 + + void kodi_addon_web_set_mute_v1(const KODI_ADDON_WEB_HDL hdl, bool mute); // Added with API 1 + + bool kodi_addon_web_set_language_v1(const KODI_ADDON_WEB_HDL hdl, + const char* language); // Added with API 1 + + enum WEB_ADDON_ERROR kodi_addon_web_create_control_v1( + const KODI_ADDON_WEB_HDL hdl, + const struct WEB_ADDON_GUI_PROPS* props, + const char* start_url, + WEB_KODI_CONTROL* handle); // Added with API 1 + + enum WEB_ADDON_ERROR kodi_addon_web_destroy_control_v1(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + bool complete); // Added with API 1 + + bool kodi_addon_web_control_render_init_v1(IOffscreenRenderProcess* proc, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + void kodi_addon_web_control_render_deinit_v1(IOffscreenRenderProcess* proc, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + void kodi_addon_web_control_render_v1(IOffscreenRenderProcess* proc, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + bool kodi_addon_web_control_dirty_v1(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + bool kodi_addon_web_control_on_init_v1(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + bool kodi_addon_web_control_on_action_v1(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const struct KODI_ADDON_ACTION_DATA* action, + int* nextItem); // Added with API 1 + + bool kodi_addon_web_control_on_mouse_event_v1(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + int id, + double x, + double y, + double offsetX, + double offsetY, + int state); // Added with API 1 + + bool kodi_addon_web_control_open_website_v1(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const char* url); // Added with API 1 + + bool kodi_addon_web_control_get_history_v1(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + char*** list, + size_t* entries, + bool behind_current); // Added with API 1 + + void kodi_addon_web_control_search_text_v1(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const char* text, + bool forward, + bool matchCase, + bool findNext); // Added with API 1 + + void kodi_addon_web_control_stop_search_v1(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + bool clearSelection); // Added with API 1 + + void kodi_addon_web_control_web_cmd_reload_v1(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + void kodi_addon_web_control_web_cmd_stop_load_v1( + const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); // Added with API 1 + + void kodi_addon_web_control_web_cmd_nav_back_v1( + const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); // Added with API 1 + + void kodi_addon_web_control_web_cmd_nav_forward_v1( + const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); // Added with API 1 + + void kodi_addon_web_control_web_open_own_context_menu_v1( + const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); // Added with API 1 + + void kodi_addon_web_control_screen_size_change_v1(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + float x, + float y, + float width, + float height, + bool fullscreen); // 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_web_inhibit_shutdown_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + bool inhibit); // Added with API 1 + + static void kodi_addon_web_inhibit_screensaver_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + bool inhibit); // Added with API 1 + + static bool kodi_addon_web_is_muted_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl); // Added with API 1 + + static void kodi_addon_web_control_set_control_ready_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + bool ready); // Added with API 1 + + static void kodi_addon_web_control_set_opened_address_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* title); // Added with API 1 + + static void kodi_addon_web_control_set_opened_title_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* title); // Added with API 1 + + static void kodi_addon_web_control_set_icon_url_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* icon); // Added with API 1 + + static void kodi_addon_web_control_set_fullscreen_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + bool fullscreen); // Added with API 1 + + static void kodi_addon_web_control_set_loading_state_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + bool isLoading, + bool canGoBack, + bool canGoForward); // Added with API 1 + + static void kodi_addon_web_control_set_tooltip_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* tooltip); // Added with API 1 + + static void kodi_addon_web_control_set_status_message_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* status); // Added with API 1 + + static void kodi_addon_web_control_request_open_site_in_new_tab_v1( + void* thisClassHdl, + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* url); // Added with API 1 + + directFuncToAddon_addoninstance_web_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..6e281cc86279d --- /dev/null +++ b/xbmc/addons/interface/api/addon_base.cpp @@ -0,0 +1,1515 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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/InstanceHandler.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 "Application.h" +#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 "guilib/LocalizeStrings.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---*/ + +bool CHdl_kodi_addon_base_h::UpdateSettingInActiveDialog(const std::string& addonId, + 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() != addonId) + 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; +} + +/*---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_addon_path_v1 = kodi_addon_get_addon_path_v1; + ifcToKodi->kodi_addon_get_lib_path_v1 = kodi_addon_get_lib_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_localized_string_v1 = kodi_addon_localized_string_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; + ifcToKodi->kodi_addon_instance_get_user_path_v1 = kodi_addon_instance_get_user_path_v1; + ifcToKodi->kodi_addon_instance_is_setting_using_default_v1 = + kodi_addon_instance_is_setting_using_default_v1; + ifcToKodi->kodi_addon_instance_get_setting_bool_v1 = kodi_addon_instance_get_setting_bool_v1; + ifcToKodi->kodi_addon_instance_get_setting_int_v1 = kodi_addon_instance_get_setting_int_v1; + ifcToKodi->kodi_addon_instance_get_setting_float_v1 = kodi_addon_instance_get_setting_float_v1; + ifcToKodi->kodi_addon_instance_get_setting_string_v1 = kodi_addon_instance_get_setting_string_v1; + ifcToKodi->kodi_addon_instance_set_setting_bool_v1 = kodi_addon_instance_set_setting_bool_v1; + ifcToKodi->kodi_addon_instance_set_setting_int_v1 = kodi_addon_instance_set_setting_int_v1; + ifcToKodi->kodi_addon_instance_set_setting_float_v1 = kodi_addon_instance_set_setting_float_v1; + ifcToKodi->kodi_addon_instance_set_setting_string_v1 = kodi_addon_instance_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_addon_path_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_addon_path() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_addon_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_addon_path_v1; /* Autogenerated */ + char* auto_gen_ret = kodi_addon_get_addon_path_v1(this); + msgpack::pack(out, + msgParent_OUT_kodi_addon_get_addon_path_v1(auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + 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_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_localized_string_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_localized_string(long label_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_localized_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_localized_string_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_localized_string_v1 t = in.get().as(); + long label_id = std::get<0>(t); + char* auto_gen_ret = kodi_addon_localized_string_v1(this, label_id); + msgpack::pack(out, + msgParent_OUT_kodi_addon_localized_string_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, double* 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); + double 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, double 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); + double 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; + } + case funcParent_kodi_addon_instance_get_user_path_v1: + { + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_instance_get_user_path(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_get_user_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_get_user_path_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_instance_get_user_path_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + char* auto_gen_ret = kodi_addon_instance_get_user_path_v1(this, hdl); + msgpack::pack(out, msgParent_OUT_kodi_addon_instance_get_user_path_v1( + auto_gen_ret ? auto_gen_ret : "")); + if (auto_gen_ret) + free(auto_gen_ret); + return true; + } + case funcParent_kodi_addon_instance_is_setting_using_default_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_is_setting_using_default( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_is_setting_using_default_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_is_setting_using_default_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_instance_is_setting_using_default_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + const std::string& id = std::get<1>(t); + bool auto_gen_ret = kodi_addon_instance_is_setting_using_default_v1(this, hdl, id.c_str()); + msgpack::pack(out, + msgParent_OUT_kodi_addon_instance_is_setting_using_default_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_addon_instance_get_setting_bool_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_bool( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, bool* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_get_setting_bool_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_get_setting_bool_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_instance_get_setting_bool_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + const std::string& id = std::get<1>(t); + bool value = std::get<2>(t); + bool auto_gen_ret = kodi_addon_instance_get_setting_bool_v1(this, hdl, id.c_str(), &value); + msgpack::pack(out, + msgParent_OUT_kodi_addon_instance_get_setting_bool_v1(auto_gen_ret, value)); + return true; + } + case funcParent_kodi_addon_instance_get_setting_int_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_int( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, int* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_get_setting_int_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_get_setting_int_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_instance_get_setting_int_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + const std::string& id = std::get<1>(t); + int value = std::get<2>(t); + bool auto_gen_ret = kodi_addon_instance_get_setting_int_v1(this, hdl, id.c_str(), &value); + msgpack::pack(out, msgParent_OUT_kodi_addon_instance_get_setting_int_v1(auto_gen_ret, value)); + return true; + } + case funcParent_kodi_addon_instance_get_setting_float_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_float( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, double* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_get_setting_float_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_get_setting_float_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_instance_get_setting_float_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + const std::string& id = std::get<1>(t); + double value = std::get<2>(t); + bool auto_gen_ret = kodi_addon_instance_get_setting_float_v1(this, hdl, id.c_str(), &value); + msgpack::pack(out, + msgParent_OUT_kodi_addon_instance_get_setting_float_v1(auto_gen_ret, value)); + return true; + } + case funcParent_kodi_addon_instance_get_setting_string_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_string( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, char** value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_get_setting_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_get_setting_string_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_instance_get_setting_string_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + const std::string& id = std::get<1>(t); + char* value = nullptr; + bool auto_gen_ret = kodi_addon_instance_get_setting_string_v1(this, hdl, id.c_str(), &value); + msgpack::pack(out, msgParent_OUT_kodi_addon_instance_get_setting_string_v1( + auto_gen_ret, value ? value : "")); + if (value) + free(value); + return true; + } + case funcParent_kodi_addon_instance_set_setting_bool_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_bool( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, bool value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_set_setting_bool_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_set_setting_bool_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_instance_set_setting_bool_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + const std::string& id = std::get<1>(t); + bool value = std::get<2>(t); + bool auto_gen_ret = kodi_addon_instance_set_setting_bool_v1(this, hdl, id.c_str(), value); + msgpack::pack(out, msgParent_OUT_kodi_addon_instance_set_setting_bool_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_addon_instance_set_setting_int_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_int( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, int value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_set_setting_int_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_set_setting_int_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_instance_set_setting_int_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + const std::string& id = std::get<1>(t); + int value = std::get<2>(t); + bool auto_gen_ret = kodi_addon_instance_set_setting_int_v1(this, hdl, id.c_str(), value); + msgpack::pack(out, msgParent_OUT_kodi_addon_instance_set_setting_int_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_addon_instance_set_setting_float_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_float( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, double value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_set_setting_float_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_set_setting_float_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_instance_set_setting_float_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + const std::string& id = std::get<1>(t); + double value = std::get<2>(t); + bool auto_gen_ret = kodi_addon_instance_set_setting_float_v1(this, hdl, id.c_str(), value); + msgpack::pack(out, msgParent_OUT_kodi_addon_instance_set_setting_float_v1(auto_gen_ret)); + return true; + } + case funcParent_kodi_addon_instance_set_setting_string_v1: + { + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_string( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_set_setting_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_set_setting_string_v1; /* Autogenerated */ + msgParent__IN_kodi_addon_instance_set_setting_string_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_BACKEND_HDL hdl = + reinterpret_cast(std::get<0>(t)); + const std::string& id = std::get<1>(t); + const std::string& value = std::get<2>(t); + bool auto_gen_ret = + kodi_addon_instance_set_setting_string_v1(this, hdl, id.c_str(), value.c_str()); + msgpack::pack(out, msgParent_OUT_kodi_addon_instance_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 + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_create_v1( + const struct KODI_ADDON_INSTANCE_INFO* first_instance, KODI_ADDON_HDL* hdl) +{ + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_CREATE_V1)(const struct KODI_ADDON_INSTANCE_INFO* first_instance, KODI_ADDON_HDL* hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_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_create_v1(first_instance)); + if (!m_process->SendMessage(funcGroup_addon_base_h, funcChild_kodi_addon_create_v1, in, out)) + return ADDON_STATUS_OK; + 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, first_instance, hdl); +} + +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); +} + +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, double 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, double 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); +} + +/*---AUTO_GEN_PARSE---*/ +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_create_instance_v1( + const KODI_ADDON_HDL hdl, const struct KODI_ADDON_INSTANCE_INFO* info, 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::sbuffer out; + msgpack::pack(in, msgChild__IN_kodi_addon_create_instance_v1(PtrValue(hdl), info)); + 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(); + *instance = 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, info, + instance); +} +/*---AUTO_GEN_PARSE---*/ + +/*---AUTO_GEN_PARSE---*/ +void CHdl_kodi_addon_base_h::kodi_addon_destroy_instance_v1( + const KODI_ADDON_HDL hdl, + const struct KODI_ADDON_INSTANCE_INFO* info, + const 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), info, 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, info, instance); +} +/*---AUTO_GEN_PARSE---*/ + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_instance_setting_change_string_v1( + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + const char* value) +{ + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_STRING_V1)(const KODI_ADDON_HDL hdl, const KODI_ADDON_INSTANCE_HDL instance_hdl, const char* name, const char* value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_instance_setting_change_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_instance_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_instance_setting_change_string_v1( + PtrValue(hdl), PtrValue(instance_hdl), name, value)); + if (!m_process->SendMessage(funcGroup_addon_base_h, + funcChild_kodi_addon_instance_setting_change_string_v1, in, out)) + return ADDON_STATUS_OK; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_instance_setting_change_string_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_instance_setting_change_string_v1(m_ifcToAddon->thisClassHdl, hdl, + instance_hdl, name, value); +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_instance_setting_change_boolean_v1( + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + bool value) +{ + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_BOOLEAN_V1)(const KODI_ADDON_HDL hdl, const KODI_ADDON_INSTANCE_HDL instance_hdl, const char* name, bool value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_instance_setting_change_boolean_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_instance_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_instance_setting_change_boolean_v1( + PtrValue(hdl), PtrValue(instance_hdl), name, value)); + if (!m_process->SendMessage(funcGroup_addon_base_h, + funcChild_kodi_addon_instance_setting_change_boolean_v1, in, out)) + return ADDON_STATUS_OK; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_instance_setting_change_boolean_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_instance_setting_change_boolean_v1( + m_ifcToAddon->thisClassHdl, hdl, instance_hdl, name, value); +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_instance_setting_change_integer_v1( + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + int value) +{ + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_INTEGER_V1)(const KODI_ADDON_HDL hdl, const KODI_ADDON_INSTANCE_HDL instance_hdl, const char* name, int value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_instance_setting_change_integer_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_instance_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_instance_setting_change_integer_v1( + PtrValue(hdl), PtrValue(instance_hdl), name, value)); + if (!m_process->SendMessage(funcGroup_addon_base_h, + funcChild_kodi_addon_instance_setting_change_integer_v1, in, out)) + return ADDON_STATUS_OK; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_instance_setting_change_integer_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_instance_setting_change_integer_v1( + m_ifcToAddon->thisClassHdl, hdl, instance_hdl, name, value); +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_instance_setting_change_float_v1( + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + double value) +{ + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_FLOAT_V1)(const KODI_ADDON_HDL hdl, const KODI_ADDON_INSTANCE_HDL instance_hdl, const char* name, double value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_instance_setting_change_float_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_instance_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_instance_setting_change_float_v1( + PtrValue(hdl), PtrValue(instance_hdl), name, value)); + if (!m_process->SendMessage(funcGroup_addon_base_h, + funcChild_kodi_addon_instance_setting_change_float_v1, in, out)) + return ADDON_STATUS_OK; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_instance_setting_change_float_v1 t = ident.get().as(); + return std::get<0>(t); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_instance_setting_change_float_v1(m_ifcToAddon->thisClassHdl, hdl, + instance_hdl, name, value); +} + +KODI_ADDON_INSTANCE_HDL CHdl_kodi_addon_base_h::kodi_addon_instance_create_v1( + KODI_ADDON_INSTANCE_BACKEND_HDL kodi_hdl) +{ + // Original API call: typedef KODI_ADDON_INSTANCE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_CREATE_V1)(KODI_ADDON_INSTANCE_BACKEND_HDL kodi_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_instance_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_instance_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_instance_create_v1(PtrValue(kodi_hdl))); + if (!m_process->SendMessage(funcGroup_addon_base_h, funcChild_kodi_addon_instance_create_v1, in, + out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgChild_OUT_kodi_addon_instance_create_v1 t = ident.get().as(); + return reinterpret_cast(std::get<0>(t)); + } +#endif /* !KODI_INHIBIT_SHARED */ + + return m_ifcToAddon->kodi_addon_instance_create_v1(m_ifcToAddon->thisClassHdl, kodi_hdl); +} + +void CHdl_kodi_addon_base_h::kodi_addon_instance_destroy_v1(KODI_ADDON_INSTANCE_HDL hdl) +{ + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_DESTROY_V1)(KODI_ADDON_INSTANCE_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_instance_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_instance_destroy_v1; /* Autogenerated */ + +#ifndef KODI_INHIBIT_SHARED + if (!m_interface.m_directDll) + { + msgpack::sbuffer in; + msgpack::pack(in, msgChild__IN_kodi_addon_instance_destroy_v1(PtrValue(hdl))); + m_process->SendMessage(funcGroup_addon_base_h, funcChild_kodi_addon_instance_destroy_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + m_ifcToAddon->kodi_addon_instance_destroy_v1(m_ifcToAddon->thisClassHdl, hdl); +} + +// 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_addon_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_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_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_localized_string_v1(void* thisClassHdl, long label_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 + + 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---*/ +} + +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, + double* 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 = 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(), 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(), 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, + double 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(), 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(), 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---*/ +} + +char* CHdl_kodi_addon_base_h::kodi_addon_instance_get_user_path_v1( + void* thisClassHdl, const KODI_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return nullptr; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::ADDONS::INTERFACE::IInstanceHandler" with "char* get_instance_user_path()" on "addons/interface/InstanceHandler.h". + + KODI::ADDONS::INTERFACE::IInstanceHandler* cb = + static_cast(hdl); + return cb->get_instance_user_path(); + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_instance_is_setting_using_default_v1( + void* thisClassHdl, const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::ADDONS::INTERFACE::IInstanceHandler" with "bool is_instance_setting_using_default(const char* id)" on "addons/interface/InstanceHandler.h". + + KODI::ADDONS::INTERFACE::IInstanceHandler* cb = + static_cast(hdl); + return cb->is_instance_setting_using_default(id); + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_instance_get_setting_bool_v1( + void* thisClassHdl, const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, bool* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::ADDONS::INTERFACE::IInstanceHandler" with "bool get_instance_setting_bool(const char* id, bool* value)" on "addons/interface/InstanceHandler.h". + + KODI::ADDONS::INTERFACE::IInstanceHandler* cb = + static_cast(hdl); + return cb->get_instance_setting_bool(id, value); + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_instance_get_setting_int_v1( + void* thisClassHdl, const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, int* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::ADDONS::INTERFACE::IInstanceHandler" with "bool get_instance_setting_int(const char* id, int* value)" on "addons/interface/InstanceHandler.h". + + KODI::ADDONS::INTERFACE::IInstanceHandler* cb = + static_cast(hdl); + return cb->get_instance_setting_int(id, value); + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_instance_get_setting_float_v1( + void* thisClassHdl, const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, double* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::ADDONS::INTERFACE::IInstanceHandler" with "bool get_instance_setting_float(const char* id, double* value)" on "addons/interface/InstanceHandler.h". + + KODI::ADDONS::INTERFACE::IInstanceHandler* cb = + static_cast(hdl); + return cb->get_instance_setting_float(id, value); + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_instance_get_setting_string_v1( + void* thisClassHdl, const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, char** value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::ADDONS::INTERFACE::IInstanceHandler" with "bool get_instance_setting_string(const char* id, char** value)" on "addons/interface/InstanceHandler.h". + + KODI::ADDONS::INTERFACE::IInstanceHandler* cb = + static_cast(hdl); + return cb->get_instance_setting_string(id, value); + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_instance_set_setting_bool_v1( + void* thisClassHdl, const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, bool value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::ADDONS::INTERFACE::IInstanceHandler" with "bool set_instance_setting_bool(const char* id, bool value)" on "addons/interface/InstanceHandler.h". + + KODI::ADDONS::INTERFACE::IInstanceHandler* cb = + static_cast(hdl); + return cb->set_instance_setting_bool(id, value); + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_instance_set_setting_int_v1( + void* thisClassHdl, const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, int value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::ADDONS::INTERFACE::IInstanceHandler" with "bool set_instance_setting_int(const char* id, int value)" on "addons/interface/InstanceHandler.h". + + KODI::ADDONS::INTERFACE::IInstanceHandler* cb = + static_cast(hdl); + return cb->set_instance_setting_int(id, value); + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_instance_set_setting_float_v1( + void* thisClassHdl, const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, double value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::ADDONS::INTERFACE::IInstanceHandler" with "bool set_instance_setting_float(const char* id, double value)" on "addons/interface/InstanceHandler.h". + + KODI::ADDONS::INTERFACE::IInstanceHandler* cb = + static_cast(hdl); + return cb->set_instance_setting_float(id, value); + /*---AUTO_GEN_PARSE---*/ +} + +bool CHdl_kodi_addon_base_h::kodi_addon_instance_set_setting_string_v1( + void* thisClassHdl, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* id, + const char* value) +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return false; + + /*---AUTO_GEN_PARSE---*/ + // AUTOGENERATED - Used by class "KODI::ADDONS::INTERFACE::IInstanceHandler" with "bool set_instance_setting_string(const char* id, const char* value)" on "addons/interface/InstanceHandler.h". + + KODI::ADDONS::INTERFACE::IInstanceHandler* cb = + static_cast(hdl); + return cb->set_instance_setting_string(id, value); + /*---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..b08010af72131 --- /dev/null +++ b/xbmc/addons/interface/api/addon_base.h @@ -0,0 +1,235 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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---*/ + static bool UpdateSettingInActiveDialog(const std::string& addonId, + const std::string& id, + const std::string& value); + /*---AUTO_GEN_PARSE---*/ + + // Function calls from Kodi to addon + + enum ADDON_STATUS kodi_addon_create_v1(const struct KODI_ADDON_INSTANCE_INFO* first_instance, + KODI_ADDON_HDL* hdl); // Added with API 1 + + void kodi_addon_destroy_v1(KODI_ADDON_HDL hdl); // Added with API 1 + + 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, + double value); // Added with API 1 + + /*---AUTO_GEN_PARSE---*/ + enum ADDON_STATUS kodi_addon_create_instance_v1(const KODI_ADDON_HDL hdl, + const struct KODI_ADDON_INSTANCE_INFO* info, + KODI_HANDLE* instance); // Added with API 1 + /*---AUTO_GEN_PARSE---*/ + + /*---AUTO_GEN_PARSE---*/ + void kodi_addon_destroy_instance_v1(const KODI_ADDON_HDL hdl, + const struct KODI_ADDON_INSTANCE_INFO* info, + const KODI_HANDLE instance); // Added with API 1 + /*---AUTO_GEN_PARSE---*/ + + enum ADDON_STATUS kodi_addon_instance_setting_change_string_v1( + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + const char* value); // Added with API 1 + + enum ADDON_STATUS kodi_addon_instance_setting_change_boolean_v1( + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + bool value); // Added with API 1 + + enum ADDON_STATUS kodi_addon_instance_setting_change_integer_v1( + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + int value); // Added with API 1 + + enum ADDON_STATUS kodi_addon_instance_setting_change_float_v1( + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + double value); // Added with API 1 + + KODI_ADDON_INSTANCE_HDL kodi_addon_instance_create_v1( + KODI_ADDON_INSTANCE_BACKEND_HDL kodi_hdl); // Added with API 1 + + void kodi_addon_instance_destroy_v1(KODI_ADDON_INSTANCE_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_log_v1(void* thisClassHdl, + enum ADDON_LOG loglevel, + const char* format, + ...); // Added with API 1 + + static char* kodi_addon_get_addon_path_v1(void* thisClassHdl); // Added with API 1 + + static char* kodi_addon_get_lib_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_localized_string_v1(void* thisClassHdl, + long label_id); // 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, + double* 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, + double 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 + + static char* kodi_addon_instance_get_user_path_v1( + void* thisClassHdl, const KODI_ADDON_INSTANCE_BACKEND_HDL hdl); // Added with API 1 + + static bool kodi_addon_instance_is_setting_using_default_v1( + void* thisClassHdl, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* id); // Added with API 1 + + static bool kodi_addon_instance_get_setting_bool_v1(void* thisClassHdl, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* id, + bool* value); // Added with API 1 + + static bool kodi_addon_instance_get_setting_int_v1(void* thisClassHdl, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* id, + int* value); // Added with API 1 + + static bool kodi_addon_instance_get_setting_float_v1(void* thisClassHdl, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* id, + double* value); // Added with API 1 + + static bool kodi_addon_instance_get_setting_string_v1(void* thisClassHdl, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* id, + char** value); // Added with API 1 + + static bool kodi_addon_instance_set_setting_bool_v1(void* thisClassHdl, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* id, + bool value); // Added with API 1 + + static bool kodi_addon_instance_set_setting_int_v1(void* thisClassHdl, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* id, + int value); // Added with API 1 + + static bool kodi_addon_instance_set_setting_float_v1(void* thisClassHdl, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* id, + double value); // Added with API 1 + + static bool kodi_addon_instance_set_setting_string_v1(void* thisClassHdl, + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + 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..fde6c49a97930 --- /dev/null +++ b/xbmc/addons/interface/api/audio_engine.cpp @@ -0,0 +1,1186 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 */ + 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 */ + AUDIO_ENGINE_FMT fmt; + msgParent__IN_kodi_audioengine_stream_make_v1 t = in.get().as(); + 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).release(); + 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..5e2021c064cfb --- /dev/null +++ b/xbmc/addons/interface/api/audio_engine.h @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..74fdebdb2ec54 --- /dev/null +++ b/xbmc/addons/interface/api/filesystem.cpp @@ -0,0 +1,1998 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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, uint32_t 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)); + uint32_t 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(calloc(fileItems.Size(), sizeof(VFS_DIR_ENTRY))); + 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; + memset(&data, 0, sizeof(data)); + 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->lowrate = data.lowrate; + 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, + uint32_t 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..e08ed08a20463 --- /dev/null +++ b/xbmc/addons/interface/api/filesystem.h @@ -0,0 +1,268 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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, + uint32_t 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..f04b6eb1091bc --- /dev/null +++ b/xbmc/addons/interface/api/general.cpp @@ -0,0 +1,820 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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::CHOICE_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 (!CServiceBroker::GetKeyboardLayoutManager()->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 = CServiceBroker::GetKeyboardLayoutManager()->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..a3d64146a7c15 --- /dev/null +++ b/xbmc/addons/interface/api/general.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..4576acf7fa7c9 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/button.cpp @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..9fec4825aa857 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/button.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..c8b512fd7b724 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/edit.cpp @@ -0,0 +1,358 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..62cfa6e41dbbb --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/edit.h @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..ff3caab5476a2 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/fade_label.cpp @@ -0,0 +1,221 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..8d75a0bfe206c --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/fade_label.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..83cb6d1b6090c --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/image.cpp @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..b7be5e6587171 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/image.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..e6f031d0b2585 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/label.cpp @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..aec223b609cfe --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/label.h @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..4c431128280c0 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/progress.cpp @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..f65961635fc4a --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/progress.h @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..90dfeacfe338d --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/radio_button.cpp @@ -0,0 +1,242 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..96faeaad98e46 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/radio_button.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..fb0a145f3739a --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/rendering.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..4543ffd2f4c1b --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/rendering.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..acd26c66adc1c --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/settings_slider.cpp @@ -0,0 +1,491 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..30fda3c86b299 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/settings_slider.h @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..d14bb0397cd5d --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/slider.cpp @@ -0,0 +1,467 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..763e35b310c2a --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/slider.h @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..a9b39574d9e25 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/spin.cpp @@ -0,0 +1,509 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..ad1760fbdbbd7 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/spin.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..1a2918dca997b --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/text_box.cpp @@ -0,0 +1,303 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..c9379d73d1ef6 --- /dev/null +++ b/xbmc/addons/interface/api/gui/controls/text_box.h @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..4f8a7bec51ce5 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/context_menu.cpp @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..4576e10b3f8dc --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/context_menu.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..3a5b7579203a0 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/extended_progress.cpp @@ -0,0 +1,407 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..8fb92a3eb5cc3 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/extended_progress.h @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..ca4b45c04b935 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/filebrowser.cpp @@ -0,0 +1,545 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..c839d7f3fb71f --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/filebrowser.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..4b9855f3b90ba --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/keyboard.cpp @@ -0,0 +1,481 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..ee42b32a37692 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/keyboard.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..484efc9125f0b --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/numeric.cpp @@ -0,0 +1,389 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 */ + tm time; + msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_time_v1 t = in.get().as(); + 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 */ + tm date; + msgParent__IN_kodi_gui_dialogs_numeric_show_and_get_date_v1 t = in.get().as(); + 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..df342d05781dd --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/numeric.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..ef1ee05498c8d --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/ok.cpp @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..0b229642bf48a --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/ok.h @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..5f48f9409ebcd --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/progress.cpp @@ -0,0 +1,439 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..906f02ee84fb0 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/progress.h @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..e73f9eb5586d7 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/select.cpp @@ -0,0 +1,232 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..90372424cbefb --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/select.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..ec4d59b12c2b0 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/text_viewer.cpp @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..2b5b130e12d51 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/text_viewer.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..6f39dbf43593b --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/yes_no.cpp @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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::CHOICE_CANCELLED); + return (result == DialogResponse::CHOICE_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::CHOICE_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::CHOICE_CANCELLED); + return (result == DialogResponse::CHOICE_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..b4d5b3e5614e4 --- /dev/null +++ b/xbmc/addons/interface/api/gui/dialogs/yes_no.h @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..77d4e231e193c --- /dev/null +++ b/xbmc/addons/interface/api/gui/general.cpp @@ -0,0 +1,283 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_CONTEXT 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_CONTEXT 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---*/ + + std::unique_lock lock(CServiceBroker::GetWinSystem()->GetGfxContext()); + return CServiceBroker::GetGUI()->GetWindowManager().GetTopmostModalDialog(); + + /*---AUTO_GEN_PARSE---*/ +} + +ADDON_HARDWARE_CONTEXT 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..443158339a97d --- /dev/null +++ b/xbmc/addons/interface/api/gui/general.h @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_CONTEXT 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..2cea08762c7c6 --- /dev/null +++ b/xbmc/addons/interface/api/gui/list_item.cpp @@ -0,0 +1,624 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..3a74eb94e096f --- /dev/null +++ b/xbmc/addons/interface/api/gui/list_item.h @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..3cb709615ad37 --- /dev/null +++ b/xbmc/addons/interface/api/gui/window.cpp @@ -0,0 +1,2324 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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) + { + // Let addon decide whether it wants to handle action first + KODI_ADDON_ACTION_DATA actionAddon; + actionAddon.id = CAddonGUITranslator::TranslateActionIdToAddon(action.GetID()); + actionAddon.name = action.GetName().c_str(); + actionAddon.repeat = action.GetRepeat(); + actionAddon.hold_time = action.GetHoldTime(); + actionAddon.button_code = action.GetButtonCode(); + actionAddon.unicode = action.GetUnicode(); + actionAddon.text = action.GetText().c_str(); + for (unsigned int i = 0; i < ADDON_ACTION_AMOUNT_MAX; i++) + actionAddon.amount[i] = action.GetAmount(i); + + if (CBOnAction(m_clientHandle, &actionAddon)) + 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. + KODI_ADDON_ACTION_DATA actionAddon; + actionAddon.id = ADDON_ACTION_CONTEXT_MENU; + if (CBOnAction(m_clientHandle, &actionAddon)) + 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; + + auto& mgr = CServiceBroker::GetGUI()->GetTextureManager(); + + mgr.AddTexturePath(m_mediaDir); + CGUIMediaWindow::AllocResources(forceLoad); + mgr.RemoveTexturePath(m_mediaDir); +} + +void CGUIAddonWindow::Render() +{ + auto& mgr = CServiceBroker::GetGUI()->GetTextureManager(); + + mgr.AddTexturePath(m_mediaDir); + CGUIMediaWindow::Render(); + mgr.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]; + memset(&c_buttons, 0, sizeof(c_buttons)); + 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(); + CServiceBroker::GetAppMessenger()->SendMsg(TMSG_GUI_ADDON_DIALOG, 0, show ? 1 : 0, + static_cast(this)); + CServiceBroker::GetWinSystem()->GetGfxContext().restore(count); + } + else + CServiceBroker::GetAppMessenger()->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..b071eaaf3e1e4 --- /dev/null +++ b/xbmc/addons/interface/api/gui/window.h @@ -0,0 +1,327 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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, const KODI_ADDON_ACTION_DATA* action){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..cd271952d2983 --- /dev/null +++ b/xbmc/addons/interface/api/monitor.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..721f1c954836d --- /dev/null +++ b/xbmc/addons/interface/api/monitor.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..4989082487f95 --- /dev/null +++ b/xbmc/addons/interface/api/network.cpp @@ -0,0 +1,324 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..c214652870944 --- /dev/null +++ b/xbmc/addons/interface/api/network.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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/gui/CMakeLists.txt b/xbmc/addons/interface/gui/CMakeLists.txt new file mode 100644 index 0000000000000..b118bb7e68cdc --- /dev/null +++ b/xbmc/addons/interface/gui/CMakeLists.txt @@ -0,0 +1,14 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + GUIDialogCrashReporter.cpp +) + +set(HEADERS + GUIDialogCrashReporter.h +) + +if(NOT ENABLE_STATIC_LIBS OR SOURCES) + core_add_library(addons_interface_gui) +endif() diff --git a/xbmc/addons/interface/gui/GUIDialogCrashReporter.cpp b/xbmc/addons/interface/gui/GUIDialogCrashReporter.cpp new file mode 100644 index 0000000000000..b0970f97a5225 --- /dev/null +++ b/xbmc/addons/interface/gui/GUIDialogCrashReporter.cpp @@ -0,0 +1,206 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 "GUIDialogCrashReporter.h" + +#include "ServiceBroker.h" +#include "addons/AddonManager.h" +#include "addons/interface/Controller.h" +#include "dialogs/GUIDialogTextViewer.h" +#include "filesystem/File.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIWindowManager.h" +#include "guilib/LocalizeStrings.h" +#include "input/Key.h" +#include "utils/Variant.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +#define CONTROL_DISABLE_ADDON_BUTTON CONTROL_CUSTOM_BUTTON + +CGUIDialogCrashReporter::CGUIDialogCrashReporter() + : CGUIDialogBoxBase(WINDOW_DIALOG_ADDON_CRASH_REPORTER, "DialogConfirm.xml") +{ +} + +void CGUIDialogCrashReporter::OnInitWindow() +{ + SET_CONTROL_VISIBLE(CONTROL_DISABLE_ADDON_BUTTON); + SET_CONTROL_HIDDEN(CONTROL_PROGRESS_BAR); + SET_CONTROL_FOCUS(CONTROL_YES_BUTTON, 0); + + CGUIDialogBoxBase::OnInitWindow(); +} + +bool CGUIDialogCrashReporter::OnAction(const CAction& action) +{ + + return CGUIDialogBoxBase::OnAction(action); +} + +bool CGUIDialogCrashReporter::OnMessage(CGUIMessage& message) +{ + switch (message.GetMessage()) + { + case GUI_MSG_CLICKED: + { + int iControl = message.GetSenderId(); + int iAction = message.GetParam1(); + if (true || ACTION_SELECT_ITEM == iAction) + { + if (iControl == CONTROL_NO_BUTTON) + { + m_bConfirmed = false; + Close(); + return true; + } + if (iControl == CONTROL_YES_BUTTON) + { + m_bConfirmed = true; + Close(); + return true; + } + if (iControl == CONTROL_DISABLE_ADDON_BUTTON) + { + m_bConfirmed = false; + m_disableAddon = true; + Close(); + return true; + } + } + } + break; + } + return CGUIDialogBoxBase::OnMessage(message); +} + +bool CGUIDialogCrashReporter::OnBack(int actionID) +{ + m_canceled = true; + m_bConfirmed = false; + m_disableAddon = false; + return CGUIDialogBoxBase::OnBack(actionID); +} + +CGUIDialogCrashReporter::RESULT CGUIDialogCrashReporter::GetResult() const +{ + if (m_canceled) + return RESULT::Canceled; + else if (m_disableAddon) + return RESULT::DisableAddon; + else if (m_bConfirmed) + return RESULT::DisableAddonAndReport; + else + return RESULT::IgnoreCrash; +} + +void CGUIDialogCrashReporter::ReportCrash(const KODI::MESSAGING::HELPERS::DialogCrashReportMessage* options) +{ + ReportCrash(options->addon, options->uuid, options->stacktrace); + delete options; +} + +void CGUIDialogCrashReporter::ReportCrash(const std::string& addon, + const std::string& uuid, + const std::string& stacktrace) +{ + using namespace ADDON; + + AddonInfoPtr addonInfo = CServiceBroker::GetAddonMgr().GetAddonInfo(addon); + if (!addonInfo) + return; + + const auto gui = CServiceBroker::GetGUI(); + if (!gui) + return; + + CGUIDialogCrashReporter* dialog = gui->GetWindowManager().GetWindow( + WINDOW_DIALOG_ADDON_CRASH_REPORTER); + if (!dialog) + return; + + const std::string text = StringUtils::Format(g_localizeStrings.Get(2296), addonInfo->Name()); + dialog->SetHeading(2295); + dialog->SetText(text); + dialog->m_canceled = false; + dialog->m_bConfirmed = false; + dialog->m_disableAddon = false; + dialog->SetChoice(0, 2297); + dialog->SetChoice(1, 2299); + dialog->SetChoice(2, 2298); + dialog->Open(); + const RESULT result = dialog->GetResult(); + switch (result) + { + case RESULT::Canceled: + case RESULT::IgnoreCrash: + break; + case RESULT::DisableAddonAndReport: + SendCrashReport(gui, addonInfo, uuid, stacktrace); + // fallthru is intended + [[fallthrough]]; + case RESULT::DisableAddon: + CServiceBroker::GetAddonMgr().DisableAddon(addonInfo->ID(), + AddonDisabledReason::PERMANENT_FAILURE); + break; + + default: + break; + } +} + +void CGUIDialogCrashReporter::SendCrashReport(CGUIComponent* const gui, + const ADDON::AddonInfoPtr& addonInfo, + const std::string& uuid, + const std::string& stacktrace) +{ + using namespace ADDON; + using namespace XFILE; + + CGUIDialogTextViewer* dialog = + gui->GetWindowManager().GetWindow(WINDOW_DIALOG_TEXT_VIEWER); + if (!dialog) + return; + + dialog->SetHeading(g_localizeStrings.Get(2294)); + dialog->UseMonoFont(true); + + if (addonInfo->Type(addonInfo->MainType())->Language() == AddonLanguage::Java) + { + + const std::string path = + CServiceBroker::GetAddonIfcCtrl().GetDevkitReportPath() + "/hs_err_pid" + uuid + ".log"; + if (CFile::Exists(path)) + { + CFile file; + std::vector buf; + if (file.LoadFile(path, buf) > 0) + { + const std::string text(reinterpret_cast(buf.data()), buf.size()); + dialog->SetText(text); + } + } + } + else if (!stacktrace.empty()) + dialog->SetText(stacktrace); + else + { + dialog->SetText("NEED TODO"); + } + + dialog->Open(); +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/gui/GUIDialogCrashReporter.h b/xbmc/addons/interface/gui/GUIDialogCrashReporter.h new file mode 100644 index 0000000000000..2c4ea83e457cf --- /dev/null +++ b/xbmc/addons/interface/gui/GUIDialogCrashReporter.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 "dialogs/GUIDialogBoxBase.h" +#include "messaging/helpers/DialogCrashReporter.h" + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CGUIDialogCrashReporter : public CGUIDialogBoxBase +{ +public: + CGUIDialogCrashReporter(void); + ~CGUIDialogCrashReporter(void) override = default; + + bool OnMessage(CGUIMessage& message) override; + bool OnAction(const CAction& action) override; + bool OnBack(int actionID) override; + + static void ReportCrash(const std::string& addon, const std::string& uuid, const std::string& stacktrace); + + /*! + \brief Open a add-on crash report dialog and wait for input + + \param[in] options a struct of type DialogCrashReportMessage containing + the options to set for this dialog. + + \sa KODI::MESSAGING::HELPERS::DialogCrashReportMessage + */ + void ReportCrash(const KODI::MESSAGING::HELPERS::DialogCrashReportMessage* options); + +private: + void OnInitWindow() override; + + enum class RESULT + { + Canceled = -1, + IgnoreCrash, + DisableAddon, + DisableAddonAndReport, + }; + RESULT GetResult() const; + static void SendCrashReport(CGUIComponent* const gui, + const ADDON::AddonInfoPtr& addonInfo, + const std::string& uuid, + const std::string& stacktrace); + + bool m_canceled; + bool m_disableAddon; +}; + +} /* 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..586ed97fec00c --- /dev/null +++ b/xbmc/addons/interface/launcher/ILauncher.h @@ -0,0 +1,70 @@ +/* + * 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; } + const std::string& GetStackTrace() const { return m_stacktrace; } + +protected: + const std::shared_ptr m_addonInfo; + const std::string m_uuid; + + int m_exitCode = 0; + std::atomic m_lastStatus{ChildStatus::NotStarted}; + std::string m_stacktrace; +}; + +} /* 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..5e79dc3696ca9 --- /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; + } + else + { + CThread::Create(); + while (!m_startDone) + { + CThread::Sleep(1ms); + } + CThread::Sleep(10ms); + } + + 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..549bd16cd5291 --- /dev/null +++ b/xbmc/addons/interface/launcher/LauncherDirectDll.h @@ -0,0 +1,73 @@ +/* + * 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 "DynamicDll.h" +#include "ILauncher.h" +#include "threads/Thread.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..60a175ea32f67 --- /dev/null +++ b/xbmc/addons/interface/launcher/LauncherPosix.cpp @@ -0,0 +1,310 @@ +/* + * 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); + + if (pipe(m_childToParent) < 0) + { + CLog::Log(LOGERROR, "CChildLauncherPosix::{}: Failed to create pipe for child process", __func__); + return false; + } + + int writeFD = m_childToParent[WRITE_FD]; + int readFD = m_childToParent[READ_FD]; + + 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\n"); + _exit(127); + } +#endif + + // crash_reporter writes output to stderr. Connect it to the status pipe fd. + if (dup2(writeFD, STDERR_FILENO) == -1) + { + fprintf(stderr, "Failed to init stderr handling\n"); + _exit(127); + } + + close(readFD); + + execvp(argv[0], argv.data()); + + _exit(0); + } + + close(writeFD); + + 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); + } + } + + return true; +} + +bool CLauncherPosix::Kill(bool wait) +{ + pid_t pid = m_pid; + fprintf(stderr, "KILL\n"); + if (pid > 0) + { + 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__, pid); + return true; + } + } + + CLog::Log(LOGDEBUG, "CChildLauncherPosix::{}: Forcing stop of child (pid {})", __func__, + pid); + + bool did_terminate = kill(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(pid, nullptr, WNOHANG)); + } + if (ret_pid > 0) + return true; + + did_terminate = kill(pid, SIGKILL) == 0; + if (did_terminate) + { + ret_pid = HANDLE_EINTR(waitpid(pid, nullptr, 0)); + if (ret_pid > 0) + return true; + } + } + + if (!did_terminate) + { + CLog::Log(LOGERROR, "CChildLauncherPosix::{}: Unable to terminate process {}", __func__, + pid); + return false; + } + } + + if (m_childToParent[READ_FD] > 0) + { + close(m_childToParent[READ_FD]); + m_childToParent[READ_FD] = -1; + } + } + + return true; +} + +ChildStatus CLauncherPosix::ProcessActive() +{ + pid_t pid = m_pid; + if (pid > 0) + { + int status = 0; + pid_t ret = waitpid(pid, &status, WNOHANG | WUNTRACED | WCONTINUED); + if (ret == 0) + { + m_lastStatus = ChildStatus::Running; + } + else if (ret == -1) + { + if (m_childToParent[READ_FD] > 0) + { + constexpr int BUFFER_SIZE = 1024; + char buffer[BUFFER_SIZE + 1] = {0}; + m_stacktrace.clear(); + while (read(m_childToParent[READ_FD], buffer, BUFFER_SIZE) > 0) + { + m_stacktrace += buffer; + memset(buffer, 0, BUFFER_SIZE); + } + fprintf(stderr, "--------->>>>>>>>>>>>>> %s\n", m_stacktrace.c_str()); + close(m_childToParent[READ_FD]); + m_childToParent[READ_FD] = -1; + } + + CLog::Log(LOGERROR, "CChildLauncherPosix::{}: Asked sandbox process pid {} no more present", + __func__, 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..ddb4a8aebf603 --- /dev/null +++ b/xbmc/addons/interface/launcher/LauncherPosix.h @@ -0,0 +1,67 @@ +/* + * 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" + +#include + +#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: + enum PIPE_FILE_DESCRIPTERS + { + READ_FD = 0, + WRITE_FD = 1 + }; + + void ProcessStatus(int status); + + std::atomic m_pid{-1}; + int m_childToParent[2]{-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..d24cfcbf42217 --- /dev/null +++ b/xbmc/addons/interface/processinfo/ProcessInfo.h @@ -0,0 +1,51 @@ +/* + * 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..09cc8421eec2f --- /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..c5e0d47267d1b --- /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/renderer/CMakeLists.txt b/xbmc/addons/interface/renderer/CMakeLists.txt new file mode 100644 index 0000000000000..d4d302d9c3d63 --- /dev/null +++ b/xbmc/addons/interface/renderer/CMakeLists.txt @@ -0,0 +1,15 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + GLViewRenderer.cpp +) + +set(HEADERS + GLViewRenderer.h + IRenderHelper.h +) + +if(NOT ENABLE_STATIC_LIBS OR SOURCES) + core_add_library(addons_interface_renderer) +endif() diff --git a/xbmc/addons/interface/renderer/GLViewRenderer.cpp b/xbmc/addons/interface/renderer/GLViewRenderer.cpp new file mode 100644 index 0000000000000..6e7a1e183f238 --- /dev/null +++ b/xbmc/addons/interface/renderer/GLViewRenderer.cpp @@ -0,0 +1,225 @@ +/* + * Copyright (C) 2020 Team Kodi (https://kodi.tv) + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#include "GLViewRenderer.h" + +#include "ServiceBroker.h" +#include "addons/kodi-dev-kit/src/shared/SharedGL.h" +#include "filesystem/File.h" +#include "rendering/RenderSystem.h" +#include "utils/EGLUtils.h" +#include "utils/StringUtils.h" +#include "utils/log.h" +#include "../kodi-dev-kit/src/shared/SharedData.h" +#include "../kodi-dev-kit/src/shared/socket.h" + +using namespace KODI::ADDONS::INTERFACE; + +namespace +{ + +constexpr const float render_vertices[20] = { + -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, // top left + 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, // top right + 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, // bottom right + -1.0f, 1.0f, 0.0f, 0.0f, 1.0f // bottom left +}; + +constexpr const unsigned char render_indices[4] = {0, 1, 3, 2}; + +} // namespace + +CViewRendererOpenGL::CViewRendererOpenGL(const std::string& clientIdentifier) + : m_socketServerFile("/tmp/" + clientIdentifier + "-renderproc"), + m_socketClientFile("/tmp/" + clientIdentifier + "-renderview") +{ +} + +CViewRendererOpenGL::~CViewRendererOpenGL() +{ + Deinit(); +} + +bool CViewRendererOpenGL::Init() +{ + if (m_inited) + return true; + + std::string vertShader, fraqShader; + GetShaders(vertShader, fraqShader); + if (!LoadShaderFiles(vertShader, fraqShader) || !CompileAndLink()) + { + CLog::Log(LOGERROR, "Failed to create or compile shader"); + return false; + } + + m_eglDisplay = eglGetCurrentDisplay(); + if (m_eglDisplay == EGL_NO_DISPLAY) + { + CLog::Log(LOGERROR, "Not get EGL display"); + return false; + } + + if (!CEGLUtils::HasExtension(m_eglDisplay, "EGL_KHR_image_base")) + { + CLog::Log(LOGERROR, "Needed EGL extension \"EGL_KHR_image_base\" not available"); + return false; + } + + if (!CServiceBroker::GetRenderSystem()->IsExtSupported("GL_OES_EGL_image")) + { + CLog::Log(LOGERROR, "Needed EGL extension \"GL_OES_EGL_image\" not available"); + return false; + } + + eglCreateImageKHR = CEGLUtils::GetRequiredProcAddress("eglCreateImageKHR"); + eglDestroyImageKHR = CEGLUtils::GetRequiredProcAddress("eglDestroyImageKHR"); + glEGLImageTargetTexture2DOES = CEGLUtils::GetRequiredProcAddress("glEGLImageTargetTexture2DOES"); + + glEnable(GL_BLEND); + + // Unix Domain Socket: Receive file descriptor (texture_dmabuf_fd) and texture storage data (dmabuf) + int texture_dmabuf_fd; + struct texture_storage_metadata_t dmabuf; + + int sock = create_socket(m_socketClientFile.c_str()); + read_fd(sock, &texture_dmabuf_fd, &dmabuf, sizeof(dmabuf)); + close(sock); + + int i = 0; + EGLint attribute_list[64]; + + attribute_list[i++] = EGL_WIDTH; + attribute_list[i++] = dmabuf.width; + attribute_list[i++] = EGL_HEIGHT; + attribute_list[i++] = dmabuf.height; + attribute_list[i++] = EGL_LINUX_DRM_FOURCC_EXT; + attribute_list[i++] = dmabuf.fourcc; + + attribute_list[i++] = EGL_DMA_BUF_PLANE0_FD_EXT; + attribute_list[i++] = texture_dmabuf_fd; + attribute_list[i++] = EGL_DMA_BUF_PLANE0_PITCH_EXT; + attribute_list[i++] = dmabuf.stride; + attribute_list[i++] = EGL_DMA_BUF_PLANE0_OFFSET_EXT; + attribute_list[i++] = dmabuf.offset; +#ifdef EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT + if (dmabuf.modifiers) + { + attribute_list[i++] = EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT; + attribute_list[i++] = static_cast(dmabuf.modifiers & 0xFFFFFFFF); + attribute_list[i++] = EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT; + attribute_list[i++] = static_cast(dmabuf.modifiers >> 32); + } +#endif + attribute_list[i++] = EGL_NONE; + + m_image = eglCreateImageKHR(m_eglDisplay, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, nullptr, + attribute_list); + if (m_image == EGL_NO_IMAGE) + { + CLog::Log(LOGERROR, "Failed to get EGL image"); + return false; + } + + XFILE::CFile::Delete(m_socketServerFile); + XFILE::CFile::Delete(m_socketClientFile); + + // GL texture that will be shared + glGenTextures(1, &m_texture); + glBindTexture(GL_TEXTURE_2D, m_texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, m_image); + eglDestroyImageKHR(m_eglDisplay, m_image); + + glBindTexture(GL_TEXTURE_2D, 0); + + close(texture_dmabuf_fd); + + glGenBuffers(1, &m_vertexVBO); + glGenBuffers(1, &m_indexVBO); + + m_inited = true; + return true; +} + +void CViewRendererOpenGL::Deinit() +{ + if (!m_inited) + return; + + m_inited = false; + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, 0); + glDeleteTextures(1, &m_texture); + m_texture = 0; + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glDeleteBuffers(1, &m_vertexVBO); + m_vertexVBO = 0; + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glDeleteBuffers(1, &m_indexVBO); + m_indexVBO = 0; +} + +void CViewRendererOpenGL::Begin() +{ + +} + +void CViewRendererOpenGL::End() +{ + if (!m_inited) + return; + + glBindBuffer(GL_ARRAY_BUFFER, m_vertexVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(render_vertices), render_vertices, GL_STATIC_DRAW); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexVBO); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(render_indices), render_indices, GL_STATIC_DRAW); + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0); + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float))); + + Enable(); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, m_texture); + glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, 0); + + Disable(); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); +} + +void CViewRendererOpenGL::OnCompiledAndLinked() +{ + m_aPosition = glGetAttribLocation(ProgramHandle(), "aPos"); + m_aCoord = glGetAttribLocation(ProgramHandle(), "aTexCoords"); +} + +bool CViewRendererOpenGL::OnEnabled() +{ + return true; +} + +void CViewRendererOpenGL::GetShaders(std::string& vert, std::string& frag) +{ +#if defined(HAS_GL) + vert = "gl_shader_vert_addon_backend.glsl"; + frag = "gl_shader_frag_addon_backend.glsl"; +#else + vert = "gles_shader_vert_addon_backend.glsl"; + frag = "gles_shader_frag_addon_backend.glsl"; +#endif +} diff --git a/xbmc/addons/interface/renderer/GLViewRenderer.h b/xbmc/addons/interface/renderer/GLViewRenderer.h new file mode 100644 index 0000000000000..d562030c83b1c --- /dev/null +++ b/xbmc/addons/interface/renderer/GLViewRenderer.h @@ -0,0 +1,65 @@ +/* + * 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 "system_egl.h" +#include "IRenderHelper.h" +#include "guilib/Shader.h" + +#include + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +class CViewRendererOpenGL : public Shaders::CGLSLShaderProgram, public IRenderHelper +{ +public: + CViewRendererOpenGL(const std::string& clientIdentifier); + ~CViewRendererOpenGL(); + + bool Init() override; + void Deinit() override; + void Begin() override; + void End() override; + +protected: + void OnCompiledAndLinked() override; + bool OnEnabled() override; + +private: + void GetShaders(std::string& vert, std::string& frag); + + const std::string m_socketServerFile; + const std::string m_socketClientFile; + + EGLDisplay m_eglDisplay = EGL_NO_DISPLAY; + EGLImageKHR m_image = EGL_NO_IMAGE_KHR; + + GLuint m_vertexVBO = 0; + GLuint m_indexVBO = 0; + + GLint m_aPosition = -1; + GLint m_aCoord = -1; + GLuint m_texture = 0; + + PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR = nullptr; + PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR = nullptr; + PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES = nullptr; + + bool m_inited = false; +}; + +using CRenderHelper = CViewRendererOpenGL; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/interface/renderer/IRenderHelper.h b/xbmc/addons/interface/renderer/IRenderHelper.h new file mode 100644 index 0000000000000..eebfac8379f87 --- /dev/null +++ b/xbmc/addons/interface/renderer/IRenderHelper.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 +{ + +struct IRenderHelper +{ + virtual ~IRenderHelper() = default; + virtual bool Init() = 0; + virtual void Deinit() = 0; + virtual void Begin() = 0; + virtual void End() = 0; +}; /* class IRenderHelper */ + +struct CRenderHelperStub : public IRenderHelper +{ + CRenderHelperStub(const std::string& clientIdentifier) {} + bool Init() override { return true; } + void Deinit() override {} + void Begin() override {} + void End() override {} +}; /* class CRenderHelperStub */ + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +#if defined(TARGET_LINUX) +#include "GLViewRenderer.h" +#endif 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 e00130d74191d..0000000000000 --- a/xbmc/addons/interfaces/AddonBase.cpp +++ /dev/null @@ -1,657 +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 "Application.h" -#include "GUIUserMessages.h" -#include "addons/binary-addons/AddonDll.h" -#include "addons/gui/GUIDialogAddonSettings.h" -#include "addons/settings/AddonSettings.h" -#include "filesystem/Directory.h" -#include "filesystem/SpecialProtocol.h" -#include "guilib/GUIComponent.h" -#include "guilib/GUIWindowManager.h" -#include "guilib/LocalizeStrings.h" -#include "utils/URIUtils.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_ADDON_INSTANCE_STRUCT* firstKodiInstance) -{ - addonInterface = {}; - - 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->addon_log_msg = addon_log_msg; - addonInterface.toKodi->free_string = free_string; - addonInterface.toKodi->free_string_array = free_string_array; - - addonInterface.toKodi->kodi_addon = new AddonToKodiFuncTable_kodi_addon(); - addonInterface.toKodi->kodi_addon->get_addon_path = get_addon_path; - addonInterface.toKodi->kodi_addon->get_lib_path = get_lib_path; - addonInterface.toKodi->kodi_addon->get_user_path = get_user_path; - addonInterface.toKodi->kodi_addon->get_temp_path = get_temp_path; - addonInterface.toKodi->kodi_addon->get_localized_string = get_localized_string; - addonInterface.toKodi->kodi_addon->open_settings_dialog = open_settings_dialog; - addonInterface.toKodi->kodi_addon->is_setting_using_default = is_setting_using_default; - addonInterface.toKodi->kodi_addon->get_setting_bool = get_setting_bool; - addonInterface.toKodi->kodi_addon->get_setting_int = get_setting_int; - addonInterface.toKodi->kodi_addon->get_setting_float = get_setting_float; - addonInterface.toKodi->kodi_addon->get_setting_string = get_setting_string; - addonInterface.toKodi->kodi_addon->set_setting_bool = set_setting_bool; - addonInterface.toKodi->kodi_addon->set_setting_int = set_setting_int; - addonInterface.toKodi->kodi_addon->set_setting_float = set_setting_float; - addonInterface.toKodi->kodi_addon->set_setting_string = set_setting_string; - addonInterface.toKodi->kodi_addon->get_addon_info = get_addon_info; - addonInterface.toKodi->kodi_addon->get_type_version = get_type_version; - addonInterface.toKodi->kodi_addon->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.toKodi) - delete addonInterface.toKodi->kodi_addon; - 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, - AddonInstanceId instanceId, - 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); - message.SetParam1(instanceId); - 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. - */ -//@{ - -void Interface_Base::addon_log_msg(const KODI_ADDON_BACKEND_HDL hdl, - const int addonLogLevel, - const char* strMessage) -{ - CAddonDll* addon = static_cast(hdl); - 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); -} - -char* Interface_Base::get_type_version(const KODI_ADDON_BACKEND_HDL hdl, int type) -{ - return strdup(kodi::addon::GetTypeVersion(type)); -} - -char* Interface_Base::get_addon_path(const KODI_ADDON_BACKEND_HDL hdl) -{ - CAddonDll* addon = static_cast(hdl); - 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_lib_path(const KODI_ADDON_BACKEND_HDL hdl) -{ - CAddonDll* addon = static_cast(hdl); - if (addon == nullptr) - { - CLog::Log(LOGERROR, "get_lib_path(...) called with empty kodi instance pointer"); - return nullptr; - } - - return strdup(CSpecialProtocol::TranslatePath("special://xbmcbinaddons/" + addon->ID()).c_str()); -} - -char* Interface_Base::get_user_path(const KODI_ADDON_BACKEND_HDL hdl) -{ - CAddonDll* addon = static_cast(hdl); - if (addon == nullptr) - { - CLog::Log(LOGERROR, "get_user_path(...) called with empty kodi instance pointer"); - return nullptr; - } - - return strdup(CSpecialProtocol::TranslatePath(addon->Profile()).c_str()); -} - -char* Interface_Base::get_temp_path(const KODI_ADDON_BACKEND_HDL hdl) -{ - CAddonDll* addon = static_cast(hdl); - if (addon == nullptr) - { - CLog::Log(LOGERROR, "get_temp_path(...) called with empty kodi instance pointer"); - 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_Base::get_localized_string(const KODI_ADDON_BACKEND_HDL hdl, long label_id) -{ - CAddonDll* addon = static_cast(hdl); - if (!addon) - { - CLog::Log(LOGERROR, "get_localized_string(...) called with empty kodi instance pointer"); - 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_Base::get_addon_info(const KODI_ADDON_BACKEND_HDL hdl, const char* id) -{ - CAddonDll* addon = static_cast(hdl); - if (addon == nullptr || id == nullptr) - { - CLog::Log(LOGERROR, "get_addon_info(...) called with empty pointer"); - 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_Base::{} - add-on '{}' requests invalid id '{}'", __func__, - addon->Name(), id); - return nullptr; - } - - char* buffer = strdup(str.c_str()); - return buffer; -} - -bool Interface_Base::open_settings_dialog(const KODI_ADDON_BACKEND_HDL hdl) -{ - CAddonDll* addon = static_cast(hdl); - if (addon == nullptr) - { - CLog::Log(LOGERROR, "open_settings_dialog(...) called with empty kodi instance pointer"); - return false; - } - - // show settings dialog - AddonPtr addonInfo; - if (!CServiceBroker::GetAddonMgr().GetAddon(addon->ID(), addonInfo, ADDON_UNKNOWN, - OnlyEnabled::CHOICE_YES)) - { - CLog::Log(LOGERROR, "Interface_Base::{} - Could not get addon information for '{}'", __func__, - addon->ID()); - return false; - } - - return CGUIDialogAddonSettings::ShowForAddon(addonInfo); -} - -bool Interface_Base::is_setting_using_default(const KODI_ADDON_BACKEND_HDL hdl, const char* id) -{ - CAddonDll* addon = static_cast(hdl); - if (addon == nullptr || id == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}')", __func__, hdl, - 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(const KODI_ADDON_BACKEND_HDL hdl, const char* id, bool* value) -{ - CAddonDll* addon = static_cast(hdl); - if (addon == nullptr || id == nullptr || value == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}', value='{}')", - __func__, hdl, 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(const KODI_ADDON_BACKEND_HDL hdl, const char* id, int* value) -{ - CAddonDll* addon = static_cast(hdl); - if (addon == nullptr || id == nullptr || value == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}', value='{}')", - __func__, hdl, 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(const KODI_ADDON_BACKEND_HDL hdl, - const char* id, - float* value) -{ - CAddonDll* addon = static_cast(hdl); - if (addon == nullptr || id == nullptr || value == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}', value='{}')", - __func__, hdl, 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(const KODI_ADDON_BACKEND_HDL hdl, - const char* id, - char** value) -{ - CAddonDll* addon = static_cast(hdl); - if (addon == nullptr || id == nullptr || value == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}', value='{}')", - __func__, hdl, 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(const KODI_ADDON_BACKEND_HDL hdl, const char* id, bool value) -{ - CAddonDll* addon = static_cast(hdl); - if (addon == nullptr || id == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}')", __func__, hdl, - static_cast(id)); - - return false; - } - - if (Interface_Base::UpdateSettingInActiveDialog(addon, ADDON_SETTINGS_ID, 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(const KODI_ADDON_BACKEND_HDL hdl, const char* id, int value) -{ - CAddonDll* addon = static_cast(hdl); - if (addon == nullptr || id == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}')", __func__, hdl, - static_cast(id)); - - return false; - } - - if (Interface_Base::UpdateSettingInActiveDialog(addon, ADDON_SETTINGS_ID, 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(const KODI_ADDON_BACKEND_HDL hdl, - const char* id, - float value) -{ - CAddonDll* addon = static_cast(hdl); - if (addon == nullptr || id == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}')", __func__, hdl, - static_cast(id)); - - return false; - } - - if (Interface_Base::UpdateSettingInActiveDialog(addon, ADDON_SETTINGS_ID, 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(const KODI_ADDON_BACKEND_HDL hdl, - const char* id, - const char* value) -{ - CAddonDll* addon = static_cast(hdl); - if (addon == nullptr || id == nullptr || value == nullptr) - { - CLog::Log(LOGERROR, "Interface_Base::{} - invalid data (addon='{}', id='{}', value='{}')", - __func__, hdl, static_cast(id), static_cast(value)); - - return false; - } - - if (Interface_Base::UpdateSettingInActiveDialog(addon, ADDON_SETTINGS_ID, 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(const KODI_ADDON_BACKEND_HDL hdl, char* str) -{ - if (str) - free(str); -} - -void Interface_Base::free_string_array(const KODI_ADDON_BACKEND_HDL hdl, - char** arr, - int numElements) -{ - if (arr) - { - for (int i = 0; i < numElements; ++i) - { - free(arr[i]); - } - free(arr); - } -} - -void* Interface_Base::get_interface(const KODI_ADDON_BACKEND_HDL hdl, - 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 a9e9a4b218e3e..0000000000000 --- a/xbmc/addons/interfaces/AddonBase.h +++ /dev/null @@ -1,87 +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/IAddon.h" -#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_ADDON_INSTANCE_STRUCT* firstKodiInstance); - static void DeInitInterface(AddonGlobalInterface& addonInterface); - static void RegisterInterface(ADDON_GET_INTERFACE_FN fn); - static bool UpdateSettingInActiveDialog(CAddonDll* addon, - AddonInstanceId instanceId, - 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 void addon_log_msg(const KODI_ADDON_BACKEND_HDL hdl, - const int addonLogLevel, - const char* strMessage); - static char* get_type_version(const KODI_ADDON_BACKEND_HDL hdl, int type); - static char* get_addon_path(const KODI_ADDON_BACKEND_HDL hdl); - static char* get_lib_path(const KODI_ADDON_BACKEND_HDL hdl); - static char* get_user_path(const KODI_ADDON_BACKEND_HDL hdl); - static char* get_temp_path(const KODI_ADDON_BACKEND_HDL hdl); - static char* get_localized_string(const KODI_ADDON_BACKEND_HDL hdl, long label_id); - static char* get_addon_info(const KODI_ADDON_BACKEND_HDL hdl, const char* id); - static bool open_settings_dialog(const KODI_ADDON_BACKEND_HDL hdl); - static bool is_setting_using_default(const KODI_ADDON_BACKEND_HDL hdl, const char* id); - static bool get_setting_bool(const KODI_ADDON_BACKEND_HDL hdl, const char* id, bool* value); - static bool get_setting_int(const KODI_ADDON_BACKEND_HDL hdl, const char* id, int* value); - static bool get_setting_float(const KODI_ADDON_BACKEND_HDL hdl, const char* id, float* value); - static bool get_setting_string(const KODI_ADDON_BACKEND_HDL hdl, const char* id, char** value); - static bool set_setting_bool(const KODI_ADDON_BACKEND_HDL hdl, const char* id, bool value); - static bool set_setting_int(const KODI_ADDON_BACKEND_HDL hdl, const char* id, int value); - static bool set_setting_float(const KODI_ADDON_BACKEND_HDL hdl, const char* id, float value); - static bool set_setting_string(const KODI_ADDON_BACKEND_HDL hdl, - const char* id, - const char* value); - static void free_string(const KODI_ADDON_BACKEND_HDL hdl, char* str); - static void free_string_array(const KODI_ADDON_BACKEND_HDL hdl, char** arr, int numElements); - static void* get_interface(const KODI_ADDON_BACKEND_HDL hdl, - 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 0efcc07f3f091..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).release(); -} - -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 3700931049f51..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 specified 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 80dee33016cdf..0000000000000 --- a/xbmc/addons/interfaces/Filesystem.cpp +++ /dev/null @@ -1,1179 +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 pointer given", __func__); - 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->lowrate = data.lowrate; - return true; - } - return false; -} - -bool Interface_Filesystem::io_control_set_cache_rate(void* kodiBase, void* file, uint32_t 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 55e90ce95febd..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, uint32_t 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 418463463fbec..0000000000000 --- a/xbmc/addons/interfaces/General.cpp +++ /dev/null @@ -1,464 +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 "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/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->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_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::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_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::CHOICE_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 (!CServiceBroker::GetKeyboardLayoutManager()->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 = CServiceBroker::GetKeyboardLayoutManager()->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 6dde35618b72e..0000000000000 --- a/xbmc/addons/interfaces/General.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 - -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* 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_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 8070969391169..0000000000000 --- a/xbmc/addons/interfaces/gui/General.cpp +++ /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. - */ - -#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" - -#include - -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; - } - - std::unique_lock 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; - } - - std::unique_lock 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 8617d8d469866..0000000000000 --- a/xbmc/addons/interfaces/gui/Window.cpp +++ /dev/null @@ -1,1496 +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" - -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(); - CServiceBroker::GetAppMessenger()->SendMsg(TMSG_GUI_ADDON_DIALOG, 0, show ? 1 : 0, - static_cast(this)); - CServiceBroker::GetWinSystem()->GetGfxContext().restore(count); - } - else - CServiceBroker::GetAppMessenger()->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 89dea580ddede..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::CHOICE_CANCELLED); - return (result == DialogResponse::CHOICE_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::CHOICE_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::CHOICE_CANCELLED); - return (result == DialogResponse::CHOICE_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 3203075309c45..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().GetSDKVersion(); -} - -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 0256029dbb3ee..ae448b83ec11a 100644 --- a/xbmc/addons/kodi-dev-kit/.gitignore +++ b/xbmc/addons/kodi-dev-kit/.gitignore @@ -34,3 +34,4 @@ /include/groups.dox /tools/code-generator/creation_log.txt /tools/code-generator/creation_log.txt.old +/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..03cb85673c2ad --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/cmake/Macros.cmake @@ -0,0 +1,25 @@ +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() + +# +# Removes the specified compile flag from the specified target. +# _target - The target to remove the compile flag from +# _flag - The compile flag to remove +# +# Pre: apply_global_cxx_flags_to_all_targets() must be invoked. +# +macro(remove_flag_from_target _target _flag) + get_target_property(_target_cxx_flags ${_target} COMPILE_OPTIONS) + if(_target_cxx_flags) + list(REMOVE_ITEM _target_cxx_flags ${_flag}) + set_target_properties(${_target} PROPERTIES COMPILE_OPTIONS "${_target_cxx_flags}") + endif() +endmacro() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/AddonBase.h b/xbmc/addons/kodi-dev-kit/include/kodi/AddonBase.h index a626122042f0b..ac6c61cb06339 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,26 +9,26 @@ #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 { +using AddonLog = ADDON_LOG; + +class dl; + namespace gui { struct IRenderHelper; @@ -65,16 +65,6 @@ using HardwareContext = ADDON_HARDWARE_CONTEXT; namespace addon { -/*! - * @brief Internal used structure to have stored C API data above and - * available for everything below. - */ -struct ATTR_DLL_LOCAL CPrivateBase -{ - // Interface function table to hold addresses on add-on and from kodi - static AddonGlobalInterface* m_interface; -}; - /* * Internally used helper class to manage processing of a "C" structure in "CPP" * class. @@ -289,12 +279,9 @@ class ATTR_DLL_LOCAL CSettingValue return static_cast(GetInt()); } - ///@} - private: const std::string str; }; -///@} //------------------------------------------------------------------------------ //============================================================================== @@ -307,8 +294,6 @@ class ATTR_DLL_LOCAL CSettingValue class ATTR_DLL_LOCAL IInstanceInfo { public: - explicit IInstanceInfo(KODI_ADDON_INSTANCE_STRUCT* instance) : m_instance(instance) {} - /// @defgroup cpp_kodi_addon_addonbase_Defs_IInstanceInfo_Help Value Help /// @ingroup cpp_kodi_addon_addonbase_Defs_IInstanceInfo /// @@ -326,41 +311,132 @@ class ATTR_DLL_LOCAL IInstanceInfo ///@{ /// @brief To get settings value as string. - KODI_ADDON_INSTANCE_TYPE GetType() const { return m_instance->info->type; } + KODI_ADDON_INSTANCE_TYPE GetType() const { return m_type; } /// @brief Check asked type used on this class. /// /// @param[in] type Type identifier to check /// @return True if type matches - bool IsType(KODI_ADDON_INSTANCE_TYPE type) const { return m_instance->info->type == type; } + bool IsType(KODI_ADDON_INSTANCE_TYPE type) const { return m_type == type; } /// @brief Get optional identification number (usage relate to addon type). - uint32_t GetNumber() const { return m_instance->info->number; } + uint32_t GetInstanceID() const { return m_instance_id; } /// @brief Get optional identification string (usage relate to addon type). - std::string GetID() const { return m_instance->info->id; } + std::string GetUniqueWorkID() const { return m_unique_work_id; } - /// @brief Get API version from Kodi about instance. - std::string GetAPIVersion() const { return m_instance->info->version; } - - /// @brief Check this is first created instance by Kodi. - bool FirstInstance() const { return m_instance->info->first_instance; } + KODI_ADDON_INSTANCE_BACKEND_HDL GetKodiHdl() const { return m_kodi; } + KODI_ADDON_INSTANCE_HDL GetParentHdl() const { return m_parent; } ///@} - operator KODI_ADDON_INSTANCE_STRUCT*() { return m_instance; } +private: + friend class CAddonBase; + friend class IAddonInstance; + friend class kodi::dl; - operator KODI_ADDON_INSTANCE_STRUCT*() const { return m_instance; } + IInstanceInfo() = default; + explicit IInstanceInfo(const KODI_ADDON_INSTANCE_INFO* instance) + { + *this = instance; + } -private: - IInstanceInfo() = delete; - IInstanceInfo(const IInstanceInfo&) = delete; + const IInstanceInfo& operator=(const KODI_ADDON_INSTANCE_INFO* right) + { + assert(right); + + m_type = right->type; + m_instance_id = right->instance_id; + m_unique_work_id = right->unique_work_id; + m_kodi = right->kodi; + m_parent = right->parent; + + return *this; + } - KODI_ADDON_INSTANCE_STRUCT* m_instance; + KODI_ADDON_INSTANCE_TYPE m_type{ADDON_INSTANCE_UNKNOWN}; + uint32_t m_instance_id{0}; + std::string m_unique_work_id; + KODI_ADDON_INSTANCE_BACKEND_HDL m_kodi{nullptr}; + KODI_ADDON_INSTANCE_HDL m_parent{nullptr}; }; ///@} //------------------------------------------------------------------------------ +class IAddonInstance; +class CAddonBase; + +} /* namespace addon */ + +class ATTR_DLL_LOCAL dl +{ +public: + static inline std::string get_kodi_lib_path(int argc, char* argv[]) + { + std::string main_shared; + + for (int i = 1; i < argc; ++i) + { + if (argv[i] == nullptr) + break; + + 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; + } + } + } + + return main_shared; + } + + static inline bool LoadDll(int argc, char** argv) + { + const std::string libPath = get_kodi_lib_path(argc, argv); + local.dll = dlopen(libPath.c_str(), RTLD_LAZY | RTLD_GLOBAL); + if (local.dll == nullptr) + return false; + + bool (*load_kodi_api_1)(struct kodi_api_1*) = + reinterpret_cast(dlsym(local.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(local.dll); + return false; + } + + return true; + } + + static inline void UnloadDll() { dlclose(local.dll); } + + static kodi_api_1 api; + static KODI_IFC_HDL hdl; + + struct LOCAL + { + KODI_DLL_HDL dll; + + kodi::addon::IAddonInstance* globalSingleInstance; + kodi::addon::IInstanceInfo firstKodiInstance; + kodi::addon::CAddonBase* addonBase; + } static local; +}; + +namespace addon +{ + //============================================================================== /* * Internal class to control various instance types with general parts defined @@ -374,14 +450,16 @@ class ATTR_DLL_LOCAL IInstanceInfo class ATTR_DLL_LOCAL IAddonInstance { public: - explicit IAddonInstance(const kodi::addon::IInstanceInfo& instance) : m_instance(instance) + IAddonInstance() + : m_instanceInfo(kodi::dl::local.firstKodiInstance), + m_kodi(kodi::dl::local.firstKodiInstance.GetKodiHdl()) + { + kodi::dl::local.globalSingleInstance = this; + } + + explicit IAddonInstance(const kodi::addon::IInstanceInfo& instance) + : m_instanceInfo(instance), m_kodi(instance.GetKodiHdl()) { - m_instance->functions->instance_setting_change_string = INSTANCE_instance_setting_change_string; - m_instance->functions->instance_setting_change_integer = - INSTANCE_instance_setting_change_integer; - m_instance->functions->instance_setting_change_boolean = - INSTANCE_instance_setting_change_boolean; - m_instance->functions->instance_setting_change_float = INSTANCE_instance_setting_change_float; } virtual ~IAddonInstance() = default; @@ -391,7 +469,7 @@ class ATTR_DLL_LOCAL IAddonInstance return ADDON_STATUS_NOT_IMPLEMENTED; } - std::string GetInstanceAPIVersion() const { return m_instance->info->version; } + virtual void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) = 0; virtual ADDON_STATUS SetInstanceSetting(const std::string& settingName, const kodi::addon::CSettingValue& settingValue) @@ -401,19 +479,18 @@ class ATTR_DLL_LOCAL IAddonInstance inline bool IsInstanceSettingUsingDefault(const std::string& settingName) { - return m_instance->info->functions->is_instance_setting_using_default(m_instance->info->kodi, - settingName.c_str()); + return kodi::dl::api.kodi_addon_instance_is_setting_using_default(m_kodi, settingName.c_str()); } inline std::string GetInstanceUserPath(const std::string& append = "") { - using namespace kodi::addon; + char* str = kodi::dl::api.kodi_addon_instance_get_user_path(m_kodi); + if (!str) + return ""; - char* str = m_instance->info->functions->get_instance_user_path( - CPrivateBase::m_interface->toKodi->kodiBase); std::string ret = str; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - str); + free(str); + if (!append.empty()) { if (append.at(0) != '\\' && append.at(0) != '/') @@ -430,8 +507,7 @@ class ATTR_DLL_LOCAL IAddonInstance inline bool CheckInstanceSettingString(const std::string& settingName, std::string& settingValue) { char* buffer = nullptr; - bool ret = m_instance->info->functions->get_instance_setting_string( - m_instance->info->kodi, settingName.c_str(), &buffer); + bool ret = kodi::dl::api.kodi_addon_instance_get_setting_string(m_kodi, settingName.c_str(), &buffer); if (buffer) { if (ret) @@ -452,14 +528,13 @@ class ATTR_DLL_LOCAL IAddonInstance inline void SetInstanceSettingString(const std::string& settingName, const std::string& settingValue) { - m_instance->info->functions->set_instance_setting_string( - m_instance->info->kodi, settingName.c_str(), settingValue.c_str()); + kodi::dl::api.kodi_addon_instance_set_setting_string(m_kodi, settingName.c_str(), + settingValue.c_str()); } inline bool CheckInstanceSettingInt(const std::string& settingName, int& settingValue) { - KODI_ADDON_INSTANCE_FUNC_CB* cb = m_instance->info->functions; - return cb->get_instance_setting_int(m_instance->info->kodi, settingName.c_str(), &settingValue); + return kodi::dl::api.kodi_addon_instance_get_setting_int(m_kodi, settingName.c_str(), &settingValue); } inline int GetInstanceSettingInt(const std::string& settingName, int defaultValue = 0) @@ -471,14 +546,12 @@ class ATTR_DLL_LOCAL IAddonInstance inline void SetInstanceSettingInt(const std::string& settingName, int settingValue) { - m_instance->info->functions->set_instance_setting_int(m_instance->info->kodi, - settingName.c_str(), settingValue); + kodi::dl::api.kodi_addon_instance_set_setting_int(m_kodi, settingName.c_str(), settingValue); } inline bool CheckInstanceSettingBoolean(const std::string& settingName, bool& settingValue) { - return m_instance->info->functions->get_instance_setting_bool( - m_instance->info->kodi, settingName.c_str(), &settingValue); + return kodi::dl::api.kodi_addon_instance_get_setting_bool(m_kodi, settingName.c_str(), &settingValue); } inline bool GetInstanceSettingBoolean(const std::string& settingName, bool defaultValue = false) @@ -490,27 +563,24 @@ class ATTR_DLL_LOCAL IAddonInstance inline void SetInstanceSettingBoolean(const std::string& settingName, bool settingValue) { - m_instance->info->functions->set_instance_setting_bool(m_instance->info->kodi, - settingName.c_str(), settingValue); + kodi::dl::api.kodi_addon_instance_set_setting_bool(m_kodi, settingName.c_str(), settingValue); } - inline bool CheckInstanceSettingFloat(const std::string& settingName, float& settingValue) + inline bool CheckInstanceSettingFloat(const std::string& settingName, double& settingValue) { - return m_instance->info->functions->get_instance_setting_float( - m_instance->info->kodi, settingName.c_str(), &settingValue); + return kodi::dl::api.kodi_addon_instance_get_setting_float(m_kodi, settingName.c_str(), &settingValue); } - inline float GetInstanceSettingFloat(const std::string& settingName, float defaultValue = 0.0f) + inline double GetInstanceSettingFloat(const std::string& settingName, double defaultValue = 0.0) { - float settingValue = defaultValue; + double settingValue = defaultValue; CheckInstanceSettingFloat(settingName, settingValue); return settingValue; } - inline void SetInstanceSettingFloat(const std::string& settingName, float settingValue) + inline void SetInstanceSettingFloat(const std::string& settingName, double settingValue) { - m_instance->info->functions->set_instance_setting_float(m_instance->info->kodi, - settingName.c_str(), settingValue); + kodi::dl::api.kodi_addon_instance_set_setting_float(m_kodi, settingName.c_str(), settingValue); } template @@ -519,8 +589,8 @@ class ATTR_DLL_LOCAL IAddonInstance using namespace kodi::addon; int settingValueInt = static_cast(settingValue); - bool ret = m_instance->info->functions->get_instance_setting_int( - m_instance->info->kodi, settingName.c_str(), &settingValueInt); + bool ret = + kodi::dl::api.kodi_addon_instance_get_setting_int(m_kodi, settingName.c_str(), &settingValueInt); if (ret) settingValue = static_cast(settingValueInt); return ret; @@ -538,41 +608,58 @@ class ATTR_DLL_LOCAL IAddonInstance template inline void SetInstanceSettingEnum(const std::string& settingName, enumType settingValue) { - m_instance->info->functions->set_instance_setting_int( - m_instance->info->kodi, settingName.c_str(), static_cast(settingValue)); + kodi::dl::api.kodi_addon_instance_set_setting_int(m_kodi, settingName.c_str(), + static_cast(settingValue)); } + const kodi::addon::IInstanceInfo& GetInfo() const { return m_instanceInfo; } + KODI_ADDON_INSTANCE_BACKEND_HDL GetBackendInstanceHdl() const { return m_kodi; } + +protected: + kodi::addon::IInstanceInfo m_instanceInfo; + KODI_ADDON_INSTANCE_BACKEND_HDL m_kodi; + private: + friend class CAddonBase; + static inline ADDON_STATUS INSTANCE_instance_setting_change_string( - const KODI_ADDON_INSTANCE_HDL hdl, const char* name, const char* value) + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + const char* value) { return static_cast(hdl)->SetInstanceSetting(name, CSettingValue(value)); } static inline ADDON_STATUS INSTANCE_instance_setting_change_boolean( - const KODI_ADDON_INSTANCE_HDL hdl, const char* name, bool value) + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + bool value) { return static_cast(hdl)->SetInstanceSetting(name, CSettingValue(value ? "1" : "0")); } static inline ADDON_STATUS INSTANCE_instance_setting_change_integer( - const KODI_ADDON_INSTANCE_HDL hdl, const char* name, int value) + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + int value) { return static_cast(hdl)->SetInstanceSetting( name, CSettingValue(std::to_string(value))); } static inline ADDON_STATUS INSTANCE_instance_setting_change_float( - const KODI_ADDON_INSTANCE_HDL hdl, const char* name, float value) + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + double value) { return static_cast(hdl)->SetInstanceSetting( name, CSettingValue(std::to_string(value))); } - - friend class CAddonBase; - - const KODI_ADDON_INSTANCE_STRUCT* m_instance; }; //============================================================================ @@ -588,17 +675,7 @@ class ATTR_DLL_LOCAL CAddonBase /// @ingroup cpp_kodi_addon_addonbase /// @brief Addon base class constructor. /// - CAddonBase() - { - CPrivateBase::m_interface->toAddon->create = nullptr; - CPrivateBase::m_interface->toAddon->destroy = ADDONBASE_Destroy; - CPrivateBase::m_interface->toAddon->create_instance = ADDONBASE_CreateInstance; - CPrivateBase::m_interface->toAddon->destroy_instance = ADDONBASE_DestroyInstance; - CPrivateBase::m_interface->toAddon->setting_change_string = ADDONBASE_setting_change_string; - CPrivateBase::m_interface->toAddon->setting_change_boolean = ADDONBASE_setting_change_boolean; - CPrivateBase::m_interface->toAddon->setting_change_integer = ADDONBASE_setting_change_integer; - CPrivateBase::m_interface->toAddon->setting_change_float = ADDONBASE_setting_change_float; - } + CAddonBase() = default; //---------------------------------------------------------------------------- //============================================================================ @@ -757,34 +834,69 @@ class ATTR_DLL_LOCAL CAddonBase /* Background helper for GUI render systems, e.g. Screensaver or Visualization */ std::shared_ptr m_renderHelper; + static KODI_ADDON_FUNC GetAddonFunctions() + { + KODI_ADDON_FUNC func = {ADDONBASE_create, + ADDONBASE_destroy, + + ADDONBASE_setting_change_string, + ADDONBASE_setting_change_boolean, + ADDONBASE_setting_change_integer, + ADDONBASE_setting_change_float, + + ADDONBASE_create_instance, + ADDONBASE_destroy_instance, + + IAddonInstance::INSTANCE_instance_setting_change_string, + IAddonInstance::INSTANCE_instance_setting_change_boolean, + IAddonInstance::INSTANCE_instance_setting_change_integer, + IAddonInstance::INSTANCE_instance_setting_change_float}; + return func; + } + private: - static inline void ADDONBASE_Destroy(const KODI_ADDON_HDL hdl) + static ADDON_STATUS ADDONBASE_create(const struct KODI_ADDON_INSTANCE_INFO* first_instance, KODI_ADDON_HDL* hdl); + + static inline void ADDONBASE_destroy(const KODI_ADDON_HDL hdl) { delete static_cast(hdl); + kodi::dl::local.globalSingleInstance = nullptr; + kodi::dl::local.addonBase = nullptr; } - static inline ADDON_STATUS ADDONBASE_CreateInstance(const KODI_ADDON_HDL hdl, - struct KODI_ADDON_INSTANCE_STRUCT* instance) + static inline ADDON_STATUS ADDONBASE_create_instance(const KODI_ADDON_HDL hdl, + const struct KODI_ADDON_INSTANCE_INFO* info, + struct KODI_ADDON_INSTANCE_STRUCT* instance) { + ADDON_STATUS status = ADDON_STATUS_NOT_IMPLEMENTED; + CAddonBase* base = static_cast(hdl); + if (base == nullptr || info == nullptr || instance == nullptr) + { + kodi::dl::api.kodi_log( + ADDON_LOG_FATAL, + "kodi::addon::CAddonBase CreateInstance called with empty instance memory"); + return ADDON_STATUS_PERMANENT_FAILURE; + } - ADDON_STATUS status = ADDON_STATUS_NOT_IMPLEMENTED; + IAddonInstance* instanceHdl = nullptr; /* 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 (CPrivateBase::m_interface->firstKodiInstance == instance && - CPrivateBase::m_interface->globalSingleInstance && - static_cast(CPrivateBase::m_interface->globalSingleInstance) - ->m_instance->info->type == instance->info->type) + if (kodi::dl::local.globalSingleInstance && + kodi::dl::local.globalSingleInstance->GetInfo().GetType() == info->type && + kodi::dl::local.globalSingleInstance->GetInfo().GetKodiHdl() == info->kodi) { /* 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. */ - instance->hdl = CPrivateBase::m_interface->globalSingleInstance; status = ADDON_STATUS_OK; + + instanceHdl = kodi::dl::local.globalSingleInstance; + instance->hdl = instanceHdl; } else { @@ -792,28 +904,40 @@ class ATTR_DLL_LOCAL CAddonBase * creation of several on one addon. */ - IInstanceInfo instanceInfo(instance); + IInstanceInfo instanceInfo(info); /* Check first a parent is defined about (e.g. Codec within inputstream) */ - if (instance->info->parent != nullptr) - status = static_cast(instance->info->parent) - ->CreateInstance(instanceInfo, instance->hdl); + if (info->parent != nullptr) + status = + static_cast(info->parent)->CreateInstance(instanceInfo, instance->hdl); /* if no parent call the main instance creation function to get it */ if (status == ADDON_STATUS_NOT_IMPLEMENTED) { + if (kodi::dl::local.globalSingleInstance != nullptr) + { + kodi::dl::api.kodi_log(ADDON_LOG_FATAL, + "kodi::addon::CAddonBase Creation of multiple together with " + "single instance way is not allowed!"); + return ADDON_STATUS_PERMANENT_FAILURE; + } status = base->CreateInstance(instanceInfo, instance->hdl); } + + instanceHdl = static_cast(instance->hdl); } - if (instance->hdl == nullptr) + if (instanceHdl != nullptr) + { + instanceHdl->SetAddonStruct(instance); + } + else { if (status == ADDON_STATUS_OK) { - CPrivateBase::m_interface->toKodi->addon_log_msg( - CPrivateBase::m_interface->toKodi->kodiBase, ADDON_LOG_FATAL, - "kodi::addon::CAddonBase CreateInstance returned an " - "empty instance pointer, but reported OK!"); + 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; } else @@ -822,10 +946,10 @@ class ATTR_DLL_LOCAL CAddonBase } } - if (static_cast(instance->hdl)->m_instance->info->type != instance->info->type) + if (instanceHdl->GetInfo().GetType() != info->type) { - CPrivateBase::m_interface->toKodi->addon_log_msg( - CPrivateBase::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(instance->hdl); instance->hdl = nullptr; @@ -835,16 +959,17 @@ class ATTR_DLL_LOCAL CAddonBase return status; } - static inline void ADDONBASE_DestroyInstance(const KODI_ADDON_HDL hdl, - struct KODI_ADDON_INSTANCE_STRUCT* instance) + static inline void ADDONBASE_destroy_instance(const KODI_ADDON_HDL hdl, + const struct KODI_ADDON_INSTANCE_INFO* info, + const KODI_ADDON_INSTANCE_HDL instance_hdl) { CAddonBase* base = static_cast(hdl); - if (CPrivateBase::m_interface->globalSingleInstance == nullptr && instance->hdl != base) + if (kodi::dl::local.globalSingleInstance == nullptr && instance_hdl != base) { - IInstanceInfo instanceInfo(instance); - base->DestroyInstance(instanceInfo, instance->hdl); - delete static_cast(instance->hdl); + IInstanceInfo instanceInfo(info); + base->DestroyInstance(instanceInfo, instance_hdl); + delete static_cast(instance_hdl); } } @@ -871,7 +996,7 @@ class ATTR_DLL_LOCAL CAddonBase static inline ADDON_STATUS ADDONBASE_setting_change_float(const KODI_ADDON_HDL hdl, const char* name, - float value) + double value) { return static_cast(hdl)->SetSetting(name, CSettingValue(std::to_string(value))); } @@ -886,12 +1011,9 @@ class ATTR_DLL_LOCAL CAddonBase /// inline std::string ATTR_DLL_LOCAL GetAddonPath(const std::string& append = "") { - using namespace kodi::addon; - - char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_addon_path( - CPrivateBase::m_interface->toKodi->kodiBase); + char* str = kodi::dl::api.kodi_addon_get_addon_path(); std::string ret = str; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str); + free(str); if (!append.empty()) { if (append.at(0) != '\\' && append.at(0) != '/') @@ -923,12 +1045,9 @@ inline std::string ATTR_DLL_LOCAL GetAddonPath(const std::string& append = "") /// inline std::string ATTR_DLL_LOCAL GetLibPath(const std::string& append = "") { - using namespace kodi::addon; - - char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_lib_path( - CPrivateBase::m_interface->toKodi->kodiBase); + char* str = kodi_addon_get_lib_path(); std::string ret = str; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str); + free(str); if (!append.empty()) { if (append.at(0) != '\\' && append.at(0) != '/') @@ -955,12 +1074,9 @@ inline std::string ATTR_DLL_LOCAL GetLibPath(const std::string& append = "") /// inline std::string ATTR_DLL_LOCAL GetUserPath(const std::string& append = "") { - using namespace kodi::addon; - - char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_user_path( - CPrivateBase::m_interface->toKodi->kodiBase); + char* str = kodi::dl::api.kodi_addon_get_user_path(); std::string ret = str; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str); + free(str); if (!append.empty()) { if (append.at(0) != '\\' && append.at(0) != '/') @@ -988,12 +1104,9 @@ inline std::string ATTR_DLL_LOCAL GetUserPath(const std::string& append = "") /// inline std::string ATTR_DLL_LOCAL GetTempPath(const std::string& append = "") { - using namespace kodi::addon; - - char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_temp_path( - CPrivateBase::m_interface->toKodi->kodiBase); + char* str = kodi::dl::api.kodi_addon_get_temp_path(); std::string ret = str; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str); + free(str); if (!append.empty()) { if (append.at(0) != '\\' && append.at(0) != '/') @@ -1038,23 +1151,18 @@ inline std::string ATTR_DLL_LOCAL GetTempPath(const std::string& append = "") inline std::string ATTR_DLL_LOCAL GetLocalizedString(uint32_t labelId, const std::string& defaultStr = "") { - using namespace kodi::addon; - std::string retString = defaultStr; - char* strMsg = CPrivateBase::m_interface->toKodi->kodi_addon->get_localized_string( - CPrivateBase::m_interface->toKodi->kodiBase, labelId); + char* strMsg = kodi::dl::api.kodi_get_localized_string(labelId); if (strMsg != nullptr) { if (std::strlen(strMsg)) retString = strMsg; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - strMsg); + free(strMsg); } return retString; } //------------------------------------------------------------------------------ - //############################################################################## /// @ingroup cpp_kodi_addon /// @defgroup cpp_kodi_settings 1. Setting control @@ -1087,9 +1195,7 @@ inline std::string ATTR_DLL_LOCAL GetLocalizedString(uint32_t labelId, /// inline bool ATTR_DLL_LOCAL OpenSettings() { - using namespace kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_addon->open_settings_dialog( - CPrivateBase::m_interface->toKodi->kodiBase); + return kodi::dl::api.kodi_addon_open_settings_dialog(); } //------------------------------------------------------------------------------ @@ -1103,9 +1209,7 @@ inline bool ATTR_DLL_LOCAL OpenSettings() /// inline bool ATTR_DLL_LOCAL IsSettingUsingDefault(const std::string& settingName) { - using namespace kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_addon->is_setting_using_default( - CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str()); + return kodi::dl::api.kodi_addon_is_setting_using_default(settingName.c_str()); } //------------------------------------------------------------------------------ @@ -1135,17 +1239,13 @@ inline bool ATTR_DLL_LOCAL IsSettingUsingDefault(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 = CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_string( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - buffer); + free(buffer); } return ret; } @@ -1201,10 +1301,7 @@ inline std::string ATTR_DLL_LOCAL GetSettingString(const std::string& settingNam inline void ATTR_DLL_LOCAL SetSettingString(const std::string& settingName, const std::string& settingValue) { - using namespace kodi::addon; - - CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_string( - CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue.c_str()); + kodi::dl::api.kodi_addon_set_setting_string(settingName.c_str(), settingValue.c_str()); } //------------------------------------------------------------------------------ @@ -1233,10 +1330,7 @@ inline void ATTR_DLL_LOCAL SetSettingString(const std::string& settingName, /// inline bool ATTR_DLL_LOCAL CheckSettingInt(const std::string& settingName, int& settingValue) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_int( - CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue); + return kodi::dl::api.kodi_addon_get_setting_int(settingName.c_str(), &settingValue); } //------------------------------------------------------------------------------ @@ -1288,10 +1382,7 @@ inline int ATTR_DLL_LOCAL GetSettingInt(const std::string& settingName, int defa /// inline void ATTR_DLL_LOCAL SetSettingInt(const std::string& settingName, int settingValue) { - using namespace kodi::addon; - - CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_int( - CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue); + kodi::dl::api.kodi_addon_set_setting_int(settingName.c_str(), settingValue); } //------------------------------------------------------------------------------ @@ -1320,10 +1411,7 @@ inline void ATTR_DLL_LOCAL SetSettingInt(const std::string& settingName, int set /// inline bool ATTR_DLL_LOCAL CheckSettingBoolean(const std::string& settingName, bool& settingValue) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_bool( - CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue); + return kodi::dl::api.kodi_addon_get_setting_bool(settingName.c_str(), &settingValue); } //------------------------------------------------------------------------------ @@ -1376,10 +1464,7 @@ inline bool ATTR_DLL_LOCAL GetSettingBoolean(const std::string& settingName, /// inline void ATTR_DLL_LOCAL SetSettingBoolean(const std::string& settingName, bool settingValue) { - using namespace kodi::addon; - - CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_bool( - CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue); + kodi::dl::api.kodi_addon_set_setting_bool(settingName.c_str(), settingValue); } //------------------------------------------------------------------------------ @@ -1406,12 +1491,9 @@ inline void ATTR_DLL_LOCAL SetSettingBoolean(const std::string& settingName, boo /// value = 1.0f; // My default of them /// ~~~~~~~~~~~~~ /// -inline bool ATTR_DLL_LOCAL CheckSettingFloat(const std::string& settingName, float& settingValue) +inline bool ATTR_DLL_LOCAL CheckSettingFloat(const std::string& settingName, double& settingValue) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_float( - CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), &settingValue); + return kodi::dl::api.kodi_addon_get_setting_float(settingName.c_str(), &settingValue); } //------------------------------------------------------------------------------ @@ -1431,13 +1513,13 @@ inline bool ATTR_DLL_LOCAL CheckSettingFloat(const std::string& settingName, flo /// ~~~~~~~~~~~~~{.cpp} /// #include /// -/// float value = kodi::GetSettingFloat("my_float_value"); +/// double value = kodi::GetSettingFloat("my_float_value"); /// ~~~~~~~~~~~~~ /// inline float ATTR_DLL_LOCAL GetSettingFloat(const std::string& settingName, - float defaultValue = 0.0f) + double defaultValue = 0.0f) { - float settingValue = defaultValue; + double settingValue = defaultValue; CheckSettingFloat(settingName, settingValue); return settingValue; } @@ -1458,16 +1540,13 @@ inline float ATTR_DLL_LOCAL GetSettingFloat(const std::string& settingName, /// ~~~~~~~~~~~~~{.cpp} /// #include /// -/// float value = 1.0f; +/// double value = 1.0f; /// kodi::SetSettingFloat("my_float_value", value); /// ~~~~~~~~~~~~~ /// -inline void ATTR_DLL_LOCAL SetSettingFloat(const std::string& settingName, float settingValue) +inline void ATTR_DLL_LOCAL SetSettingFloat(const std::string& settingName, double settingValue) { - using namespace kodi::addon; - - CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_float( - CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), settingValue); + kodi::dl::api.kodi_addon_set_setting_float(settingName.c_str(), settingValue); } //------------------------------------------------------------------------------ @@ -1505,11 +1584,8 @@ inline void ATTR_DLL_LOCAL SetSettingFloat(const std::string& settingName, float template inline bool ATTR_DLL_LOCAL CheckSettingEnum(const std::string& settingName, enumType& settingValue) { - using namespace kodi::addon; - int settingValueInt = static_cast(settingValue); - bool ret = CPrivateBase::m_interface->toKodi->kodi_addon->get_setting_int( - CPrivateBase::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; @@ -1585,11 +1661,7 @@ inline enumType ATTR_DLL_LOCAL GetSettingEnum(const std::string& settingName, template inline void ATTR_DLL_LOCAL SetSettingEnum(const std::string& settingName, enumType settingValue) { - using namespace kodi::addon; - - CPrivateBase::m_interface->toKodi->kodi_addon->set_setting_int( - CPrivateBase::m_interface->toKodi->kodiBase, settingName.c_str(), - static_cast(settingValue)); + kodi::dl::api.kodi_addon_set_setting_int(settingName.c_str(), static_cast(settingValue)); } //------------------------------------------------------------------------------ @@ -1623,72 +1695,18 @@ inline void ATTR_DLL_LOCAL SetSettingEnum(const std::string& settingName, enumTy /// inline std::string ATTR_DLL_LOCAL GetAddonInfo(const std::string& id) { - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::m_interface->toKodi; - std::string strReturn; - char* strMsg = toKodi->kodi_addon->get_addon_info(toKodi->kodiBase, id.c_str()); + char* strMsg = kodi::dl::api.kodi_addon_get_info(id.c_str()); if (strMsg != nullptr) { if (std::strlen(strMsg)) strReturn = strMsg; - toKodi->free_string(toKodi->kodiBase, strMsg); + free(strMsg); } return strReturn; } //------------------------------------------------------------------------------ -//============================================================================== -/// @ingroup cpp_kodi_addon -/// @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) -{ - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::m_interface->toKodi; - - return toKodi->kodi_addon->get_interface(toKodi->kodiBase, name.c_str(), version.c_str()); -} -//---------------------------------------------------------------------------- - -//============================================================================== -/// @ingroup cpp_kodi_addon -/// @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 ATTR_DLL_LOCAL GetKodiTypeVersion(int type) -{ - using namespace kodi::addon; - - char* str = CPrivateBase::m_interface->toKodi->kodi_addon->get_type_version( - CPrivateBase::m_interface->toKodi->kodiBase, type); - std::string ret = str; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, str); - return ret; -} -//------------------------------------------------------------------------------ - //============================================================================ /// @ingroup cpp_kodi_addon /// @brief Get to related @ref ADDON_STATUS a human readable text. @@ -1731,7 +1749,6 @@ inline std::string ATTR_DLL_LOCAL TranslateAddonStatus(ADDON_STATUS status) /// @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. /// @@ -1746,19 +1763,38 @@ inline std::string ATTR_DLL_LOCAL TranslateAddonStatus(ADDON_STATUS status) /// /// ~~~~~~~~~~~~~ /// -inline void ATTR_DLL_LOCAL Log(const ADDON_LOG loglevel, const char* format, ...) +#ifndef SWIG +template +inline void ATTR_DLL_LOCAL Log(const AddonLog loglevel, const std::string& fmt, Args&&... args) { - using namespace kodi::addon; - - va_list args; - va_start(args, format); - const std::string str = kodi::tools::StringUtils::FormatV(format, args); - va_end(args); - CPrivateBase::m_interface->toKodi->addon_log_msg(CPrivateBase::m_interface->toKodi->kodiBase, - loglevel, str.c_str()); + kodi::dl::api.kodi_log(loglevel, fmt.c_str(), args...); } +#endif //------------------------------------------------------------------------------ +#ifndef SWIG +inline bool ATTR_DLL_LOCAL Init( + unsigned int api, int argc, char* argv[], KODI_ADDON_FUNC* func, bool via_main, bool no_receive) +{ + 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; +} +#endif + +inline void ATTR_DLL_LOCAL Deinit() +{ + kodi::dl::api.kodi_deinit(kodi::dl::hdl); + kodi::dl::UnloadDll(); +} + } /* namespace kodi */ //============================================================================== @@ -1855,23 +1891,46 @@ inline void ATTR_DLL_LOCAL Log(const ADDON_LOG loglevel, const char* format, ... /// } /// \table_end /// + +#define KODI_STARTER \ + kodi_api_1 kodi::dl::api{0}; \ + KODI_IFC_HDL kodi::dl::hdl{nullptr}; \ + kodi::dl::LOCAL kodi::dl::local{}; #define ADDONCREATOR(AddonClass) \ - extern "C" ATTR_DLL_EXPORT ADDON_STATUS ADDON_Create(KODI_HANDLE addonInterface) \ + KODI_STARTER \ + ADDON_STATUS kodi::addon::CAddonBase::ADDONBASE_create(const struct KODI_ADDON_INSTANCE_INFO* first_instance, KODI_ADDON_HDL* hdl) \ { \ - using namespace kodi::addon; \ - CPrivateBase::m_interface = static_cast(addonInterface); \ - CPrivateBase::m_interface->addonBase = new AddonClass; \ - return static_cast(CPrivateBase::m_interface->addonBase)->Create(); \ + using namespace ::kodi::addon; \ + kodi::dl::local.firstKodiInstance = first_instance; \ + kodi::dl::local.addonBase = new AddonClass; \ + *hdl = kodi::dl::local.addonBase; \ + return kodi::dl::local.addonBase->Create(); \ } \ - extern "C" ATTR_DLL_EXPORT const char* ADDON_GetTypeVersion(int type) \ + extern "C" ATTR_DLL_EXPORT int main(int argc, char** argv) \ { \ - return kodi::addon::GetTypeVersion(type); \ + using namespace ::kodi::addon; \ + fprintf(stderr, "TEMP DEBUG: Addon main started, PID %i\n", getpid()); \ + /*sleep(10);*/ \ + KODI_ADDON_FUNC func = CAddonBase::GetAddonFunctions(); \ + 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; \ } \ - extern "C" ATTR_DLL_EXPORT const char* ADDON_GetTypeMinVersion(int type) \ + extern "C" ATTR_DLL_EXPORT int non_blocking_main_start(int argc, char** argv) \ { \ - return kodi::addon::GetTypeMinVersion(type); \ + using namespace ::kodi::addon; \ + KODI_ADDON_FUNC func = CAddonBase::GetAddonFunctions(); \ + return kodi::Init(__KODI_API__, argc, argv, &func, true, false) ? 0 : -1; \ } \ - AddonGlobalInterface* kodi::addon::CPrivateBase::m_interface = nullptr; -//------------------------------------------------------------------------------ + extern "C" ATTR_DLL_EXPORT void non_blocking_main_stop() { kodi::Deinit(); } #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 2afe351e69ba3..10d96ed5fd4ef 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,10 +9,13 @@ #pragma once #include "AddonBase.h" +#include "General.h" #include "c-api/audio_engine.h" #ifdef __cplusplus +#include + namespace kodi { namespace audioengine @@ -100,107 +103,65 @@ namespace audioengine /// ///@{ class ATTR_DLL_LOCAL AudioEngineFormat - : public addon::CStructHdl + : 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; } + AudioEngineFormat(const AUDIO_ENGINE_FMT* channel) : CStructHdl(channel) {} + AudioEngineFormat(AUDIO_ENGINE_FMT* channel) : CStructHdl(channel) {} - /// @brief To get with @ref SetDataFormat changed values. - enum AudioEngineDataFormat GetDataFormat() const { return m_cStructure->m_dataFormat; } + void SetDataFormat(AudioEngineDataFormat format) { m_cStructure->data_format = format; } + AudioEngineDataFormat GetDataFormat() const { return m_cStructure->data_format; } - /// @brief The stream's sample rate (eg, 48000) - void SetSampleRate(unsigned int rate) { m_cStructure->m_sampleRate = rate; } + void SetSampleRate(unsigned int rate) { m_cStructure->sample_rate = rate; } + unsigned int GetSampleRate() const { return m_cStructure->sample_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) + 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 +169,18 @@ class ATTR_DLL_LOCAL 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,7 +188,6 @@ class ATTR_DLL_LOCAL AudioEngineFormat return true; } - ///@} }; ///@} //---------------------------------------------------------------------------- @@ -302,53 +261,35 @@ class ATTR_DLL_LOCAL CAEStream /// /// ~~~~~~~~~~~~~ /// - CAEStream(AudioEngineFormat& format, unsigned int options = 0) - : m_kodiBase(::kodi::addon::CPrivateBase::m_interface->toKodi->kodiBase), - m_cb(::kodi::addon::CPrivateBase::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); } - //-------------------------------------------------------------------------- + unsigned int GetSpace() + { + return kodi::dl::api.kodi_audioengine_stream_get_space(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 AddData(uint8_t* const* data, unsigned int offset, unsigned int frames, @@ -356,222 +297,91 @@ class ATTR_DLL_LOCAL 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); } - //-------------------------------------------------------------------------- + double GetDelay() { return kodi::dl::api.kodi_audioengine_stream_get_delay(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); } - //-------------------------------------------------------------------------- + bool IsBuffering() { return kodi::dl::api.kodi_audioengine_stream_is_buffering(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); } - //-------------------------------------------------------------------------- + double GetCacheTime() + { + return kodi::dl::api.kodi_audioengine_stream_get_cache_time(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); } - //-------------------------------------------------------------------------- + double GetCacheTotal() + { + return kodi::dl::api.kodi_audioengine_stream_get_cache_total(m_streamHandle); + } - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Pauses the stream playback. - /// - void Pause() { return m_cb->aestream_pause(m_kodiBase, m_StreamHandle); } - //-------------------------------------------------------------------------- + void Pause() { return kodi::dl::api.kodi_audioengine_stream_pause(m_streamHandle); } - //========================================================================== - /// @ingroup cpp_kodi_audioengine_CAEStream - /// @brief Resumes the stream after pausing - /// - void Resume() { return m_cb->aestream_resume(m_kodiBase, m_StreamHandle); } - //-------------------------------------------------------------------------- + void Resume() { return kodi::dl::api.kodi_audioengine_stream_resume(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); } - //-------------------------------------------------------------------------- + void Drain(bool wait = true) + { + return kodi::dl::api.kodi_audioengine_stream_drain(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); } - //-------------------------------------------------------------------------- + bool IsDraining() { return kodi::dl::api.kodi_audioengine_stream_is_draining(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); } - //-------------------------------------------------------------------------- + bool IsDrained() { return kodi::dl::api.kodi_audioengine_stream_is_drained(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); } - //-------------------------------------------------------------------------- + void Flush() { return kodi::dl::api.kodi_audioengine_stream_flush(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); } - //-------------------------------------------------------------------------- + float GetVolume() { return kodi::dl::api.kodi_audioengine_stream_get_volume(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 - /// 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); } - //-------------------------------------------------------------------------- + float GetAmplification() + { + return kodi::dl::api.kodi_audioengine_stream_get_amplification(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 - /// 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); + return kodi::dl::api.kodi_audioengine_stream_get_data_format(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_resample_ratio(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()) - /// 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; }; //---------------------------------------------------------------------------- @@ -605,13 +415,13 @@ class ATTR_DLL_LOCAL CAEStream /// inline bool ATTR_DLL_LOCAL GetCurrentSinkFormat(AudioEngineFormat& format) { - using namespace kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_audioengine->get_current_sink_format( - CPrivateBase::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 5e396b945f170..12e49ce44cea8 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/CMakeLists.txt @@ -6,8 +6,8 @@ set(HEADERS AudioEngine.h Filesystem.h General.h + Monitor.h Network.h - versions.h ) if(HEADERS) diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/Filesystem.h b/xbmc/addons/kodi-dev-kit/include/kodi/Filesystem.h index 7cd35bd4f726a..3d1ee0b42e5e1 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/Filesystem.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/Filesystem.h @@ -92,14 +92,14 @@ namespace vfs /// Used on kodi::vfs::StatFile() to get detailed information about a file. /// ///@{ -class ATTR_DLL_LOCAL 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) {} + FileStatus(const VFS_STAT_STRUCTURE* channel) : CStructHdl(channel) {} + FileStatus(VFS_STAT_STRUCTURE* channel) : CStructHdl(channel) {} /*! \endcond */ /// @defgroup cpp_kodi_vfs_Defs_FileStatus_Help Value Help @@ -128,6 +128,8 @@ class ATTR_DLL_LOCAL FileStatus : public kodi::addon::CStructHdldeviceId = deviceId; } @@ -221,15 +223,13 @@ class ATTR_DLL_LOCAL FileStatus : 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) {} + CacheStatus(const VFS_CACHE_STATUS* channel) : CStructHdl(channel) {} + CacheStatus(VFS_CACHE_STATUS* channel) : CStructHdl(channel) {} /*! \endcond */ /// @defgroup cpp_kodi_vfs_Defs_CacheStatus_Help Value Help @@ -291,7 +291,7 @@ class ATTR_DLL_LOCAL CacheStatus /// @copydetails cpp_kodi_vfs_Defs_HttpHeader_Help /// ///@{ -class ATTR_DLL_LOCAL HttpHeader +class HttpHeader { public: //========================================================================== @@ -299,23 +299,13 @@ class ATTR_DLL_LOCAL HttpHeader /// HttpHeader() { - using namespace ::kodi::addon; - - CPrivateBase::m_interface->toKodi->kodi_filesystem->http_header_create( - CPrivateBase::m_interface->toKodi->kodiBase, &m_handle); } //-------------------------------------------------------------------------- //========================================================================== /// @brief Class destructor. /// - ~HttpHeader() - { - using namespace ::kodi::addon; - - CPrivateBase::m_interface->toKodi->kodi_filesystem->http_header_free( - CPrivateBase::m_interface->toKodi->kodiBase, &m_handle); - } + ~HttpHeader() { kodi::dl::api.kodi_vfs_http_header_close(m_handle); } //-------------------------------------------------------------------------- /// @defgroup cpp_kodi_vfs_Defs_HttpHeader_Help Value Help @@ -344,19 +334,15 @@ class ATTR_DLL_LOCAL HttpHeader /// 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(CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - string); + free(string); } return protoLine; } @@ -371,24 +357,22 @@ class ATTR_DLL_LOCAL HttpHeader /// 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(CPrivateBase::m_interface->toKodi->kodiBase, m_handle.handle, - param.c_str(), &numValues)); + 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]); } - CPrivateBase::m_interface->toKodi->free_string_array( - CPrivateBase::m_interface->toKodi->kodiBase, res, numValues); + free(res); + return vecReturn; } return std::vector(); @@ -404,17 +388,15 @@ class ATTR_DLL_LOCAL HttpHeader { using namespace ::kodi::addon; - if (!m_handle.handle) + if (!m_handle) return ""; std::string header; - char* string = - m_handle.get_header(CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - string); + free(string); } return header; } @@ -429,17 +411,15 @@ class ATTR_DLL_LOCAL HttpHeader { using namespace ::kodi::addon; - if (!m_handle.handle) + if (!m_handle) return ""; std::string protoLine; - char* string = - m_handle.get_mime_type(CPrivateBase::m_interface->toKodi->kodiBase, m_handle.handle); + char* string = kodi::dl::api.kodi_vfs_http_header_get_mime_type(m_handle); if (string != nullptr) { protoLine = string; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - string); + free(string); } return protoLine; } @@ -454,17 +434,15 @@ class ATTR_DLL_LOCAL HttpHeader { using namespace ::kodi::addon; - if (!m_handle.handle) + if (!m_handle) return ""; std::string protoLine; - char* string = - m_handle.get_charset(CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - string); + free(string); } return protoLine; } @@ -479,17 +457,15 @@ class ATTR_DLL_LOCAL HttpHeader { using namespace ::kodi::addon; - if (!m_handle.handle) + if (!m_handle) return ""; std::string protoLine; - char* string = - m_handle.get_proto_line(CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - string); + free(string); } return protoLine; } @@ -497,7 +473,7 @@ class ATTR_DLL_LOCAL HttpHeader ///@} - KODI_HTTP_HEADER m_handle; + KODI_HTTP_HEADER_HDL m_handle; }; ///@} //---------------------------------------------------------------------------- @@ -541,7 +517,7 @@ class ATTR_DLL_LOCAL HttpHeader /// to enjoy it. /// ///@{ -class ATTR_DLL_LOCAL CDirEntry +class CDirEntry { public: //============================================================================ @@ -573,7 +549,7 @@ class ATTR_DLL_LOCAL CDirEntry // // @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), @@ -581,6 +557,8 @@ class ATTR_DLL_LOCAL CDirEntry m_dateTime(dirEntry.date_time) { } + + //---------------------------------------------------------------------------- /// @defgroup cpp_kodi_vfs_CDirEntry_Help Value Help @@ -772,12 +750,9 @@ class ATTR_DLL_LOCAL CDirEntry /// ... /// ~~~~~~~~~~~~~ /// -inline bool ATTR_DLL_LOCAL CreateDirectory(const std::string& path) +inline bool CreateDirectory(const std::string& path) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_filesystem->create_directory( - CPrivateBase::m_interface->toKodi->kodiBase, path.c_str()); + return kodi::dl::api.kodi_vfs_create_directory(path.c_str()); } //------------------------------------------------------------------------------ @@ -804,12 +779,9 @@ inline bool ATTR_DLL_LOCAL CreateDirectory(const std::string& path) /// ... /// ~~~~~~~~~~~~~ /// -inline bool ATTR_DLL_LOCAL DirectoryExists(const std::string& path) +inline bool DirectoryExists(const std::string& path) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_filesystem->directory_exists( - CPrivateBase::m_interface->toKodi->kodiBase, path.c_str()); + return kodi::dl::api.kodi_vfs_directory_exists(path.c_str()); } //------------------------------------------------------------------------------ @@ -838,16 +810,12 @@ inline bool ATTR_DLL_LOCAL DirectoryExists(const std::string& path) /// ... /// ~~~~~~~~~~~~~ /// -inline bool ATTR_DLL_LOCAL RemoveDirectory(const std::string& path, bool recursive = false) +inline bool RemoveDirectory(const std::string& path, bool recursive = false) { - using namespace kodi::addon; - if (!recursive) - return CPrivateBase::m_interface->toKodi->kodi_filesystem->remove_directory( - CPrivateBase::m_interface->toKodi->kodiBase, path.c_str()); + return kodi::dl::api.kodi_vfs_remove_directory(path.c_str()); else - return CPrivateBase::m_interface->toKodi->kodi_filesystem->remove_directory_recursive( - CPrivateBase::m_interface->toKodi->kodiBase, path.c_str()); + return kodi::dl::api.kodi_vfs_remove_directory_recursive(path.c_str()); } //------------------------------------------------------------------------------ @@ -887,25 +855,20 @@ inline bool ATTR_DLL_LOCAL RemoveDirectory(const std::string& path, bool recursi /// items[i].Path().c_str()); /// } /// ~~~~~~~~~~~~~ -inline bool ATTR_DLL_LOCAL GetDirectory(const std::string& path, - const std::string& mask, - std::vector& items) +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 (CPrivateBase::m_interface->toKodi->kodi_filesystem->get_directory( - CPrivateBase::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]); - CPrivateBase::m_interface->toKodi->kodi_filesystem->free_directory( - CPrivateBase::m_interface->toKodi->kodiBase, dir_list, num_items); + kodi::dl::api.kodi_vfs_free_directory(dir_list, num_items); } return true; @@ -914,8 +877,6 @@ inline bool ATTR_DLL_LOCAL GetDirectory(const std::string& path, } //------------------------------------------------------------------------------ -//}}} - //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // "C++" File related functions //{{{ @@ -939,12 +900,9 @@ inline bool ATTR_DLL_LOCAL GetDirectory(const std::string& path, /// fprintf(stderr, "Log file should be always present, is it present? %s\n", exists ? "yes" : "no"); /// ~~~~~~~~~~~~~ /// -inline bool ATTR_DLL_LOCAL FileExists(const std::string& filename, bool usecache = false) +inline bool FileExists(const std::string& filename, bool usecache = false) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_filesystem->file_exists( - CPrivateBase::m_interface->toKodi->kodiBase, filename.c_str(), usecache); + return kodi::dl::api.kodi_vfs_file_exists(filename.c_str(), usecache); } //------------------------------------------------------------------------------ @@ -994,12 +952,9 @@ inline bool ATTR_DLL_LOCAL FileExists(const std::string& filename, bool usecache /// ret); /// ~~~~~~~~~~~~~ /// -inline bool ATTR_DLL_LOCAL StatFile(const std::string& filename, kodi::vfs::FileStatus& buffer) +inline bool StatFile(const std::string& filename, kodi::vfs::FileStatus& buffer) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_filesystem->stat_file( - CPrivateBase::m_interface->toKodi->kodiBase, filename.c_str(), buffer); + return kodi::dl::api.kodi_vfs_stat_file(filename.c_str(), buffer); } //------------------------------------------------------------------------------ @@ -1032,12 +987,9 @@ inline bool ATTR_DLL_LOCAL StatFile(const std::string& filename, kodi::vfs::File /// } /// ~~~~~~~~~~~~~ /// -inline bool ATTR_DLL_LOCAL DeleteFile(const std::string& filename) +inline bool DeleteFile(const std::string& filename) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_filesystem->delete_file( - CPrivateBase::m_interface->toKodi->kodiBase, filename.c_str()); + return kodi::dl::api.kodi_vfs_delete_file(filename.c_str()); } //------------------------------------------------------------------------------ @@ -1050,12 +1002,9 @@ inline bool ATTR_DLL_LOCAL DeleteFile(const std::string& filename) /// @return true if successfully renamed /// /// -inline bool ATTR_DLL_LOCAL RenameFile(const std::string& filename, const std::string& newFileName) +inline bool RenameFile(const std::string& filename, const std::string& newFileName) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_filesystem->rename_file( - CPrivateBase::m_interface->toKodi->kodiBase, filename.c_str(), newFileName.c_str()); + return kodi::dl::api.kodi_vfs_rename_file(filename.c_str(), newFileName.c_str()); } //------------------------------------------------------------------------------ @@ -1068,17 +1017,12 @@ inline bool ATTR_DLL_LOCAL RenameFile(const std::string& filename, const std::st /// @return true if successfully copied /// /// -inline bool ATTR_DLL_LOCAL CopyFile(const std::string& filename, const std::string& destination) +inline bool CopyFile(const std::string& filename, const std::string& destination) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_filesystem->copy_file( - CPrivateBase::m_interface->toKodi->kodiBase, filename.c_str(), destination.c_str()); + return kodi::dl::api.kodi_vfs_copy_file(filename.c_str(), destination.c_str()); } //------------------------------------------------------------------------------ -//}}} - //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // "C++" General filesystem functions //{{{ @@ -1109,19 +1053,16 @@ inline bool ATTR_DLL_LOCAL CopyFile(const std::string& filename, const std::stri /// } /// ~~~~~~~~~~~~~ /// -inline std::string ATTR_DLL_LOCAL GetFileMD5(const std::string& path) +inline std::string GetFileMD5(const std::string& path) { - using namespace kodi::addon; std::string strReturn; - char* strMd5 = CPrivateBase::m_interface->toKodi->kodi_filesystem->get_file_md5( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - strMd5); + free(strMd5); } return strReturn; } @@ -1153,19 +1094,15 @@ inline std::string ATTR_DLL_LOCAL GetFileMD5(const std::string& path) /// } /// ~~~~~~~~~~~~~ /// -inline std::string ATTR_DLL_LOCAL GetCacheThumbName(const std::string& filename) +inline std::string GetCacheThumbName(const std::string& filename) { - using namespace kodi::addon; - std::string strReturn; - char* strThumbName = CPrivateBase::m_interface->toKodi->kodi_filesystem->get_cache_thumb_name( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - strThumbName); + free(strThumbName); } return strReturn; } @@ -1196,19 +1133,15 @@ inline std::string ATTR_DLL_LOCAL GetCacheThumbName(const std::string& filename) /// /* Returns as legal: 'jk___lj____.mpg' */ /// ~~~~~~~~~~~~~ /// -inline std::string ATTR_DLL_LOCAL MakeLegalFileName(const std::string& filename) +inline std::string MakeLegalFileName(const std::string& filename) { - using namespace kodi::addon; - std::string strReturn; - char* strLegalFileName = CPrivateBase::m_interface->toKodi->kodi_filesystem->make_legal_filename( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - strLegalFileName); + free(strLegalFileName); } return strReturn; } @@ -1239,19 +1172,15 @@ inline std::string ATTR_DLL_LOCAL MakeLegalFileName(const std::string& filename) /// /* Returns as legal: '/jk___lj____/hgjkg' */ /// ~~~~~~~~~~~~~ /// -inline std::string ATTR_DLL_LOCAL MakeLegalPath(const std::string& path) +inline std::string MakeLegalPath(const std::string& path) { - using namespace kodi::addon; - std::string strReturn; - char* strLegalPath = CPrivateBase::m_interface->toKodi->kodi_filesystem->make_legal_path( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - strLegalPath); + free(strLegalPath); } return strReturn; } @@ -1287,19 +1216,15 @@ inline std::string ATTR_DLL_LOCAL MakeLegalPath(const std::string& path) /// ... /// ~~~~~~~~~~~~~ /// -inline std::string ATTR_DLL_LOCAL TranslateSpecialProtocol(const std::string& source) +inline std::string TranslateSpecialProtocol(const std::string& source) { - using namespace kodi::addon; - std::string strReturn; - char* protocol = CPrivateBase::m_interface->toKodi->kodi_filesystem->translate_special_protocol( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - protocol); + free(protocol); } return strReturn; } @@ -1341,16 +1266,14 @@ inline std::string ATTR_DLL_LOCAL TranslateSpecialProtocol(const std::string& so /// fprintf(stderr, " - available: %lu MByte\n", available / 1024 / 1024); /// ~~~~~~~~~~~~~ /// -inline bool ATTR_DLL_LOCAL GetDiskSpace(const std::string& path, - uint64_t& capacity, - uint64_t& free, - uint64_t& available) -{ - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_filesystem->get_disk_space( - CPrivateBase::m_interface->toKodi->kodiBase, path.c_str(), &capacity, &free, &available); -} +// 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); +// } //------------------------------------------------------------------------------ //============================================================================== @@ -1371,7 +1294,7 @@ inline bool ATTR_DLL_LOCAL GetDiskSpace(const std::string& path, /// fprintf(stderr, "File name is '%s'\n", fileName.c_str()); /// ~~~~~~~~~~~~~ /// -inline std::string ATTR_DLL_LOCAL GetFileName(const std::string& path) +inline std::string GetFileName(const std::string& path) { /* find the last slash */ const size_t slash = path.find_last_of("/\\"); @@ -1397,7 +1320,7 @@ inline std::string ATTR_DLL_LOCAL GetFileName(const std::string& path) /// fprintf(stderr, "Directory name is '%s'\n", dirName.c_str()); /// ~~~~~~~~~~~~~ /// -inline std::string ATTR_DLL_LOCAL 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. @@ -1432,7 +1355,7 @@ inline std::string ATTR_DLL_LOCAL GetDirectoryName(const std::string& path) /// fprintf(stderr, "Directory name is '%s'\n", dirName.c_str()); /// ~~~~~~~~~~~~~ /// -inline void ATTR_DLL_LOCAL RemoveSlashAtEnd(std::string& path) +inline void RemoveSlashAtEnd(std::string& path) { if (!path.empty()) { @@ -1452,7 +1375,7 @@ inline void ATTR_DLL_LOCAL RemoveSlashAtEnd(std::string& path) /// @param[in] minimum The minimum size (or maybe the minimum number of chunks?) /// @return The aligned size /// -inline unsigned int ATTR_DLL_LOCAL 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); @@ -1509,12 +1432,9 @@ inline unsigned int ATTR_DLL_LOCAL GetChunkSize(unsigned int chunk, unsigned int /// kodi::vfs::IsInternetStream("ftp://do-somewhere.com/the-file.mkv") ? "yes" : "no", true); /// ~~~~~~~~~~~~~ /// -inline bool ATTR_DLL_LOCAL IsInternetStream(const std::string& path, bool strictCheck = false) +inline bool IsInternetStream(const std::string& path, bool strictCheck = false) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_filesystem->is_internet_stream( - CPrivateBase::m_interface->toKodi->kodiBase, path.c_str(), strictCheck); + return kodi::dl::api.kodi_vfs_is_internet_stream(path.c_str(), strictCheck); } //------------------------------------------------------------------------------ @@ -1541,12 +1461,9 @@ inline bool ATTR_DLL_LOCAL IsInternetStream(const std::string& path, bool strict /// bool lan = kodi::vfs::IsOnLAN("smb://path/to/file"); /// ~~~~~~~~~~~~~ /// -inline bool ATTR_DLL_LOCAL IsOnLAN(const std::string& path) +inline bool IsOnLAN(const std::string& path) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_filesystem->is_on_lan( - CPrivateBase::m_interface->toKodi->kodiBase, path.c_str()); + return kodi::dl::api.kodi_vfs_is_on_lan(path.c_str()); } //------------------------------------------------------------------------------ @@ -1570,12 +1487,9 @@ inline bool ATTR_DLL_LOCAL IsOnLAN(const std::string& path) /// bool remote = kodi::vfs::IsRemote("http://path/to/file"); /// ~~~~~~~~~~~~~ /// -inline bool ATTR_DLL_LOCAL IsRemote(const std::string& path) +inline bool IsRemote(const std::string& path) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_filesystem->is_remote( - CPrivateBase::m_interface->toKodi->kodiBase, path.c_str()); + return kodi::dl::api.kodi_vfs_is_remote(path.c_str()); } //------------------------------------------------------------------------------ @@ -1586,12 +1500,9 @@ inline bool ATTR_DLL_LOCAL IsRemote(const std::string& path) /// @param[in] path To checked path /// @return True if path is local, false otherwise /// -inline bool ATTR_DLL_LOCAL IsLocal(const std::string& path) +inline bool IsLocal(const std::string& path) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_filesystem->is_local( - CPrivateBase::m_interface->toKodi->kodiBase, path.c_str()); + return kodi::dl::api.kodi_vfs_is_local(path.c_str()); } //------------------------------------------------------------------------------ @@ -1617,14 +1528,11 @@ inline bool ATTR_DLL_LOCAL IsLocal(const std::string& path) /// isURL = kodi::vfs::IsURL("/path/to/file"); /// ~~~~~~~~~~~~~ /// -inline bool ATTR_DLL_LOCAL IsURL(const std::string& path) +inline bool IsURL(const std::string& path) { - using namespace kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_filesystem->is_url( - CPrivateBase::m_interface->toKodi->kodiBase, path.c_str()); + return kodi::dl::api.kodi_vfs_is_url(path.c_str()); } -//-------------------------------------------------------------------------- +//------------------------------------------------------------------------------ //============================================================================ /// @ingroup cpp_kodi_vfs_General @@ -1650,14 +1558,12 @@ inline bool ATTR_DLL_LOCAL IsURL(const std::string& path) /// ... /// ~~~~~~~~~~~~~ /// -inline bool ATTR_DLL_LOCAL GetHttpHeader(const std::string& url, HttpHeader& header) +inline bool GetHttpHeader(const std::string& url, HttpHeader& header) { - using namespace ::kodi::addon; - - return CPrivateBase::m_interface->toKodi->kodi_filesystem->get_http_header( - CPrivateBase::m_interface->toKodi->kodiBase, url.c_str(), &header.m_handle); + header.m_handle = kodi::dl::api.kodi_vfs_http_header_open(url.c_str()); + return header.m_handle != nullptr; } -//---------------------------------------------------------------------------- +//------------------------------------------------------------------------------ //============================================================================ /// @ingroup cpp_kodi_vfs_General @@ -1681,24 +1587,20 @@ inline bool ATTR_DLL_LOCAL GetHttpHeader(const std::string& url, HttpHeader& hea /// ... /// ~~~~~~~~~~~~~ /// -inline bool ATTR_DLL_LOCAL GetMimeType(const std::string& url, - std::string& mimeType, - const std::string& useragent = "") +inline bool GetMimeType(const std::string& url, + std::string& mimeType, + const std::string& useragent = "") { - using namespace ::kodi::addon; - char* cMimeType = nullptr; - bool ret = CPrivateBase::m_interface->toKodi->kodi_filesystem->get_mime_type( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - cMimeType); + free(cMimeType); } return ret; } -//---------------------------------------------------------------------------- +//------------------------------------------------------------------------------ //============================================================================ /// @ingroup cpp_kodi_vfs_General @@ -1726,20 +1628,16 @@ inline bool ATTR_DLL_LOCAL GetContentType(const std::string& url, std::string& content, const std::string& useragent = "") { - using namespace ::kodi::addon; - char* cContent = nullptr; - bool ret = CPrivateBase::m_interface->toKodi->kodi_filesystem->get_content_type( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - cContent); + free(cContent); } return ret; } -//---------------------------------------------------------------------------- +//------------------------------------------------------------------------------ //============================================================================ /// @ingroup cpp_kodi_vfs_General @@ -1766,22 +1664,16 @@ inline bool ATTR_DLL_LOCAL GetContentType(const std::string& url, /// inline bool ATTR_DLL_LOCAL GetCookies(const std::string& url, std::string& cookies) { - using namespace ::kodi::addon; - char* cCookies = nullptr; - bool ret = CPrivateBase::m_interface->toKodi->kodi_filesystem->get_cookies( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - cCookies); + free(cCookies); } return ret; } -//---------------------------------------------------------------------------- - -//}}} +//------------------------------------------------------------------------------ //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // "C++" CFile class @@ -1857,11 +1749,8 @@ class ATTR_DLL_LOCAL CFile /// bool OpenFile(const std::string& filename, unsigned int flags = 0) { - using namespace kodi::addon; - Close(); - m_file = CPrivateBase::m_interface->toKodi->kodi_filesystem->open_file( - CPrivateBase::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; } //-------------------------------------------------------------------------- @@ -1880,23 +1769,17 @@ class ATTR_DLL_LOCAL CFile /// 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 = CPrivateBase::m_interface->toKodi->kodi_filesystem->open_file_for_write( - CPrivateBase::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 (CPrivateBase::m_interface->toKodi->kodi_filesystem->directory_exists( - CPrivateBase::m_interface->toKodi->kodiBase, cacheDirectory.c_str()) || - CPrivateBase::m_interface->toKodi->kodi_filesystem->create_directory( - CPrivateBase::m_interface->toKodi->kodiBase, cacheDirectory.c_str())) - m_file = CPrivateBase::m_interface->toKodi->kodi_filesystem->open_file_for_write( - CPrivateBase::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; } @@ -1917,12 +1800,9 @@ class ATTR_DLL_LOCAL CFile /// void Close() { - using namespace kodi::addon; - if (!m_file) return; - CPrivateBase::m_interface->toKodi->kodi_filesystem->close_file( - CPrivateBase::m_interface->toKodi->kodiBase, m_file); + kodi::dl::api.kodi_vfs_file_close(m_file); m_file = nullptr; } //-------------------------------------------------------------------------- @@ -1936,10 +1816,7 @@ class ATTR_DLL_LOCAL CFile /// bool CURLCreate(const std::string& url) { - using namespace kodi::addon; - - m_file = CPrivateBase::m_interface->toKodi->kodi_filesystem->curl_create( - CPrivateBase::m_interface->toKodi->kodiBase, url.c_str()); + m_file = kodi::dl::api.kodi_vfs_file_curl_create(url.c_str()); return m_file != nullptr; } //-------------------------------------------------------------------------- @@ -1955,15 +1832,12 @@ class ATTR_DLL_LOCAL CFile /// 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!"); return false; } - return CPrivateBase::m_interface->toKodi->kodi_filesystem->curl_add_option( - CPrivateBase::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()); } //-------------------------------------------------------------------------- @@ -1976,15 +1850,12 @@ class ATTR_DLL_LOCAL 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!"); return false; } - return CPrivateBase::m_interface->toKodi->kodi_filesystem->curl_open( - CPrivateBase::m_interface->toKodi->kodiBase, m_file, flags); + return kodi::dl::api.kodi_vfs_file_curl_open(m_file, flags); } //-------------------------------------------------------------------------- @@ -1999,14 +1870,11 @@ class ATTR_DLL_LOCAL CFile /// 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 CPrivateBase::m_interface->toKodi->kodi_filesystem->read_file( - CPrivateBase::m_interface->toKodi->kodiBase, m_file, ptr, size); + return kodi::dl::api.kodi_vfs_file_read(m_file, ptr, size); } //-------------------------------------------------------------------------- @@ -2019,8 +1887,6 @@ class ATTR_DLL_LOCAL CFile /// bool ReadLine(std::string& line) { - using namespace kodi::addon; - line.clear(); if (!m_file) return false; @@ -2028,8 +1894,7 @@ class ATTR_DLL_LOCAL 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 (CPrivateBase::m_interface->toKodi->kodi_filesystem->read_file_string( - CPrivateBase::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(); @@ -2048,14 +1913,11 @@ class ATTR_DLL_LOCAL CFile /// 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 CPrivateBase::m_interface->toKodi->kodi_filesystem->write_file( - CPrivateBase::m_interface->toKodi->kodiBase, m_file, ptr, size); + return kodi::dl::api.kodi_vfs_file_write(m_file, ptr, size); } //-------------------------------------------------------------------------- @@ -2075,12 +1937,9 @@ class ATTR_DLL_LOCAL CFile /// void Flush() { - using namespace kodi::addon; - if (!m_file) return; - CPrivateBase::m_interface->toKodi->kodi_filesystem->flush_file( - CPrivateBase::m_interface->toKodi->kodiBase, m_file); + kodi::dl::api.kodi_vfs_file_flush(m_file); } //-------------------------------------------------------------------------- @@ -2104,12 +1963,9 @@ class ATTR_DLL_LOCAL CFile /// int64_t Seek(int64_t position, int whence = SEEK_SET) { - using namespace kodi::addon; - if (!m_file) return -1; - return CPrivateBase::m_interface->toKodi->kodi_filesystem->seek_file( - CPrivateBase::m_interface->toKodi->kodiBase, m_file, position, whence); + return kodi::dl::api.kodi_vfs_file_seek(m_file, position, whence); } //-------------------------------------------------------------------------- @@ -2122,12 +1978,9 @@ class ATTR_DLL_LOCAL CFile /// int Truncate(int64_t size) { - using namespace kodi::addon; - if (!m_file) return -1; - return CPrivateBase::m_interface->toKodi->kodi_filesystem->truncate_file( - CPrivateBase::m_interface->toKodi->kodiBase, m_file, size); + return kodi::dl::api.kodi_vfs_file_truncate(m_file, size); } //-------------------------------------------------------------------------- @@ -2139,12 +1992,9 @@ class ATTR_DLL_LOCAL CFile /// int64_t GetPosition() const { - using namespace kodi::addon; - if (!m_file) return -1; - return CPrivateBase::m_interface->toKodi->kodi_filesystem->get_file_position( - CPrivateBase::m_interface->toKodi->kodiBase, m_file); + return kodi::dl::api.kodi_vfs_file_get_position(m_file); } //-------------------------------------------------------------------------- @@ -2156,12 +2006,9 @@ class ATTR_DLL_LOCAL CFile /// int64_t GetLength() const { - using namespace kodi::addon; - if (!m_file) return -1; - return CPrivateBase::m_interface->toKodi->kodi_filesystem->get_file_length( - CPrivateBase::m_interface->toKodi->kodiBase, m_file); + return kodi::dl::api.kodi_vfs_file_get_length(m_file); } //-------------------------------------------------------------------------- @@ -2171,18 +2018,7 @@ class ATTR_DLL_LOCAL CFile /// /// @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 = CPrivateBase::m_interface->toKodi->kodi_filesystem->get_file_length( - CPrivateBase::m_interface->toKodi->kodiBase, m_file); - int64_t position = CPrivateBase::m_interface->toKodi->kodi_filesystem->get_file_position( - CPrivateBase::m_interface->toKodi->kodiBase, m_file); - return position >= length; - } + bool AtEnd() const { return kodi::dl::api.kodi_vfs_file_at_end(m_file); } //-------------------------------------------------------------------------- //========================================================================== @@ -2193,12 +2029,9 @@ class ATTR_DLL_LOCAL CFile /// int GetChunkSize() const { - using namespace kodi::addon; - if (!m_file) return -1; - return CPrivateBase::m_interface->toKodi->kodi_filesystem->get_file_chunk_size( - CPrivateBase::m_interface->toKodi->kodiBase, m_file); + return kodi::dl::api.kodi_vfs_file_get_chunk_size(m_file); } //-------------------------------------------------------------------------- @@ -2210,12 +2043,9 @@ class ATTR_DLL_LOCAL CFile /// bool IoControlGetSeekPossible() const { - using namespace kodi::addon; - if (!m_file) return false; - return CPrivateBase::m_interface->toKodi->kodi_filesystem->io_control_get_seek_possible( - CPrivateBase::m_interface->toKodi->kodiBase, m_file); + return kodi::dl::api.kodi_vfs_file_io_ctl_get_seek_possible(m_file); } //-------------------------------------------------------------------------- @@ -2231,14 +2061,11 @@ class ATTR_DLL_LOCAL CFile /// bool IoControlGetCacheStatus(CacheStatus& status) const { - using namespace kodi::addon; - if (!m_file) return false; - return CPrivateBase::m_interface->toKodi->kodi_filesystem->io_control_get_cache_status( - CPrivateBase::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 @@ -2249,14 +2076,11 @@ class ATTR_DLL_LOCAL CFile /// bool IoControlSetCacheRate(uint32_t rate) { - using namespace kodi::addon; - if (!m_file) return false; - return CPrivateBase::m_interface->toKodi->kodi_filesystem->io_control_set_cache_rate( - CPrivateBase::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 @@ -2267,14 +2091,11 @@ class ATTR_DLL_LOCAL CFile /// bool IoControlSetRetry(bool retry) { - using namespace kodi::addon; - if (!m_file) return false; - return CPrivateBase::m_interface->toKodi->kodi_filesystem->io_control_set_retry( - CPrivateBase::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 @@ -2286,8 +2107,6 @@ class ATTR_DLL_LOCAL CFile /// const std::string GetPropertyValue(FilePropertyTypes type, const std::string& name) const { - using namespace kodi::addon; - if (!m_file) { kodi::Log(ADDON_LOG_ERROR, @@ -2314,27 +2133,27 @@ class ATTR_DLL_LOCAL CFile const std::vector GetPropertyValues(FilePropertyTypes type, const std::string& name) const { - using namespace kodi::addon; - if (!m_file) { kodi::Log(ADDON_LOG_ERROR, "kodi::vfs::CURLCreate(...) needed to call before GetPropertyValues!"); return std::vector(); } - int numValues = 0; - char** res(CPrivateBase::m_interface->toKodi->kodi_filesystem->get_property_values( - CPrivateBase::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]); } - CPrivateBase::m_interface->toKodi->free_string_array( - CPrivateBase::m_interface->toKodi->kodiBase, res, numValues); + + free(res); + return vecReturn; } return std::vector(); @@ -2349,22 +2168,15 @@ class ATTR_DLL_LOCAL CFile /// double GetFileDownloadSpeed() const { - using namespace kodi::addon; - if (!m_file) return 0.0; - return CPrivateBase::m_interface->toKodi->kodi_filesystem->get_file_download_speed( - CPrivateBase::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 71678c2a56c24..a1825929af5c1 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 @@ -14,6 +14,8 @@ #ifdef __cplusplus +#include + //============================================================================== /// \ingroup cpp_kodi_Defs /// @brief For kodi::Version used structure @@ -67,14 +69,12 @@ inline bool ATTR_DLL_LOCAL UnknownToUTF8(const std::string& stringSrc, using namespace kodi::addon; bool ret = false; - char* retString = CPrivateBase::m_interface->toKodi->kodi->unknown_to_utf8( - CPrivateBase::m_interface->toKodi->kodiBase, stringSrc.c_str(), &ret, failOnBadChar); + char* retString = kodi::dl::api.kodi_unknown_to_utf8(stringSrc.c_str(), &ret, failOnBadChar); if (retString != nullptr) { if (ret) utf8StringDst = retString; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -107,17 +107,13 @@ inline bool ATTR_DLL_LOCAL UnknownToUTF8(const std::string& stringSrc, inline std::string ATTR_DLL_LOCAL GetLanguage(LangFormats format = LANG_FMT_ENGLISH_NAME, bool region = false) { - using namespace kodi::addon; - std::string language; - char* retString = CPrivateBase::m_interface->toKodi->kodi->get_language( - CPrivateBase::m_interface->toKodi->kodiBase, format, region); + char* retString = kodi::dl::api.kodi_get_language(format, region); if (retString != nullptr) { if (std::strlen(retString)) language = retString; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return language; } @@ -201,16 +197,12 @@ inline std::string ATTR_DLL_LOCAL GetLanguage(LangFormats format = LANG_FMT_ENGL /// inline void ATTR_DLL_LOCAL 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); - CPrivateBase::m_interface->toKodi->kodi->queue_notification( - CPrivateBase::m_interface->toKodi->kodiBase, type, "", str.c_str(), "", 5000, false, 1000); + kodi::dl::api.kodi_queue_notification(type, "", str.c_str(), "", 5000, false, 1000); } -//------------------------------------------------------------------------------ //============================================================================== /// \ingroup cpp_kodi @@ -265,46 +257,11 @@ inline void ATTR_DLL_LOCAL QueueNotification(QueueMsg type, bool withSound = true, unsigned int messageTime = 1000) { - using namespace kodi::addon; - - CPrivateBase::m_interface->toKodi->kodi->queue_notification( - CPrivateBase::m_interface->toKodi->kodiBase, type, header.c_str(), message.c_str(), - imageFile.c_str(), displayTime, withSound, messageTime); + kodi::dl::api.kodi_queue_notification(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 ATTR_DLL_LOCAL GetMD5(const std::string& text) -{ - using namespace kodi::addon; - - char* md5ret = static_cast(malloc(40 * sizeof(char))); // md5 size normally 32 bytes - CPrivateBase::m_interface->toKodi->kodi->get_md5(CPrivateBase::m_interface->toKodi->kodiBase, - text.c_str(), md5ret); - std::string md5 = md5ret; - free(md5ret); - return md5; -} -//---------------------------------------------------------------------------- - //============================================================================== /// \ingroup cpp_kodi /// @brief Returns your regions setting as a string for the specified id @@ -330,17 +287,13 @@ inline std::string ATTR_DLL_LOCAL GetMD5(const std::string& text) /// inline std::string ATTR_DLL_LOCAL GetRegion(const std::string& id) { - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::m_interface->toKodi; - std::string strReturn; - char* strMsg = toKodi->kodi->get_region(toKodi->kodiBase, id.c_str()); + char* strMsg = kodi::dl::api.kodi_get_region(id.c_str()); if (strMsg != nullptr) { if (std::strlen(strMsg)) strReturn = strMsg; - toKodi->free_string(toKodi->kodiBase, strMsg); + free(strMsg); } return strReturn; } @@ -371,12 +324,9 @@ inline std::string ATTR_DLL_LOCAL GetRegion(const std::string& id) /// inline void ATTR_DLL_LOCAL GetFreeMem(long& free, long& total, bool asBytes = false) { - using namespace kodi::addon; - free = -1; total = -1; - AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::m_interface->toKodi; - toKodi->kodi->get_free_mem(toKodi->kodiBase, &free, &total, asBytes); + kodi::dl::api.kodi_get_free_mem(&free, &total, asBytes); } //------------------------------------------------------------------------------ @@ -399,10 +349,7 @@ inline void ATTR_DLL_LOCAL GetFreeMem(long& free, long& total, bool asBytes = fa /// inline int ATTR_DLL_LOCAL GetGlobalIdleTime() { - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::m_interface->toKodi; - return toKodi->kodi->get_global_idle_time(toKodi->kodiBase); + return kodi::dl::api.kodi_get_global_idle_time(); } //------------------------------------------------------------------------------ @@ -429,17 +376,13 @@ inline int ATTR_DLL_LOCAL GetGlobalIdleTime() /// inline std::string ATTR_DLL_LOCAL GetCurrentSkinId() { - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::m_interface->toKodi; - std::string strReturn; - char* strMsg = toKodi->kodi->get_current_skin_id(toKodi->kodiBase); + char* strMsg = kodi::dl::api.kodi_get_current_skin_id(); if (strMsg != nullptr) { if (std::strlen(strMsg)) strReturn = strMsg; - toKodi->free_string(toKodi->kodiBase, strMsg); + free(strMsg); } return strReturn; } @@ -472,16 +415,12 @@ inline bool ATTR_DLL_LOCAL IsAddonAvailable(const std::string& id, std::string& version, bool& enabled) { - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::m_interface->toKodi; - char* cVersion = nullptr; - bool ret = toKodi->kodi->is_addon_avilable(toKodi->kodiBase, id.c_str(), &cVersion, &enabled); + bool ret = kodi::dl::api.kodi_is_addon_avilable(id.c_str(), &cVersion, &enabled); if (cVersion) { version = cVersion; - toKodi->free_string(toKodi->kodiBase, cVersion); + free(cVersion); } return ret; } @@ -528,35 +467,32 @@ inline bool ATTR_DLL_LOCAL IsAddonAvailable(const std::string& id, /// inline void ATTR_DLL_LOCAL 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 = CPrivateBase::m_interface->toKodi; - toKodi->kodi->kodi_version(toKodi->kodiBase, &compile_name, &version.major, &version.minor, - &revision, &tag, &tag_revision); + kodi::dl::api.kodi_version(&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); + free(compile_name); } if (revision != nullptr) { version.revision = revision; - toKodi->free_string(toKodi->kodiBase, revision); + free(revision); } if (tag != nullptr) { version.tag = tag; - toKodi->free_string(toKodi->kodiBase, tag); + free(tag); } if (tag_revision != nullptr) { version.tag_revision = tag_revision; - toKodi->free_string(toKodi->kodiBase, tag_revision); + free(tag_revision); } } //------------------------------------------------------------------------------ @@ -598,19 +534,15 @@ inline bool ATTR_DLL_LOCAL GetKeyboardLayout(int modifierKey, std::string& layout_name, std::vector>& layout) { - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::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); + bool ret = kodi::dl::api.kodi_get_keyboard_layout(modifierKey, &c_layout_name, &c_layout); if (ret) { if (c_layout_name) { layout_name = c_layout_name; - toKodi->free_string(toKodi->kodiBase, c_layout_name); + free(c_layout_name); } layout.resize(STD_KB_BUTTONS_MAX_ROWS); @@ -623,7 +555,7 @@ inline bool ATTR_DLL_LOCAL GetKeyboardLayout(int modifierKey, if (button) { layout[row][column] = button; - toKodi->free_string(toKodi->kodiBase, button); + free(button); } } } @@ -668,21 +600,45 @@ inline bool ATTR_DLL_LOCAL GetKeyboardLayout(int modifierKey, /// inline bool ATTR_DLL_LOCAL ChangeKeyboardLayout(std::string& layout_name) { - using namespace kodi::addon; - - AddonToKodiFuncTable_Addon* toKodi = CPrivateBase::m_interface->toKodi; char* c_layout_name = nullptr; - bool ret = toKodi->kodi->change_keyboard_layout(toKodi->kodiBase, &c_layout_name); + bool ret = kodi::dl::api.kodi_change_keyboard_layout(&c_layout_name); if (c_layout_name) { layout_name = c_layout_name; - toKodi->free_string(toKodi->kodiBase, c_layout_name); + free(c_layout_name); } return ret; } //------------------------------------------------------------------------------ +//============================================================================== +/// @ingroup cpp_kodi +/// @brief +/// +/// +/// +/// @param[in] filename +/// @param[in] use_cached +/// +inline void ATTR_DLL_LOCAL PlaySFX(const std::string& filename, bool use_cached) +{ + kodi::dl::api.kodi_play_sfx(filename.c_str(), use_cached); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi +/// @brief +/// +/// +/// +inline void ATTR_DLL_LOCAL StopSFX() +{ + 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 index e6ff2c985e342..e98101c77d542 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/Network.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/Network.h @@ -40,8 +40,8 @@ inline bool ATTR_DLL_LOCAL WakeOnLan(const std::string& mac) { using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_network->wake_on_lan( - CPrivateBase::m_interface->toKodi->kodiBase, mac.c_str()); + return CPrivateBase::ifc.toKodi->kodi_network->wake_on_lan(CPrivateBase::ifc.toKodi->kodiBase, + mac.c_str()); } //---------------------------------------------------------------------------- @@ -68,13 +68,12 @@ inline std::string ATTR_DLL_LOCAL GetIPAddress() using namespace ::kodi::addon; std::string ip; - char* string = CPrivateBase::m_interface->toKodi->kodi_network->get_ip_address( - CPrivateBase::m_interface->toKodi->kodiBase); + char* string = + CPrivateBase::ifc.toKodi->kodi_network->get_ip_address(CPrivateBase::ifc.toKodi->kodiBase); if (string != nullptr) { ip = string; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - string); + CPrivateBase::ifc.toKodi->free_string(CPrivateBase::ifc.toKodi->kodiBase, string); } return ip; } @@ -103,13 +102,12 @@ inline std::string ATTR_DLL_LOCAL GetHostname() using namespace ::kodi::addon; std::string ip; - char* string = CPrivateBase::m_interface->toKodi->kodi_network->get_hostname( - CPrivateBase::m_interface->toKodi->kodiBase); + char* string = + CPrivateBase::ifc.toKodi->kodi_network->get_hostname(CPrivateBase::ifc.toKodi->kodiBase); if (string != nullptr) { ip = string; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - string); + CPrivateBase::ifc.toKodi->free_string(CPrivateBase::ifc.toKodi->kodiBase, string); } return ip; } @@ -139,13 +137,12 @@ inline std::string ATTR_DLL_LOCAL GetUserAgent() using namespace ::kodi::addon; std::string agent; - char* string = CPrivateBase::m_interface->toKodi->kodi_network->get_user_agent( - CPrivateBase::m_interface->toKodi->kodiBase); + char* string = + CPrivateBase::ifc.toKodi->kodi_network->get_user_agent(CPrivateBase::ifc.toKodi->kodiBase); if (string != nullptr) { agent = string; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - string); + CPrivateBase::ifc.toKodi->free_string(CPrivateBase::ifc.toKodi->kodiBase, string); } return agent; } @@ -174,8 +171,8 @@ inline bool ATTR_DLL_LOCAL IsLocalHost(const std::string& hostname) { using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_network->is_local_host( - CPrivateBase::m_interface->toKodi->kodiBase, hostname.c_str()); + return CPrivateBase::ifc.toKodi->kodi_network->is_local_host(CPrivateBase::ifc.toKodi->kodiBase, + hostname.c_str()); } //---------------------------------------------------------------------------- @@ -191,8 +188,8 @@ inline bool ATTR_DLL_LOCAL IsHostOnLAN(const std::string& hostname, bool offLine { using namespace kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_network->is_host_on_lan( - CPrivateBase::m_interface->toKodi->kodiBase, hostname.c_str(), offLineCheck); + return CPrivateBase::ifc.toKodi->kodi_network->is_host_on_lan(CPrivateBase::ifc.toKodi->kodiBase, + hostname.c_str(), offLineCheck); } //------------------------------------------------------------------------------ @@ -226,13 +223,12 @@ inline std::string ATTR_DLL_LOCAL URLEncode(const std::string& url) using namespace ::kodi::addon; std::string retString; - char* string = CPrivateBase::m_interface->toKodi->kodi_network->url_encode( - CPrivateBase::m_interface->toKodi->kodiBase, url.c_str()); + char* string = CPrivateBase::ifc.toKodi->kodi_network->url_encode( + CPrivateBase::ifc.toKodi->kodiBase, url.c_str()); if (string != nullptr) { retString = string; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - string); + CPrivateBase::ifc.toKodi->free_string(CPrivateBase::ifc.toKodi->kodiBase, string); } return retString; } @@ -269,13 +265,12 @@ inline bool ATTR_DLL_LOCAL DNSLookup(const std::string& hostName, std::string& i using namespace ::kodi::addon; bool ret = false; - char* string = CPrivateBase::m_interface->toKodi->kodi_network->dns_lookup( - CPrivateBase::m_interface->toKodi->kodiBase, hostName.c_str(), &ret); + char* string = CPrivateBase::ifc.toKodi->kodi_network->dns_lookup( + CPrivateBase::ifc.toKodi->kodiBase, hostName.c_str(), &ret); if (string != nullptr) { ipAddress = string; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - string); + CPrivateBase::ifc.toKodi->free_string(CPrivateBase::ifc.toKodi->kodiBase, string); } return ret; } 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 8569bc3c93bbc..c3621e755e1c9 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 @@ -467,10 +467,6 @@ class ATTR_DLL_LOCAL CInstanceAudioDecoder : public IAddonInstance explicit CInstanceAudioDecoder(const kodi::addon::IInstanceInfo& instance) : IAddonInstance(instance) { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceAudioDecoder: Creation of multiple together with single instance way is not allowed!"); - - SetAddonStruct(instance); } //-------------------------------------------------------------------------- @@ -523,7 +519,7 @@ class ATTR_DLL_LOCAL 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 @copydetails cpp_kodi_addon_audiodecoder_Defs_AUDIODECODER_READ_RETURN + /// @return @copydetails cpp_kodi_addon_audiodecoder_Defs_KODI_ADDON_AUDIODECODER_READ_RETURN /// virtual int ReadPCM(uint8_t* buffer, size_t size, size_t& actualsize) = 0; //-------------------------------------------------------------------------- @@ -608,15 +604,15 @@ class ATTR_DLL_LOCAL CInstanceAudioDecoder : public IAddonInstance //-------------------------------------------------------------------------- private: - void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) + void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) override { instance->hdl = this; - instance->audiodecoder->toAddon->supports_file = ADDON_supports_file; - instance->audiodecoder->toAddon->init = ADDON_init; - instance->audiodecoder->toAddon->read_pcm = ADDON_read_pcm; - instance->audiodecoder->toAddon->seek = ADDON_seek; - instance->audiodecoder->toAddon->read_tag = ADDON_read_tag; - instance->audiodecoder->toAddon->track_count = ADDON_track_count; + instance->audiodecoder->supports_file = ADDON_supports_file; + instance->audiodecoder->init = ADDON_init; + instance->audiodecoder->read_pcm = ADDON_read_pcm; + instance->audiodecoder->seek = ADDON_seek; + instance->audiodecoder->read_tag = ADDON_read_tag; + instance->audiodecoder->track_count = ADDON_track_count; } inline static bool ADDON_supports_file(const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file) 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 c79a472997745..c5f4c7db2c9b7 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 @@ -13,8 +13,6 @@ #ifdef __cplusplus -#include - namespace kodi { namespace addon @@ -394,13 +392,9 @@ class ATTR_DLL_LOCAL CInstanceAudioEncoder : public IAddonInstance /// ~~~~~~~~~~~~~ /// explicit CInstanceAudioEncoder(const kodi::addon::IInstanceInfo& instance) - : IAddonInstance(instance) + : IAddonInstance(instance), + m_kodi(instance.GetKodiHdl()) { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceAudioEncoder: Creation of multiple together " - "with single instance way is not allowed!"); - - SetAddonStruct(instance); } //---------------------------------------------------------------------------- @@ -446,7 +440,7 @@ class ATTR_DLL_LOCAL CInstanceAudioEncoder : public IAddonInstance /// ssize_t Write(const uint8_t* data, size_t length) { - return m_kodi->write(m_kodi->kodiInstance, data, length); + return kodi::dl::api.kodi_addon_audioencoder_write(m_kodi, data, length); } //---------------------------------------------------------------------------- @@ -473,18 +467,17 @@ class ATTR_DLL_LOCAL CInstanceAudioEncoder : public IAddonInstance /// ssize_t Seek(ssize_t position, int whence = SEEK_SET) { - return m_kodi->seek(m_kodi->kodiInstance, position, whence); + return kodi::dl::api.kodi_addon_audioencoder_seek(m_kodi, position, whence); } //---------------------------------------------------------------------------- private: - void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) + void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) override { instance->hdl = this; - instance->audioencoder->toAddon->start = ADDON_start; - instance->audioencoder->toAddon->encode = ADDON_encode; - instance->audioencoder->toAddon->finish = ADDON_finish; - m_kodi = instance->audioencoder->toKodi; + instance->audioencoder->start = ADDON_start; + instance->audioencoder->encode = ADDON_encode; + instance->audioencoder->finish = ADDON_finish; } inline static bool ADDON_start(const KODI_ADDON_AUDIOENCODER_HDL hdl, @@ -505,7 +498,7 @@ class ATTR_DLL_LOCAL CInstanceAudioEncoder : public IAddonInstance return static_cast(hdl)->Finish(); } - AddonToKodiFuncTable_AudioEncoder* m_kodi{nullptr}; + const KODI_ADDON_INSTANCE_BACKEND_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 8f7d20c8c4206..2c249562b48d7 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 @@ -13,6 +13,7 @@ set(HEADERS VFS.h VideoCodec.h Visualization.h + Web.h ) if(HEADERS) 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 index b4f1a24264405..0a9c06ba36871 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Game.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Game.h @@ -159,16 +159,12 @@ class ATTR_DLL_LOCAL CInstanceGame : public IAddonInstance /// ADDONCREATOR(CGameExample) /// ~~~~~~~~~~~~~ /// - CInstanceGame() : IAddonInstance(IInstanceInfo(CPrivateBase::m_interface->firstKodiInstance)) - { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceGame: Creation of more as one in single " - "instance way is not allowed!"); + CInstanceGame() = default; + //---------------------------------------------------------------------------- - SetAddonStruct(CPrivateBase::m_interface->firstKodiInstance); - CPrivateBase::m_interface->globalSingleInstance = this; + explicit CInstanceGame(const IInstanceInfo& instance) : IAddonInstance(instance) + { } - //---------------------------------------------------------------------------- //============================================================================ /// @brief Destructor @@ -461,7 +457,7 @@ class ATTR_DLL_LOCAL CInstanceGame : public IAddonInstance /// bool Open(const game_stream_properties& properties) { - if (!CPrivateBase::m_interface->globalSingleInstance) + if (!CPrivateBase::ifc.globalSingleInstance) return false; if (m_handle) @@ -471,7 +467,7 @@ class ATTR_DLL_LOCAL CInstanceGame : public IAddonInstance } AddonToKodiFuncTable_Game& cb = - *static_cast(CPrivateBase::m_interface->globalSingleInstance) + *static_cast(CPrivateBase::ifc.globalSingleInstance) ->m_instanceData->toKodi; m_handle = cb.OpenStream(cb.kodiInstance, &properties); return m_handle != nullptr; @@ -486,11 +482,11 @@ class ATTR_DLL_LOCAL CInstanceGame : public IAddonInstance /// void Close() { - if (!m_handle || !CPrivateBase::m_interface->globalSingleInstance) + if (!m_handle || !CPrivateBase::ifc.globalSingleInstance) return; AddonToKodiFuncTable_Game& cb = - *static_cast(CPrivateBase::m_interface->globalSingleInstance) + *static_cast(CPrivateBase::ifc.globalSingleInstance) ->m_instanceData->toKodi; cb.CloseStream(cb.kodiInstance, m_handle); m_handle = nullptr; @@ -512,11 +508,11 @@ class ATTR_DLL_LOCAL CInstanceGame : public IAddonInstance /// bool GetBuffer(unsigned int width, unsigned int height, game_stream_buffer& buffer) { - if (!m_handle || !CPrivateBase::m_interface->globalSingleInstance) + if (!m_handle || !CPrivateBase::ifc.globalSingleInstance) return false; AddonToKodiFuncTable_Game& cb = - *static_cast(CPrivateBase::m_interface->globalSingleInstance) + *static_cast(CPrivateBase::ifc.globalSingleInstance) ->m_instanceData->toKodi; return cb.GetStreamBuffer(cb.kodiInstance, m_handle, width, height, &buffer); } @@ -532,11 +528,11 @@ class ATTR_DLL_LOCAL CInstanceGame : public IAddonInstance /// void AddData(const game_stream_packet& packet) { - if (!m_handle || !CPrivateBase::m_interface->globalSingleInstance) + if (!m_handle || !CPrivateBase::ifc.globalSingleInstance) return; AddonToKodiFuncTable_Game& cb = - *static_cast(CPrivateBase::m_interface->globalSingleInstance) + *static_cast(CPrivateBase::ifc.globalSingleInstance) ->m_instanceData->toKodi; cb.AddStreamData(cb.kodiInstance, m_handle, &packet); } @@ -552,11 +548,11 @@ class ATTR_DLL_LOCAL CInstanceGame : public IAddonInstance /// void ReleaseBuffer(game_stream_buffer& buffer) { - if (!m_handle || !CPrivateBase::m_interface->globalSingleInstance) + if (!m_handle || !CPrivateBase::ifc.globalSingleInstance) return; AddonToKodiFuncTable_Game& cb = - *static_cast(CPrivateBase::m_interface->globalSingleInstance) + *static_cast(CPrivateBase::ifc.globalSingleInstance) ->m_instanceData->toKodi; cb.ReleaseStreamBuffer(cb.kodiInstance, m_handle, &buffer); } 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 eb98f900285d6..cbe232acf6767 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 @@ -13,21 +13,12 @@ #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; //============================================================================== /// @defgroup cpp_kodi_addon_imagedecoder_Defs_ImageDecoderInfoTag class ImageDecoderInfoTag @@ -546,11 +537,6 @@ class ATTR_DLL_LOCAL CInstanceImageDecoder : public IAddonInstance /// explicit CInstanceImageDecoder(const IInstanceInfo& instance) : IAddonInstance(instance) { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceImageDecoder: Creation of multiple together " - "with single instance way is not allowed!"); - - SetAddonStruct(instance); } //---------------------------------------------------------------------------- @@ -621,17 +607,17 @@ class ATTR_DLL_LOCAL CInstanceImageDecoder : public IAddonInstance unsigned int width, unsigned int height, unsigned int pitch, - ADDON_IMG_FMT format) = 0; + kodi::addon::ImageFormat format) = 0; //---------------------------------------------------------------------------- private: - void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) + void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) override { instance->hdl = this; - instance->imagedecoder->toAddon->supports_file = ADDON_supports_file; - instance->imagedecoder->toAddon->read_tag = ADDON_read_tag; - instance->imagedecoder->toAddon->load_image_from_memory = ADDON_load_image_from_memory; - instance->imagedecoder->toAddon->decode = ADDON_decode; + instance->imagedecoder->supports_file = ADDON_supports_file; + instance->imagedecoder->read_tag = ADDON_read_tag; + instance->imagedecoder->load_image_from_memory = ADDON_load_image_from_memory; + instance->imagedecoder->decode = ADDON_decode; } inline static bool ADDON_supports_file(const KODI_ADDON_IMAGEDECODER_HDL hdl, const char* file) 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 index 4df1807b821da..3ee588a50a69c 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Inputstream.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Inputstream.h @@ -1163,11 +1163,6 @@ class ATTR_DLL_LOCAL CInstanceInputStream : public IAddonInstance /// explicit CInstanceInputStream(const IInstanceInfo& instance) : IAddonInstance(instance) { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceInputStream: Creation of multiple together " - "with single instance way is not allowed!"); - - SetAddonStruct(instance); } //---------------------------------------------------------------------------- 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 index 0ee71e28af35f..50fcb2cadeebe 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/PVR.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/PVR.h @@ -456,15 +456,7 @@ class ATTR_DLL_LOCAL CInstancePVRClient : public IAddonInstance /// ADDONCREATOR(CPVRExample) /// ~~~~~~~~~~~~~ /// - CInstancePVRClient() : IAddonInstance(IInstanceInfo(CPrivateBase::m_interface->firstKodiInstance)) - { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstancePVRClient: Creation of more as one in single " - "instance way is not allowed!"); - - SetAddonStruct(CPrivateBase::m_interface->firstKodiInstance); - CPrivateBase::m_interface->globalSingleInstance = this; - } + CInstancePVRClient() = default; //---------------------------------------------------------------------------- //============================================================================ @@ -502,11 +494,6 @@ class ATTR_DLL_LOCAL CInstancePVRClient : public IAddonInstance /// explicit CInstancePVRClient(const IInstanceInfo& instance) : IAddonInstance(instance) { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstancePVRClient: Creation of multiple together with " - "single instance way is not allowed!"); - - SetAddonStruct(instance); } //---------------------------------------------------------------------------- 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 ea07498d80418..373e2d755d693 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 @@ -215,16 +218,7 @@ class ATTR_DLL_LOCAL CInstancePeripheral : public IAddonInstance /// /// Used by an add-on that only supports peripheral. /// - CInstancePeripheral() - : IAddonInstance(IInstanceInfo(CPrivateBase::m_interface->firstKodiInstance)) - { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstancePeripheral: Creation of more as one in single " - "instance way is not allowed!"); - - SetAddonStruct(CPrivateBase::m_interface->firstKodiInstance); - CPrivateBase::m_interface->globalSingleInstance = this; - } + CInstancePeripheral() = default; //---------------------------------------------------------------------------- //============================================================================ @@ -263,11 +257,7 @@ class ATTR_DLL_LOCAL CInstancePeripheral : public IAddonInstance /// explicit CInstancePeripheral(const IInstanceInfo& instance) : IAddonInstance(instance) { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstancePeripheral: Creation of multiple together with " - "single instance way is not allowed!"); - - SetAddonStruct(instance); + m_kodi = instance.GetKodiHdl(); } //---------------------------------------------------------------------------- @@ -523,7 +513,7 @@ class ATTR_DLL_LOCAL 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::GetAddonPath(); } //---------------------------------------------------------------------------- //============================================================================ @@ -535,7 +525,7 @@ class ATTR_DLL_LOCAL 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(); } //---------------------------------------------------------------------------- //============================================================================ @@ -543,10 +533,7 @@ class ATTR_DLL_LOCAL CInstancePeripheral : public IAddonInstance /// /// The add-on calls this if a change in hardware is detected. /// - void TriggerScan(void) - { - return m_instanceData->toKodi->trigger_scan(m_instanceData->toKodi->kodiInstance); - } + void TriggerScan(void) { return kodi_addon_peripheral_trigger_scan(m_kodi); } //---------------------------------------------------------------------------- //============================================================================ @@ -559,8 +546,8 @@ class ATTR_DLL_LOCAL CInstancePeripheral : public IAddonInstance /// void RefreshButtonMaps(const std::string& deviceName = "", const std::string& controllerId = "") { - return m_instanceData->toKodi->refresh_button_maps(m_instanceData->toKodi->kodiInstance, - deviceName.c_str(), controllerId.c_str()); + return kodi_addon_peripheral_refresh_button_maps(m_kodi, deviceName.c_str(), + controllerId.c_str()); } //---------------------------------------------------------------------------- @@ -576,8 +563,7 @@ class ATTR_DLL_LOCAL 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, - controllerId.c_str(), type); + return kodi_addon_peripheral_feature_count(m_kodi, controllerId.c_str(), type); } //---------------------------------------------------------------------------- @@ -591,64 +577,60 @@ class ATTR_DLL_LOCAL 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, - controllerId.c_str(), featureName.c_str()); + return kodi_addon_peripheral_feature_type(m_kodi, controllerId.c_str(), featureName.c_str()); } //---------------------------------------------------------------------------- ///@} private: - void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) + friend class CAddonBase; + + void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) override { instance->hdl = this; - instance->peripheral->toAddon->get_capabilities = ADDON_GetCapabilities; - instance->peripheral->toAddon->perform_device_scan = ADDON_PerformDeviceScan; - instance->peripheral->toAddon->free_scan_results = ADDON_FreeScanResults; - instance->peripheral->toAddon->get_events = ADDON_GetEvents; - instance->peripheral->toAddon->free_events = ADDON_FreeEvents; - instance->peripheral->toAddon->send_event = ADDON_SendEvent; - - instance->peripheral->toAddon->get_joystick_info = ADDON_GetJoystickInfo; - instance->peripheral->toAddon->free_joystick_info = ADDON_FreeJoystickInfo; - instance->peripheral->toAddon->get_features = ADDON_GetFeatures; - instance->peripheral->toAddon->free_features = ADDON_FreeFeatures; - instance->peripheral->toAddon->map_features = ADDON_MapFeatures; - instance->peripheral->toAddon->get_ignored_primitives = ADDON_GetIgnoredPrimitives; - instance->peripheral->toAddon->free_primitives = ADDON_FreePrimitives; - instance->peripheral->toAddon->set_ignored_primitives = ADDON_SetIgnoredPrimitives; - instance->peripheral->toAddon->save_button_map = ADDON_SaveButtonMap; - instance->peripheral->toAddon->revert_button_map = ADDON_RevertButtonMap; - instance->peripheral->toAddon->reset_button_map = ADDON_ResetButtonMap; - instance->peripheral->toAddon->power_off_joystick = ADDON_PowerOffJoystick; - - m_instanceData = instance->peripheral; - m_instanceData->toAddon->addonInstance = this; + instance->peripheral->get_capabilities = ADDON_GetCapabilities; + instance->peripheral->perform_device_scan = ADDON_PerformDeviceScan; + instance->peripheral->free_scan_results = ADDON_FreeScanResults; + instance->peripheral->get_events = ADDON_GetEvents; + instance->peripheral->free_events = ADDON_FreeEvents; + instance->peripheral->send_event = ADDON_SendEvent; + + instance->peripheral->get_joystick_info = ADDON_GetJoystickInfo; + instance->peripheral->free_joystick_info = ADDON_FreeJoystickInfo; + instance->peripheral->get_features = ADDON_GetFeatures; + instance->peripheral->free_features = ADDON_FreeFeatures; + instance->peripheral->map_features = ADDON_MapFeatures; + instance->peripheral->get_ignored_primitives = ADDON_GetIgnoredPrimitives; + instance->peripheral->free_primitives = ADDON_FreePrimitives; + instance->peripheral->set_ignored_primitives = ADDON_SetIgnoredPrimitives; + instance->peripheral->save_button_map = ADDON_SaveButtonMap; + instance->peripheral->revert_button_map = ADDON_RevertButtonMap; + instance->peripheral->reset_button_map = ADDON_ResetButtonMap; + instance->peripheral->power_off_joystick = ADDON_PowerOffJoystick; } - inline static void ADDON_GetCapabilities(const AddonInstance_Peripheral* addonInstance, +private: + 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) - ->GetCapabilities(peripheralCapabilities); + static_cast(hdl)->GetCapabilities(peripheralCapabilities); } - inline static PERIPHERAL_ERROR ADDON_PerformDeviceScan( - const AddonInstance_Peripheral* addonInstance, - unsigned int* peripheral_count, - PERIPHERAL_INFO** scan_results) + inline static PERIPHERAL_ERROR ADDON_PerformDeviceScan(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) - ->PerformDeviceScan(peripherals); + PERIPHERAL_ERROR err = static_cast(hdl)->PerformDeviceScan(peripherals); if (err == PERIPHERAL_NO_ERROR) { *peripheral_count = static_cast(peripherals.size()); @@ -658,26 +640,25 @@ class ATTR_DLL_LOCAL 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) - ->GetEvents(peripheralEvents); + PERIPHERAL_ERROR err = static_cast(hdl)->GetEvents(peripheralEvents); if (err == PERIPHERAL_NO_ERROR) { *event_count = static_cast(peripheralEvents.size()); @@ -687,35 +668,34 @@ class ATTR_DLL_LOCAL 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, - const PERIPHERAL_EVENT* event) + 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) - ->SendEvent(kodi::addon::PeripheralEvent(*event)); + 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) + inline static PERIPHERAL_ERROR ADDON_GetJoystickInfo(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) - ->GetJoystickInfo(index, addonInfo); + PERIPHERAL_ERROR err = + static_cast(hdl)->GetJoystickInfo(index, addonInfo); if (err == PERIPHERAL_NO_ERROR) { addonInfo.ToStruct(*info); @@ -724,29 +704,28 @@ class ATTR_DLL_LOCAL CInstancePeripheral : public IAddonInstance return err; } - inline static void ADDON_FreeJoystickInfo(const AddonInstance_Peripheral* addonInstance, - JOYSTICK_INFO* info) + 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) - ->GetFeatures(addonJoystick, controller_id, featuresVector); + PERIPHERAL_ERROR err = static_cast(hdl)->GetFeatures( + addonJoystick, controller_id, featuresVector); if (err == PERIPHERAL_NO_ERROR) { *feature_count = static_cast(featuresVector.size()); @@ -756,23 +735,23 @@ class ATTR_DLL_LOCAL 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); @@ -781,24 +760,23 @@ class ATTR_DLL_LOCAL CInstancePeripheral : public IAddonInstance for (unsigned int i = 0; i < feature_count; i++) primitiveVector.emplace_back(*(features + i)); - return static_cast(addonInstance->toAddon->addonInstance) - ->MapFeatures(addonJoystick, controller_id, primitiveVector); + return static_cast(hdl)->MapFeatures(addonJoystick, controller_id, + primitiveVector); } - inline static PERIPHERAL_ERROR ADDON_GetIgnoredPrimitives( - const AddonInstance_Peripheral* addonInstance, - const JOYSTICK_INFO* joystick, - unsigned int* primitive_count, - JOYSTICK_DRIVER_PRIMITIVE** primitives) + inline static PERIPHERAL_ERROR ADDON_GetIgnoredPrimitives(KODI_ADDON_PERIPHERAL_HDL hdl, + const JOYSTICK_INFO* joystick, + 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) - ->GetIgnoredPrimitives(addonJoystick, primitiveVector); + PERIPHERAL_ERROR err = static_cast(hdl)->GetIgnoredPrimitives( + addonJoystick, primitiveVector); if (err == PERIPHERAL_NO_ERROR) { *primitive_count = static_cast(primitiveVector.size()); @@ -808,23 +786,23 @@ class ATTR_DLL_LOCAL 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); @@ -833,55 +811,50 @@ class ATTR_DLL_LOCAL CInstancePeripheral : public IAddonInstance for (unsigned int i = 0; i < primitive_count; i++) primitiveVector.emplace_back(*(primitives + i)); - return static_cast(addonInstance->toAddon->addonInstance) - ->SetIgnoredPrimitives(addonJoystick, primitiveVector); + 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) - ->SaveButtonMap(addonJoystick); + 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) - ->RevertButtonMap(addonJoystick); + 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) - ->ResetButtonMap(addonJoystick, controller_id); + static_cast(hdl)->ResetButtonMap(addonJoystick, controller_id); } - inline static void ADDON_PowerOffJoystick(const AddonInstance_Peripheral* addonInstance, - unsigned int index) + 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_ADDON_INSTANCE_BACKEND_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 1fd36fb40ebb5..b7bf049f75ce5 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,7 @@ #include "../gui/renderHelper.h" #ifdef __cplusplus + namespace kodi { namespace addon @@ -194,14 +195,8 @@ class ATTR_DLL_LOCAL CInstanceScreensaver : public IAddonInstance /// Used by an add-on that only supports screensavers. /// CInstanceScreensaver() - : IAddonInstance(IInstanceInfo(CPrivateBase::m_interface->firstKodiInstance)) { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceScreensaver: Creation of more as one in single " - "instance way is not allowed!"); - - SetAddonStruct(CPrivateBase::m_interface->firstKodiInstance); - CPrivateBase::m_interface->globalSingleInstance = this; + kodi_addon_screensaver_get_properties(m_kodi, &m_props); } //---------------------------------------------------------------------------- @@ -248,11 +243,7 @@ class ATTR_DLL_LOCAL CInstanceScreensaver : public IAddonInstance /// explicit CInstanceScreensaver(const IInstanceInfo& instance) : IAddonInstance(instance) { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceScreensaver: Creation of multiple together " - "with single instance way is not allowed!"); - - SetAddonStruct(instance); + kodi_addon_screensaver_get_properties(m_kodi, &m_props); } //---------------------------------------------------------------------------- @@ -370,14 +361,12 @@ class ATTR_DLL_LOCAL CInstanceScreensaver : public IAddonInstance ///@} private: - void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) + void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) override { instance->hdl = this; - instance->screensaver->toAddon->start = ADDON_start; - instance->screensaver->toAddon->stop = ADDON_stop; - instance->screensaver->toAddon->render = ADDON_render; - - instance->screensaver->toKodi->get_properties(instance->info->kodi, &m_props); + instance->screensaver->start = ADDON_start; + instance->screensaver->stop = ADDON_stop; + instance->screensaver->render = ADDON_render; } inline static bool ADDON_start(const KODI_ADDON_SCREENSAVER_HDL hdl) 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 index 6affffe04609e..047fb56d432a3 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VFS.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VFS.h @@ -30,7 +30,7 @@ class CInstanceVFS; /// places. /// ///@{ -using VFSFileHandle = VFS_FILE_HANDLE; +using VFSFileHandle = KODI_VFS_FILE_HDL; ///@} //------------------------------------------------------------------------------ @@ -47,7 +47,7 @@ using VFSFileHandle = VFS_FILE_HANDLE; /// @copydetails cpp_kodi_addon_vfs_Defs_VFSUrl_Help /// ///@{ -class ATTR_DLL_LOCAL VFSUrl : public CStructHdl +class ATTR_DLL_LOCAL VFSUrl : public CStructHdl { /*! \cond PRIVATE */ friend class CInstanceVFS; @@ -144,8 +144,8 @@ class ATTR_DLL_LOCAL VFSUrl : public CStructHdl private: VFSUrl() = delete; VFSUrl(const VFSUrl& channel) = delete; - VFSUrl(const VFSURL* channel) : CStructHdl(channel) {} - VFSUrl(VFSURL* channel) : CStructHdl(channel) {} + VFSUrl(const KODI_ADDON_VFS_URL* channel) : CStructHdl(channel) {} + VFSUrl(KODI_ADDON_VFS_URL* channel) : CStructHdl(channel) {} }; ///@} //------------------------------------------------------------------------------ @@ -442,14 +442,7 @@ class ATTR_DLL_LOCAL CInstanceVFS : public IAddonInstance /// /// @warning Only use `instance` from the @ref CAddonBase::CreateInstance call. /// - explicit CInstanceVFS(const IInstanceInfo& instance) : IAddonInstance(instance) - { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceVFS: Creation of multiple together with single " - "instance way is not allowed!"); - - SetAddonStruct(instance); - } + explicit CInstanceVFS(const kodi::addon::IInstanceInfo& instance) : IAddonInstance(instance) {} //---------------------------------------------------------------------------- //============================================================================ @@ -804,12 +797,12 @@ class ATTR_DLL_LOCAL CInstanceVFS : public IAddonInstance 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); + bool ret = kodi_addon_vfs_get_dir_cb__get_keyboard_input( + m_instance, m_ctx_cb_hdl, heading.c_str(), &cInput, hiddenInput); if (cInput) { input = cInput; - ::kodi::addon::CPrivateBase::m_interface->toKodi->free_string( - ::kodi::addon::CPrivateBase::m_interface->toKodi->kodiBase, cInput); + free(cInput); } return ret; } @@ -827,8 +820,8 @@ class ATTR_DLL_LOCAL CInstanceVFS : public IAddonInstance 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()); + kodi_addon_vfs_get_dir_cb__set_error_dialog(m_instance, m_ctx_cb_hdl, heading.c_str(), + line1.c_str(), line2.c_str(), line3.c_str()); } /// @ingroup cpp_kodi_addon_vfs_general_cb_GetDirectory @@ -837,13 +830,18 @@ class ATTR_DLL_LOCAL CInstanceVFS : public IAddonInstance /// @param[in] url The URL void RequireAuthentication(const std::string& url) { - m_cb->require_authentication(m_cb->ctx, url.c_str()); + kodi_addon_vfs_get_dir_cb__require_authentication(m_instance, m_ctx_cb_hdl, url.c_str()); } - explicit CVFSCallbacks(const VFSGetDirectoryCallbacks* cb) : m_cb(cb) {} + explicit CVFSCallbacks(const KODI_ADDON_INSTANCE_BACKEND_HDL instance, + const KODI_CTX_CB_HDL ctx_cb_hdl) + : m_instance(instance), m_ctx_cb_hdl(ctx_cb_hdl) + { + } private: - const VFSGetDirectoryCallbacks* m_cb; + const KODI_ADDON_INSTANCE_BACKEND_HDL m_instance; + const KODI_CTX_CB_HDL m_ctx_cb_hdl; }; //---------------------------------------------------------------------------- @@ -900,208 +898,197 @@ class ATTR_DLL_LOCAL CInstanceVFS : public IAddonInstance //@} private: - void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) + void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) override { - m_instanceData = instance; - m_instanceData->hdl = this; - m_instanceData->vfs->toAddon->addonInstance = this; - m_instanceData->vfs->toAddon->open = ADDON_Open; - m_instanceData->vfs->toAddon->open_for_write = ADDON_OpenForWrite; - m_instanceData->vfs->toAddon->read = ADDON_Read; - m_instanceData->vfs->toAddon->write = ADDON_Write; - m_instanceData->vfs->toAddon->seek = ADDON_Seek; - m_instanceData->vfs->toAddon->truncate = ADDON_Truncate; - m_instanceData->vfs->toAddon->get_length = ADDON_GetLength; - m_instanceData->vfs->toAddon->get_position = ADDON_GetPosition; - m_instanceData->vfs->toAddon->get_chunk_size = ADDON_GetChunkSize; - m_instanceData->vfs->toAddon->io_control_get_seek_possible = ADDON_IoControlGetSeekPossible; - m_instanceData->vfs->toAddon->io_control_get_cache_status = ADDON_IoControlGetCacheStatus; - m_instanceData->vfs->toAddon->io_control_set_cache_rate = ADDON_IoControlSetCacheRate; - m_instanceData->vfs->toAddon->io_control_set_retry = ADDON_IoControlSetRetry; - m_instanceData->vfs->toAddon->stat = ADDON_Stat; - m_instanceData->vfs->toAddon->close = ADDON_Close; - m_instanceData->vfs->toAddon->exists = ADDON_Exists; - m_instanceData->vfs->toAddon->clear_out_idle = ADDON_ClearOutIdle; - m_instanceData->vfs->toAddon->disconnect_all = ADDON_DisconnectAll; - m_instanceData->vfs->toAddon->delete_it = ADDON_Delete; - m_instanceData->vfs->toAddon->rename = ADDON_Rename; - m_instanceData->vfs->toAddon->directory_exists = ADDON_DirectoryExists; - m_instanceData->vfs->toAddon->remove_directory = ADDON_RemoveDirectory; - m_instanceData->vfs->toAddon->create_directory = ADDON_CreateDirectory; - m_instanceData->vfs->toAddon->get_directory = ADDON_GetDirectory; - m_instanceData->vfs->toAddon->free_directory = ADDON_FreeDirectory; - m_instanceData->vfs->toAddon->contains_files = ADDON_ContainsFiles; + instance->hdl = this; + instance->vfs->file_open = ADDON_file_open; + instance->vfs->file_open_for_write = ADDON_file_open_for_write; + instance->vfs->file_read = ADDON_file_read; + instance->vfs->file_write = ADDON_file_write; + instance->vfs->file_seek = ADDON_file_seek; + instance->vfs->file_truncate = ADDON_file_truncate; + instance->vfs->file_get_length = ADDON_file_get_length; + instance->vfs->file_get_position = ADDON_file_get_position; + instance->vfs->file_get_chunk_size = ADDON_file_get_chunk_size; + instance->vfs->file_io_control_get_seek_possible = ADDON_file_io_control_get_seek_possible; + instance->vfs->file_io_control_get_cache_status = ADDON_file_io_control_get_cache_status; + instance->vfs->file_io_control_set_cache_rate = ADDON_file_io_control_set_cache_rate; + instance->vfs->file_io_control_set_retry = ADDON_file_io_control_set_retry; + instance->vfs->stat = ADDON_stat; + instance->vfs->file_close = ADDON_file_close; + instance->vfs->exists = ADDON_exists; + instance->vfs->clear_out_idle = ADDON_clear_out_idle; + instance->vfs->disconnect_all = ADDON_disconnect_all; + instance->vfs->delete_it = ADDON_delete; + instance->vfs->rename = ADDON_rename; + instance->vfs->directory_exists = ADDON_directory_exists; + instance->vfs->directory_remove = ADDON_directory_remove; + instance->vfs->directory_create = ADDON_directory_create; + instance->vfs->directory_get = ADDON_directory_get; + instance->vfs->directory_contains_files = ADDON_directory_contains_files; } - inline static VFS_FILE_HANDLE ADDON_Open(const AddonInstance_VFSEntry* instance, - const VFSURL* url) + inline static KODI_VFS_FILE_HDL ADDON_file_open(const KODI_ADDON_VFS_HDL hdl, + const KODI_ADDON_VFS_URL* url) { - return static_cast(instance->toAddon->addonInstance)->Open(url); + return static_cast(hdl)->Open(url); } - inline static VFS_FILE_HANDLE ADDON_OpenForWrite(const AddonInstance_VFSEntry* instance, - const VFSURL* url, - bool overWrite) + inline static KODI_VFS_FILE_HDL ADDON_file_open_for_write(const KODI_ADDON_VFS_HDL hdl, + const KODI_ADDON_VFS_URL* url, + bool overWrite) { - return static_cast(instance->toAddon->addonInstance) - ->OpenForWrite(url, overWrite); + return static_cast(hdl)->OpenForWrite(url, overWrite); } - inline static ssize_t ADDON_Read(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - uint8_t* buffer, - size_t uiBufSize) + inline static ssize_t ADDON_file_read(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + uint8_t* buffer, + size_t uiBufSize) { - return static_cast(instance->toAddon->addonInstance) - ->Read(context, buffer, uiBufSize); + return static_cast(hdl)->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) + inline static ssize_t ADDON_file_write(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + const uint8_t* buffer, + size_t uiBufSize) { - return static_cast(instance->toAddon->addonInstance) - ->Write(context, buffer, uiBufSize); + return static_cast(hdl)->Write(context, buffer, uiBufSize); } - inline static int64_t ADDON_Seek(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - int64_t position, - int whence) + inline static int64_t ADDON_file_seek(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + int64_t position, + int whence) { - return static_cast(instance->toAddon->addonInstance) - ->Seek(context, position, whence); + return static_cast(hdl)->Seek(context, position, whence); } - inline static int ADDON_Truncate(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - int64_t size) + inline static int ADDON_file_truncate(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + int64_t size) { - return static_cast(instance->toAddon->addonInstance)->Truncate(context, size); + return static_cast(hdl)->Truncate(context, size); } - inline static int64_t ADDON_GetLength(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context) + inline static int64_t ADDON_file_get_length(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context) { - return static_cast(instance->toAddon->addonInstance)->GetLength(context); + return static_cast(hdl)->GetLength(context); } - inline static int64_t ADDON_GetPosition(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context) + inline static int64_t ADDON_file_get_position(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context) { - return static_cast(instance->toAddon->addonInstance)->GetPosition(context); + return static_cast(hdl)->GetPosition(context); } - inline static int ADDON_GetChunkSize(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context) + inline static int ADDON_file_get_chunk_size(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context) { - return static_cast(instance->toAddon->addonInstance)->GetChunkSize(context); + return static_cast(hdl)->GetChunkSize(context); } - inline static bool ADDON_IoControlGetSeekPossible(const AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context) + inline static bool ADDON_file_io_control_get_seek_possible(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context) { - return static_cast(instance->toAddon->addonInstance) - ->IoControlGetSeekPossible(context); + return static_cast(hdl)->IoControlGetSeekPossible(context); } - inline static bool ADDON_IoControlGetCacheStatus(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - VFS_CACHE_STATUS_DATA* status) + inline static bool ADDON_file_io_control_get_cache_status(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + VFS_CACHE_STATUS* status) { kodi::vfs::CacheStatus cppStatus(status); - return static_cast(instance->toAddon->addonInstance) - ->IoControlGetCacheStatus(context, cppStatus); + return static_cast(hdl)->IoControlGetCacheStatus(context, cppStatus); } - inline static bool ADDON_IoControlSetCacheRate(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - uint32_t rate) + inline static bool ADDON_file_io_control_set_cache_rate(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + uint32_t rate) { - return static_cast(instance->toAddon->addonInstance) - ->IoControlSetCacheRate(context, rate); + return static_cast(hdl)->IoControlSetCacheRate(context, rate); } - inline static bool ADDON_IoControlSetRetry(const struct AddonInstance_VFSEntry* instance, - VFS_FILE_HANDLE context, - bool retry) + inline static bool ADDON_file_io_control_set_retry(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + bool retry) { - return static_cast(instance->toAddon->addonInstance) - ->IoControlSetRetry(context, retry); + return static_cast(hdl)->IoControlSetRetry(context, retry); } - inline static int ADDON_Stat(const AddonInstance_VFSEntry* instance, - const VFSURL* url, - struct STAT_STRUCTURE* buffer) + inline static int ADDON_stat(const KODI_ADDON_VFS_HDL hdl, + const KODI_ADDON_VFS_URL* url, + struct VFS_STAT_STRUCTURE* buffer) { kodi::vfs::FileStatus cppBuffer(buffer); - return static_cast(instance->toAddon->addonInstance)->Stat(url, cppBuffer); + return static_cast(hdl)->Stat(url, cppBuffer); } - inline static bool ADDON_Close(const AddonInstance_VFSEntry* instance, VFS_FILE_HANDLE context) + inline static bool ADDON_file_close(const KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context) { - return static_cast(instance->toAddon->addonInstance)->Close(context); + return static_cast(hdl)->Close(context); } - inline static bool ADDON_Exists(const AddonInstance_VFSEntry* instance, const VFSURL* url) + inline static bool ADDON_exists(const KODI_ADDON_VFS_HDL hdl, const KODI_ADDON_VFS_URL* url) { - return static_cast(instance->toAddon->addonInstance)->Exists(url); + return static_cast(hdl)->Exists(url); } - inline static void ADDON_ClearOutIdle(const AddonInstance_VFSEntry* instance) + inline static void ADDON_clear_out_idle(const KODI_ADDON_VFS_HDL hdl) { - return static_cast(instance->toAddon->addonInstance)->ClearOutIdle(); + return static_cast(hdl)->ClearOutIdle(); } - inline static void ADDON_DisconnectAll(const AddonInstance_VFSEntry* instance) + inline static void ADDON_disconnect_all(const KODI_ADDON_VFS_HDL hdl) { - return static_cast(instance->toAddon->addonInstance)->DisconnectAll(); + return static_cast(hdl)->DisconnectAll(); } - inline static bool ADDON_Delete(const AddonInstance_VFSEntry* instance, const VFSURL* url) + inline static bool ADDON_delete(const KODI_ADDON_VFS_HDL hdl, const KODI_ADDON_VFS_URL* url) { - return static_cast(instance->toAddon->addonInstance)->Delete(url); + return static_cast(hdl)->Delete(url); } - inline static bool ADDON_Rename(const AddonInstance_VFSEntry* instance, - const VFSURL* url, - const VFSURL* url2) + inline static bool ADDON_rename(const KODI_ADDON_VFS_HDL hdl, + const KODI_ADDON_VFS_URL* url, + const KODI_ADDON_VFS_URL* url2) { - return static_cast(instance->toAddon->addonInstance)->Rename(url, url2); + return static_cast(hdl)->Rename(url, url2); } - inline static bool ADDON_DirectoryExists(const AddonInstance_VFSEntry* instance, - const VFSURL* url) + inline static bool ADDON_directory_exists(const KODI_ADDON_VFS_HDL hdl, + const KODI_ADDON_VFS_URL* url) { - return static_cast(instance->toAddon->addonInstance)->DirectoryExists(url); + return static_cast(hdl)->DirectoryExists(url); } - inline static bool ADDON_RemoveDirectory(const AddonInstance_VFSEntry* instance, - const VFSURL* url) + inline static bool ADDON_directory_remove(const KODI_ADDON_VFS_HDL hdl, + const KODI_ADDON_VFS_URL* url) { - return static_cast(instance->toAddon->addonInstance)->RemoveDirectory(url); + return static_cast(hdl)->RemoveDirectory(url); } - inline static bool ADDON_CreateDirectory(const AddonInstance_VFSEntry* instance, - const VFSURL* url) + inline static bool ADDON_directory_create(const KODI_ADDON_VFS_HDL hdl, + const KODI_ADDON_VFS_URL* url) { - return static_cast(instance->toAddon->addonInstance)->CreateDirectory(url); + return static_cast(hdl)->CreateDirectory(url); } - inline static bool ADDON_GetDirectory(const AddonInstance_VFSEntry* instance, - const VFSURL* url, - VFSDirEntry** retEntries, - int* num_entries, - VFSGetDirectoryCallbacks* callbacks) + inline static bool ADDON_directory_get(const KODI_ADDON_VFS_HDL hdl, + const KODI_ADDON_VFS_URL* url, + VFS_DIR_ENTRY** retEntries, + size_t* num_entries, + KODI_CTX_CB_HDL ctx_cb_hdl) { std::vector addonEntries; - bool ret = static_cast(instance->toAddon->addonInstance) - ->GetDirectory(url, addonEntries, CVFSCallbacks(callbacks)); + bool ret = static_cast(hdl)->GetDirectory(url, addonEntries, + CVFSCallbacks(hdl, ctx_cb_hdl)); if (ret) { - VFSDirEntry* entries = - static_cast(malloc(sizeof(VFSDirEntry) * addonEntries.size())); + VFS_DIR_ENTRY* entries = + static_cast(malloc(sizeof(VFS_DIR_ENTRY) * addonEntries.size())); for (unsigned int i = 0; i < addonEntries.size(); ++i) { entries[i].label = strdup(addonEntries[i].Label().c_str()); @@ -1116,7 +1103,7 @@ class ATTR_DLL_LOCAL CInstanceVFS : public IAddonInstance if (!props.empty()) { entries[i].properties = - static_cast(malloc(sizeof(VFSProperty) * props.size())); + static_cast(malloc(sizeof(VFS_PROPERTY) * props.size())); for (const auto& prop : props) { entries[i].properties[entries[i].num_props].name = strdup(prop.first.c_str()); @@ -1133,44 +1120,19 @@ class ATTR_DLL_LOCAL CInstanceVFS : public IAddonInstance 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) + inline static bool ADDON_directory_contains_files(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url, + struct VFS_DIR_ENTRY** retEntries, + size_t* num_entries, + char** rootpath) { std::string cppRootPath; std::vector addonEntries; - bool ret = static_cast(instance->toAddon->addonInstance) - ->ContainsFiles(url, addonEntries, cppRootPath); + bool ret = static_cast(hdl)->ContainsFiles(url, addonEntries, cppRootPath); if (ret) { - strncpy(rootpath, cppRootPath.c_str(), ADDON_STANDARD_STRING_LENGTH); - - VFSDirEntry* entries = - static_cast(malloc(sizeof(VFSDirEntry) * addonEntries.size())); + VFS_DIR_ENTRY* entries = + static_cast(malloc(sizeof(VFS_DIR_ENTRY) * addonEntries.size())); for (size_t i = 0; i < addonEntries.size(); ++i) { entries[i].label = strdup(addonEntries[i].Label().c_str()); @@ -1185,7 +1147,7 @@ class ATTR_DLL_LOCAL CInstanceVFS : public IAddonInstance if (!props.empty()) { entries[i].properties = - static_cast(malloc(sizeof(VFSProperty) * props.size())); + static_cast(malloc(sizeof(VFS_PROPERTY) * props.size())); for (const auto& prop : props) { entries[i].properties[entries[i].num_props].name = strdup(prop.first.c_str()); @@ -1196,13 +1158,13 @@ class ATTR_DLL_LOCAL CInstanceVFS : public IAddonInstance else entries[i].properties = nullptr; } + + *rootpath = strdup(cppRootPath.c_str()); *retEntries = entries; - *num_entries = static_cast(addonEntries.size()); + *num_entries = addonEntries.size(); } return ret; } - - KODI_ADDON_INSTANCE_STRUCT* m_instanceData{nullptr}; }; } /* namespace addon */ 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 index 06f0fc85a61ca..1b28df5147683 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VideoCodec.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/VideoCodec.h @@ -259,11 +259,6 @@ class ATTR_DLL_LOCAL CInstanceVideoCodec : public IAddonInstance /// explicit CInstanceVideoCodec(const IInstanceInfo& instance) : IAddonInstance(instance) { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceVideoCodec: Creation of multiple together with " - "single instance way is not allowed!"); - - SetAddonStruct(instance); } //---------------------------------------------------------------------------- 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 index b058344c32e7a..9432385a25910 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Visualization.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Visualization.h @@ -13,11 +13,13 @@ #include "../gui/renderHelper.h" #ifdef __cplusplus + namespace kodi { namespace addon { +#include //============================================================================== /// @defgroup cpp_kodi_addon_visualization_Defs_VisualizationTrack class VisualizationTrack @@ -170,7 +172,7 @@ class VisualizationTrack ///@} private: - VisualizationTrack(const VIS_TRACK* tag) + VisualizationTrack(const KODI_ADDON_VISUALIZATION_TRACK* tag) { if (!tag) return; @@ -396,16 +398,7 @@ class ATTR_DLL_LOCAL CInstanceVisualization : public IAddonInstance /// /// Used by an add-on that only supports visualizations. /// - CInstanceVisualization() - : IAddonInstance(IInstanceInfo(CPrivateBase::m_interface->firstKodiInstance)) - { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error( - "kodi::addon::CInstanceVisualization: Cannot create multiple instances of add-on."); - - SetAddonStruct(CPrivateBase::m_interface->firstKodiInstance); - CPrivateBase::m_interface->globalSingleInstance = this; - } + CInstanceVisualization() = default; //---------------------------------------------------------------------------- //========================================================================== @@ -448,11 +441,7 @@ class ATTR_DLL_LOCAL CInstanceVisualization : public IAddonInstance /// explicit CInstanceVisualization(const IInstanceInfo& instance) : IAddonInstance(instance) { - if (CPrivateBase::m_interface->globalSingleInstance != nullptr) - throw std::logic_error("kodi::addon::CInstanceVisualization: Creation of multiple together " - "with single instance way is not allowed!"); - - SetAddonStruct(instance); + kodi_addon_visualization_get_properties(m_kodi, &m_props); } //---------------------------------------------------------------------------- @@ -493,18 +482,13 @@ class ATTR_DLL_LOCAL CInstanceVisualization : public IAddonInstance /// /// @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) + int audioDataLength) { } //---------------------------------------------------------------------------- @@ -529,21 +513,13 @@ class ATTR_DLL_LOCAL CInstanceVisualization : public IAddonInstance //============================================================================ /// @ingroup cpp_kodi_addon_visualization /// @brief Used to get the number of buffers from the current visualization. + + /// @return syncDelay The number of buffers to delay before calling + /// @ref AudioData() /// - /// @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. + /// @note If this function is not implemented, it will default to 0. /// - virtual void GetInfo(bool& wantsFreq, int& syncDelay) - { - wantsFreq = false; - syncDelay = 0; - } + virtual int GetSyncDelay() { return 0; } //---------------------------------------------------------------------------- //============================================================================ @@ -708,11 +684,9 @@ class ATTR_DLL_LOCAL CInstanceVisualization : public IAddonInstance /// inline void TransferPresets(const std::vector& presets) { - m_instanceData->visualization->toKodi->clear_presets( - m_instanceData->visualization->toKodi->kodiInstance); + kodi_addon_visualization_clear_presets(GetInfo().GetKodiHdl()); for (const auto& it : presets) - m_instanceData->visualization->toKodi->transfer_preset( - m_instanceData->visualization->toKodi->kodiInstance, it.c_str()); + kodi_addon_visualization_transfer_preset(GetInfo().GetKodiHdl(), it.c_str()); } //---------------------------------------------------------------------------- @@ -737,7 +711,7 @@ class ATTR_DLL_LOCAL CInstanceVisualization : public IAddonInstance /// .. /// ~~~~~~~~~~~~~ /// - inline kodi::HardwareContext Device() { return m_instanceData->visualization->props->device; } + inline kodi::HardwareContext Device() { return m_props.props->device; } //---------------------------------------------------------------------------- //============================================================================ @@ -746,7 +720,7 @@ class ATTR_DLL_LOCAL CInstanceVisualization : public IAddonInstance /// /// @return The X position, in pixels /// - inline int X() { return m_instanceData->visualization->props->x; } + inline int X() { return m_props.props->x; } //---------------------------------------------------------------------------- //============================================================================ @@ -755,7 +729,7 @@ class ATTR_DLL_LOCAL CInstanceVisualization : public IAddonInstance /// /// @return The Y position, in pixels /// - inline int Y() { return m_instanceData->visualization->props->y; } + inline int Y() { return m_props.props->y; } //---------------------------------------------------------------------------- //============================================================================ @@ -764,7 +738,7 @@ class ATTR_DLL_LOCAL CInstanceVisualization : public IAddonInstance /// /// @return The width, in pixels /// - inline int Width() { return m_instanceData->visualization->props->width; } + inline int Width() { return m_props.props->width; } //---------------------------------------------------------------------------- //============================================================================ @@ -773,7 +747,7 @@ class ATTR_DLL_LOCAL CInstanceVisualization : public IAddonInstance /// /// @return The height, in pixels /// - inline int Height() { return m_instanceData->visualization->props->height; } + inline int Height() { return m_props.props->height; } //---------------------------------------------------------------------------- //============================================================================ @@ -783,106 +757,67 @@ class ATTR_DLL_LOCAL CInstanceVisualization : public IAddonInstance /// /// @return The pixel aspect ratio used by the display /// - inline float PixelRatio() { return m_instanceData->visualization->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->visualization->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->visualization->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->visualization->props->profile; } + inline float PixelRatio() { return m_props.props->pixelRatio; } //---------------------------------------------------------------------------- ///@} private: - void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) + void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) override { - m_instanceData = instance; - m_instanceData->hdl = this; - m_instanceData->visualization->toAddon->addonInstance = this; - m_instanceData->visualization->toAddon->start = ADDON_Start; - m_instanceData->visualization->toAddon->stop = ADDON_Stop; - m_instanceData->visualization->toAddon->audio_data = ADDON_AudioData; - m_instanceData->visualization->toAddon->is_dirty = ADDON_IsDirty; - m_instanceData->visualization->toAddon->render = ADDON_Render; - m_instanceData->visualization->toAddon->get_info = ADDON_GetInfo; - m_instanceData->visualization->toAddon->prev_preset = ADDON_PrevPreset; - m_instanceData->visualization->toAddon->next_preset = ADDON_NextPreset; - m_instanceData->visualization->toAddon->load_preset = ADDON_LoadPreset; - m_instanceData->visualization->toAddon->random_preset = ADDON_RandomPreset; - m_instanceData->visualization->toAddon->lock_preset = ADDON_LockPreset; - m_instanceData->visualization->toAddon->rate_preset = ADDON_RatePreset; - m_instanceData->visualization->toAddon->update_albumart = ADDON_UpdateAlbumart; - m_instanceData->visualization->toAddon->update_track = ADDON_UpdateTrack; - m_instanceData->visualization->toAddon->get_presets = ADDON_GetPresets; - m_instanceData->visualization->toAddon->get_active_preset = ADDON_GetActivePreset; - m_instanceData->visualization->toAddon->is_locked = ADDON_IsLocked; + instance->hdl = this; + instance->visualization->start = ADDON_start; + instance->visualization->stop = ADDON_stop; + instance->visualization->audio_data = ADDON_audio_data; + instance->visualization->is_dirty = ADDON_is_dirty; + instance->visualization->render = ADDON_render; + instance->visualization->get_sync_delay = ADDON_get_sync_delay; + instance->visualization->prev_preset = ADDON_prev_preset; + instance->visualization->next_preset = ADDON_next_preset; + instance->visualization->load_preset = ADDON_load_preset; + instance->visualization->random_preset = ADDON_random_preset; + instance->visualization->lock_preset = ADDON_lock_preset; + instance->visualization->rate_preset = ADDON_rate_preset; + instance->visualization->update_albumart = ADDON_update_albumart; + instance->visualization->update_track = ADDON_update_track; + instance->visualization->get_presets = ADDON_get_presets; + instance->visualization->get_active_preset = ADDON_get_active_preset; + instance->visualization->is_locked = ADDON_is_locked; } - inline static bool ADDON_Start(const AddonInstance_Visualization* addon, + inline static bool ADDON_start(const KODI_ADDON_VISUALIZATION_HDL hdl, int channels, int samplesPerSec, int bitsPerSample, const char* songName) { - CInstanceVisualization* thisClass = - static_cast(addon->toAddon->addonInstance); + CInstanceVisualization* thisClass = static_cast(hdl); thisClass->m_renderHelper = kodi::gui::GetRenderHelper(); return thisClass->Start(channels, samplesPerSec, bitsPerSample, songName); } - inline static void ADDON_Stop(const AddonInstance_Visualization* addon) + inline static void ADDON_stop(const KODI_ADDON_VISUALIZATION_HDL hdl) { - CInstanceVisualization* thisClass = - static_cast(addon->toAddon->addonInstance); + CInstanceVisualization* thisClass = static_cast(hdl); thisClass->Stop(); thisClass->m_renderHelper = nullptr; } - inline static void ADDON_AudioData(const AddonInstance_Visualization* addon, + inline static void ADDON_audio_data(const KODI_ADDON_VISUALIZATION_HDL hdl, const float* audioData, - int audioDataLength, - float* freqData, - int freqDataLength) + int audioDataLength) { - static_cast(addon->toAddon->addonInstance) - ->AudioData(audioData, audioDataLength, freqData, freqDataLength); + static_cast(hdl)->AudioData(audioData, audioDataLength); } - inline static bool ADDON_IsDirty(const AddonInstance_Visualization* addon) + inline static bool ADDON_is_dirty(const KODI_ADDON_VISUALIZATION_HDL hdl) { - return static_cast(addon->toAddon->addonInstance)->IsDirty(); + return static_cast(hdl)->IsDirty(); } - inline static void ADDON_Render(const AddonInstance_Visualization* addon) + inline static void ADDON_render(const KODI_ADDON_VISUALIZATION_HDL hdl) { - CInstanceVisualization* thisClass = - static_cast(addon->toAddon->addonInstance); + CInstanceVisualization* thisClass = static_cast(hdl); if (!thisClass->m_renderHelper) return; thisClass->m_renderHelper->Begin(); @@ -890,90 +825,82 @@ class ATTR_DLL_LOCAL CInstanceVisualization : public IAddonInstance thisClass->m_renderHelper->End(); } - inline static void ADDON_GetInfo(const AddonInstance_Visualization* addon, VIS_INFO* info) + inline static int ADDON_get_sync_delay(const KODI_ADDON_VISUALIZATION_HDL hdl) { - static_cast(addon->toAddon->addonInstance) - ->GetInfo(info->bWantsFreq, info->iSyncDelay); + return static_cast(hdl)>GetSyncDelay(); } - inline static unsigned int ADDON_GetPresets(const AddonInstance_Visualization* addon) + inline static unsigned int ADDON_get_presets(const KODI_ADDON_VISUALIZATION_HDL hdl) { - CInstanceVisualization* thisClass = - static_cast(addon->toAddon->addonInstance); + CInstanceVisualization* thisClass = static_cast(hdl); std::vector presets; if (thisClass->GetPresets(presets)) { for (const auto& it : presets) - thisClass->m_instanceData->visualization->toKodi->transfer_preset( - addon->toKodi->kodiInstance, it.c_str()); + kodi_addon_visualization_transfer_preset(GetInfo().GetKodiHdl(), it.c_str()); } return static_cast(presets.size()); } - inline static int ADDON_GetActivePreset(const AddonInstance_Visualization* addon) + inline static int ADDON_get_active_preset(const KODI_ADDON_VISUALIZATION_HDL hdl) { - return static_cast(addon->toAddon->addonInstance)->GetActivePreset(); + return static_cast(hdl)->GetActivePreset(); } - inline static bool ADDON_PrevPreset(const AddonInstance_Visualization* addon) + inline static bool ADDON_prev_preset(const KODI_ADDON_VISUALIZATION_HDL hdl) { - return static_cast(addon->toAddon->addonInstance)->PrevPreset(); + return static_cast(hdl)->PrevPreset(); } - inline static bool ADDON_NextPreset(const AddonInstance_Visualization* addon) + inline static bool ADDON_next_preset(const KODI_ADDON_VISUALIZATION_HDL hdl) { - return static_cast(addon->toAddon->addonInstance)->NextPreset(); + return static_cast(hdl)->NextPreset(); } - inline static bool ADDON_LoadPreset(const AddonInstance_Visualization* addon, int select) - + inline static bool ADDON_load_preset(const KODI_ADDON_VISUALIZATION_HDL hdl, int select) { - return static_cast(addon->toAddon->addonInstance)->LoadPreset(select); + return static_cast(hdl)->LoadPreset(select); } - inline static bool ADDON_RandomPreset(const AddonInstance_Visualization* addon) + inline static bool ADDON_random_preset(const KODI_ADDON_VISUALIZATION_HDL hdl) { - return static_cast(addon->toAddon->addonInstance)->RandomPreset(); + return static_cast(hdl)->RandomPreset(); } - inline static bool ADDON_LockPreset(const AddonInstance_Visualization* addon) + inline static bool ADDON_lock_preset(const KODI_ADDON_VISUALIZATION_HDL hdl) { - CInstanceVisualization* thisClass = - static_cast(addon->toAddon->addonInstance); + CInstanceVisualization* thisClass = static_cast(hdl); thisClass->m_presetLockedByUser = !thisClass->m_presetLockedByUser; return thisClass->LockPreset(thisClass->m_presetLockedByUser); } - inline static bool ADDON_RatePreset(const AddonInstance_Visualization* addon, bool plus_minus) + inline static bool ADDON_rate_preset(const KODI_ADDON_VISUALIZATION_HDL hdl, bool plus_minus) { - return static_cast(addon->toAddon->addonInstance) - ->RatePreset(plus_minus); + return static_cast(hdl)->RatePreset(plus_minus); } - inline static bool ADDON_IsLocked(const AddonInstance_Visualization* addon) + inline static bool ADDON_is_locked(const KODI_ADDON_VISUALIZATION_HDL hdl) { - return static_cast(addon->toAddon->addonInstance)->IsLocked(); + return static_cast(hdl)->IsLocked(); } - inline static bool ADDON_UpdateAlbumart(const AddonInstance_Visualization* addon, + inline static bool ADDON_update_albumart(const KODI_ADDON_VISUALIZATION_HDL hdl, const char* albumart) { - return static_cast(addon->toAddon->addonInstance) - ->UpdateAlbumart(albumart); + return static_cast(hdl)->UpdateAlbumart(albumart); } - inline static bool ADDON_UpdateTrack(const AddonInstance_Visualization* addon, - const VIS_TRACK* track) + inline static bool ADDON_update_track(const KODI_ADDON_VISUALIZATION_HDL hdl, + const KODI_ADDON_VISUALIZATION_TRACK* track) { VisualizationTrack cppTrack(track); - return static_cast(addon->toAddon->addonInstance) - ->UpdateTrack(cppTrack); + return static_cast(hdl)->UpdateTrack(cppTrack); } std::shared_ptr m_renderHelper; - bool m_presetLockedByUser = false; - KODI_ADDON_INSTANCE_STRUCT* m_instanceData{nullptr}; + + KODI_ADDON_VISUALIZATION_PROPS m_props = {}; }; } /* namespace addon */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Web.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Web.h new file mode 100644 index 0000000000000..255c54ac7bdea --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Web.h @@ -0,0 +1,474 @@ +/* + * 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 "../AddonBase.h" +#include "../c-api/addon-instance/web.h" +#include "../gui/input/Action.h" + +#ifdef __cplusplus + +#include + +namespace kodi +{ +namespace addon +{ + +class CInstanceWeb; + +struct WEB_CONTROL_HANDLE +{ + KODI_ADDON_WEB_HDL kodi; + struct WEB_ADDON_GUI_PROPS props; + CInstanceWeb* addonWebBase; +}; + +class CWebControl; +class CInstanceWeb; + +using WebControlHdl = KODI_HANDLE; + +class ATTR_DLL_LOCAL WebKeyboardInputEvent + : public CStructHdl +{ + /*! \cond PRIVATE */ + friend class CWebControl; + friend class CInstanceWeb; + /*! \endcond */ + +public: + std::string GetControllerId() const { return m_cStructure->controller_id; } + std::string GetFeatureName() const { return m_cStructure->feature_name; } + bool GetPressed() const { return m_cStructure->pressed; } + uint32_t GetUnicode() const { return m_cStructure->unicode; } + WEB_KEY_MOD GetModifiers() const { return m_cStructure->modifiers; } + +private: + WebKeyboardInputEvent(const WEB_KEYBOARD_INPUT_EVENT* tag) : CStructHdl(tag) {} + WebKeyboardInputEvent(WEB_KEYBOARD_INPUT_EVENT* tag) : CStructHdl(tag) {} + WebKeyboardInputEvent() = delete; + WebKeyboardInputEvent(const WebKeyboardInputEvent& tag) = delete; +}; + +class ATTR_DLL_LOCAL CWebControl +{ +public: + CWebControl(kodi::addon::CInstanceWeb* instance, + const kodi::addon::WebControlHdl handle) + : m_instance(instance), m_handle(*static_cast(handle)) + { + } + + virtual ~CWebControl() = default; + + virtual bool RenderInit() { return false; } + virtual void RenderDeinit() {} + virtual void Render() {} + virtual bool Dirty() { return false; } + virtual bool OnInit() { return false; } + virtual bool OnAction(const gui::input::CAction& action, int& nextItem) { return false; } + virtual bool OnMouseEvent(int id, double x, double y, double offsetX, double offsetY, int state) + { + return false; + } + virtual bool OpenWebsite(const std::string& url) { return false; } + virtual bool GetHistory(std::vector& historyWebsiteNames, bool behindCurrent) + { + return false; + } + virtual void SearchText(const std::string& text, bool forward, bool matchCase, bool findNext) {} + virtual void StopSearch(bool clearSelection) {} + virtual void Reload() {} + virtual void StopLoad() {} + virtual void GoBack() {} + virtual void GoForward() {} + virtual void OpenOwnContextMenu() {} + virtual void ScreenSizeChange(float x, float y, float width, float height, bool fullscreen) {} + + inline void SetControlReady(bool ready) + { + kodi_addon_web_control_set_control_ready(m_handle.kodi, m_handle.props.pControlIdent, + ready); + } + + inline void SetOpenedAddress(const std::string& title) + { + kodi_addon_web_control_set_opened_address(m_handle.kodi, m_handle.props.pControlIdent, + title.c_str()); + } + + inline void SetOpenedTitle(const std::string& title) + { + kodi_addon_web_control_set_opened_title(m_handle.kodi, m_handle.props.pControlIdent, + title.c_str()); + } + + inline void SetIconURL(const std::string& icon) + { + kodi_addon_web_control_set_icon_url(m_handle.kodi, m_handle.props.pControlIdent, icon.c_str()); + } + + inline void SetFullscreen(bool fullscreen) + { + kodi_addon_web_control_set_fullscreen(m_handle.kodi, m_handle.props.pControlIdent, fullscreen); + } + + inline void SetLoadingState(bool isLoading, bool canGoBack, bool canGoForward) + { + kodi_addon_web_control_set_loading_state(m_handle.kodi, m_handle.props.pControlIdent, isLoading, + canGoBack, canGoForward); + } + + inline void SetTooltip(const std::string& tooltip) + { + kodi_addon_web_control_set_tooltip(m_handle.kodi, m_handle.props.pControlIdent, + tooltip.c_str()); + } + + inline void SetStatusMessage(const std::string& status) + { + kodi_addon_web_control_set_status_message(m_handle.kodi, m_handle.props.pControlIdent, + status.c_str()); + } + + inline void RequestOpenSiteInNewTab(const std::string& url) + { + kodi_addon_web_control_request_open_site_in_new_tab(m_handle.kodi, m_handle.props.pControlIdent, + url.c_str()); + } + + std::string GetName() const { return m_handle.props.strName; } + virtual void* GetDevice() const { return m_handle.props.pDevice; } + virtual float GetXPos() const { return m_handle.props.fXPos; } + virtual float GetYPos() const { return m_handle.props.fYPos; } + virtual float GetWidth() const { return m_handle.props.fWidth; } + virtual float GetHeight() const { return m_handle.props.fHeight; } + virtual float GetPixelRatio() const { return m_handle.props.fPixelRatio; } + virtual float GetFPS() const { return m_handle.props.fFPS; } + virtual float GetSkinXPos() const { return m_handle.props.fSkinXPos; } + virtual float GetSkinYPos() const { return m_handle.props.fSkinYPos; } + virtual float GetSkinWidth() const { return m_handle.props.fSkinWidth; } + virtual float GetSkinHeight() const { return m_handle.props.fSkinHeight; } + virtual bool UseTransparentBackground() const + { + return m_handle.props.bUseTransparentBackground; + } + virtual uint32_t GetBackgroundColorARGB() const { return m_handle.props.iBackgroundColorARGB; } + int GetGUIItemLeft() const { return m_handle.props.iGUIItemLeft; } + int GetGUIItemRight() const { return m_handle.props.iGUIItemRight; } + int GetGUIItemTop() const { return m_handle.props.iGUIItemTop; } + int GetGUIItemBottom() const { return m_handle.props.iGUIItemBottom; } + int GetGUIItemBack() const { return m_handle.props.iGUIItemBack; } + +private: + CInstanceWeb* m_instance{nullptr}; + + WEB_CONTROL_HANDLE m_handle; +}; + +class ATTR_DLL_LOCAL CInstanceWeb : public IAddonInstance +{ +public: + //========================================================================== + /// + /// @ingroup cpp_kodi_addon_web + /// @brief Web addon class constructor + /// + /// Used by an add-on that only supports web browser. + /// + CInstanceWeb() = default; + //-------------------------------------------------------------------------- + + CInstanceWeb(const kodi::addon::IInstanceInfo& instance) + : IAddonInstance(instance) + { + } + + virtual ~CInstanceWeb() = default; + + virtual bool MainInitialize() { return false; } + + virtual void MainLoop() {} + + virtual void MainShutdown() {} + + virtual WEB_ADDON_ERROR StartInstance() { return WEB_ADDON_ERROR_NO_ERROR; } + virtual void StopInstance() {} + + virtual void SetMute(bool mute) {} + virtual bool SetLanguage(const std::string& language) { return false; } + + inline void InhibitShutdown(bool inhibit) { kodi_addon_web_inhibit_shutdown(m_kodi, inhibit); } + + inline void InhibitScreensaver(bool inhibit) + { + kodi_addon_web_inhibit_screensaver(m_kodi, inhibit); + } + + virtual WEB_ADDON_ERROR CreateControl(const std::string& sourceName, + const std::string& startURL, + const kodi::addon::WebControlHdl controlHdl, + kodi::addon::CWebControl*& control) + { + return WEB_ADDON_ERROR_NOT_IMPLEMENTED; + } + + virtual enum WEB_ADDON_ERROR DestroyControl(kodi::addon::CWebControl* control, bool complete) { return WEB_ADDON_ERROR_NOT_IMPLEMENTED; } + + inline bool IsMuted() const { return kodi_addon_web_is_muted(m_kodi); } + +private: + void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance) override + { + instance->hdl = this; + instance->web->main_initialize = main_initialize; + instance->web->main_loop = main_loop; + instance->web->main_shutdown = main_shutdown; + instance->web->start_instance = start_instance; + instance->web->stop_instance = stop_instance; + instance->web->set_mute = set_mute; + instance->web->set_language = set_language; + instance->web->create_control = create_control; + instance->web->destroy_control = destroy_control; + instance->web->control_render_init = control_render_init; + instance->web->control_render_deinit = control_render_deinit; + instance->web->control_render = control_render; + instance->web->control_dirty = control_dirty; + instance->web->control_on_init = control_on_init; + instance->web->control_on_action = control_on_action; + instance->web->control_on_mouse_event = control_on_mouse_event; + instance->web->control_open_website = control_open_website; + instance->web->control_get_history = control_get_history; + instance->web->control_search_text = control_search_text; + instance->web->control_stop_search = control_stop_search; + instance->web->control_web_cmd_reload = control_web_cmd_reload; + instance->web->control_web_cmd_stop_load = control_web_cmd_stop_load; + instance->web->control_web_cmd_nav_back = control_web_cmd_nav_back; + instance->web->control_web_cmd_nav_forward = control_web_cmd_nav_forward; + instance->web->control_web_open_own_context_menu = control_web_open_own_context_menu; + instance->web->control_screen_size_change = control_screen_size_change; + } + + friend class CWebControl; + + inline static bool main_initialize(const KODI_ADDON_WEB_HDL hdl) + { + return static_cast(hdl)->MainInitialize(); + } + + inline static void main_loop(const KODI_ADDON_WEB_HDL hdl) + { + static_cast(hdl)->MainLoop(); + } + + inline static void main_shutdown(const KODI_ADDON_WEB_HDL hdl) + { + static_cast(hdl)->MainShutdown(); + } + + inline static WEB_ADDON_ERROR start_instance(const KODI_ADDON_WEB_HDL hdl) + { + return static_cast(hdl)->StartInstance(); + } + + inline static void stop_instance(const KODI_ADDON_WEB_HDL hdl) + { + static_cast(hdl)->StopInstance(); + } + + inline static void set_mute(const KODI_ADDON_WEB_HDL hdl, bool mute) + { + static_cast(hdl)->SetMute(mute); + } + + inline static bool set_language(const KODI_ADDON_WEB_HDL hdl, const char* language) + { + return static_cast(hdl)->SetLanguage(language); + } + + inline static WEB_ADDON_ERROR create_control(const KODI_ADDON_WEB_HDL hdl, + const WEB_ADDON_GUI_PROPS* props, + const char* start_url, + KODI_ADDON_WEB_CONTROL_HDL* handle) + { + CInstanceWeb* const instance = static_cast(hdl); + + WEB_CONTROL_HANDLE controlHandle; + controlHandle.kodi = instance->m_kodi; + controlHandle.props = *props; // Copy as can be deleted after this call + controlHandle.addonWebBase = instance; + + kodi::addon::CWebControl* control = nullptr; + WEB_ADDON_ERROR err = instance->CreateControl(props->strName, start_url, &controlHandle, control); + if ((err == WEB_ADDON_ERROR_NO_ERROR || err == WEB_ADDON_ERROR_NO_ERROR) && control == nullptr) + { + kodi::Log(ADDON_LOG_ERROR, "Failed to create web addon control instance"); + return WEB_ADDON_ERROR_PERMANENT_FAILED; + } + + *handle = control; + return err; + } + + inline static WEB_ADDON_ERROR destroy_control(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + bool complete) + { + return static_cast(hdl)->DestroyControl(static_cast(handle), + complete); + } + + inline static bool control_render_init(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle) + { + return static_cast(handle)->RenderInit(); + } + + inline static void control_render_deinit(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle) + { + static_cast(handle)->RenderDeinit(); + } + + inline static void control_render(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle) + { + static_cast(handle)->Render(); + } + + inline static bool control_dirty(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle) + { + return static_cast(handle)->Dirty(); + } + + inline static bool control_on_init(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle) + { + return static_cast(handle)->OnInit(); + } + + inline static bool control_on_action(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const KODI_ADDON_ACTION_DATA* action, + int* nextItem) + { + return static_cast(handle)->OnAction(action, *nextItem); + } + + inline static bool control_on_mouse_event(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + int id, + double x, + double y, + double offsetX, + double offsetY, + int state) + { + return static_cast(handle)->OnMouseEvent(id, x, y, offsetX, offsetY, state); + } + + inline static bool control_open_website(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const char* url) + { + return static_cast(handle)->OpenWebsite(url); + } + + inline static bool control_get_history(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + char*** list, + size_t* entries, + bool behind_current) + { + std::vector historyWebsiteNames; + bool ret = static_cast(handle)->GetHistory(historyWebsiteNames, behind_current); + if (ret) + { + *list = static_cast(malloc(historyWebsiteNames.size() * sizeof(char*))); + *entries = historyWebsiteNames.size(); + for (size_t i = 0; i < historyWebsiteNames.size(); ++i) +#ifdef WIN32 // To prevent warning C4996 + (*list)[i] = _strdup(historyWebsiteNames[i].c_str()); +#else + (*list)[i] = strdup(historyWebsiteNames[i].c_str()); +#endif + } + return ret; + } + + inline static void control_get_history_clear(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + char** list, + unsigned int entries) + { + for (unsigned int i = 0; i < entries; ++i) + free(list[i]); + free(list); + } + + inline static void control_search_text(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const char* text, + bool forward, + bool matchCase, + bool findNext) + { + static_cast(handle)->SearchText(text, forward, matchCase, findNext); + } + + inline static void control_stop_search(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + bool clearSelection) + { + static_cast(handle)->StopSearch(clearSelection); + } + + inline static void control_web_cmd_reload(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) + { + static_cast(handle)->Reload(); + } + + inline static void control_web_cmd_stop_load(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) + { + static_cast(handle)->StopLoad(); + } + + inline static void control_web_cmd_nav_back(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) + { + static_cast(handle)->GoBack(); + } + + inline static void control_web_cmd_nav_forward(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) + { + static_cast(handle)->GoForward(); + } + + inline static void control_web_open_own_context_menu(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) + { + static_cast(handle)->OpenOwnContextMenu(); + } + + inline static void control_screen_size_change(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + float x, + float y, + float width, + float height, + bool fullscreen) + { + static_cast(handle)->ScreenSizeChange(x, y, width, height, fullscreen); + } +}; + +} /* 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 index ebbeeb7e6c3ea..f1319d512fac5 100644 --- 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 @@ -2,11 +2,7 @@ # See xbmc/addons/kodi-dev-kit/tools/code-generator.py. set(HEADERS - DemuxPacket.h - StreamCodec.h - StreamConstants.h StreamCrypto.h - TimingConstants.h ) if(HEADERS) 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/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/PeripheralUtils.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/peripheral/PeripheralUtils.h index bedd7cb801c60..a02575001a96c 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 index 1690c398fb937..8766f858791ef 100644 --- 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 @@ -4,13 +4,9 @@ set(HEADERS ChannelGroups.h Channels.h - EDL.h EPG.h - General.h - MenuHook.h Providers.h Recordings.h - Stream.h Timers.h ) 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/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/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/c-api/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/CMakeLists.txt index a7dd1d336ba8d..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 @@ -6,7 +6,9 @@ set(HEADERS audio_engine.h filesystem.h general.h + monitor.h network.h + version.h ) if(HEADERS) 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 52670ebfbd36b..81a13a11be347 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 @@ -11,8 +11,9 @@ set(HEADERS pvr.h screensaver.h vfs.h - video_codec.h + videocodec.h visualization.h + web.h ) if(HEADERS) 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 index 6eb5520792236..fba322af6249f 100644 --- 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 @@ -45,10 +45,12 @@ extern "C" { #endif /* __cplusplus */ - typedef void* KODI_ADDON_AUDIODECODER_HDL; +#if __KODI_API__ >= 1 + + typedef KODI_ADDON_INSTANCE_HDL KODI_ADDON_AUDIODECODER_HDL; //============================================================================ - /// @defgroup cpp_kodi_addon_audiodecoder_Defs_AUDIODECODER_READ_RETURN enum AUDIODECODER_READ_RETURN + /// @defgroup cpp_kodi_addon_audiodecoder_Defs_KODI_ADDON_AUDIODECODER_READ_RETURN enum KODI_ADDON_AUDIODECODER_READ_RETURN /// @ingroup cpp_kodi_addon_audiodecoder_Defs /// @brief **Return value about** @ref kodi::addon::CInstanceAudioDecoder::ReadPCM() /// @@ -60,7 +62,7 @@ extern "C" /// | 1 | @ref AUDIODECODER_READ_ERROR | on failure /// ///@{ - typedef enum AUDIODECODER_READ_RETURN + typedef enum KODI_ADDON_AUDIODECODER_READ_RETURN { /// @brief On end of stream AUDIODECODER_READ_EOF = -1, @@ -70,7 +72,7 @@ extern "C" /// @brief On failure AUDIODECODER_READ_ERROR = 1 - } AUDIODECODER_READ_RETURN; + } KODI_ADDON_AUDIODECODER_READ_RETURN; ///@} //---------------------------------------------------------------------------- @@ -123,26 +125,19 @@ extern "C" typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_TRACK_COUNT_V1)( const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file); - typedef struct AddonToKodiFuncTable_AudioDecoder - { - KODI_HANDLE kodiInstance; - } AddonToKodiFuncTable_AudioDecoder; - - typedef struct KodiToAddonFuncTable_AudioDecoder + typedef struct KODI_ADDON_AUDIODECODER_FUNC { + PFN_KODI_ADDON_INSTANCE_CREATE_V1 create; + PFN_KODI_ADDON_INSTANCE_DESTROY_V1 destroy; PFN_KODI_ADDON_AUDIODECODER_SUPPORTS_FILE_V1 supports_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; - } KodiToAddonFuncTable_AudioDecoder; + } KODI_ADDON_AUDIODECODER_FUNC; - typedef struct AddonInstance_AudioDecoder - { - struct AddonToKodiFuncTable_AudioDecoder* toKodi; - struct KodiToAddonFuncTable_AudioDecoder* toAddon; - } AddonInstance_AudioDecoder; +#endif /* __KODI_API__ >= 1 */ #ifdef __cplusplus } /* extern "C" */ 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 index d00ced6e736eb..1ff269f960d68 100644 --- 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 @@ -6,17 +6,21 @@ * See LICENSES/README.md for more information. */ -#ifndef C_API_ADDONINSTANCE_AUDIO_ENCODER_H -#define C_API_ADDONINSTANCE_AUDIO_ENCODER_H +#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; +#if __KODI_API__ >= 1 + + typedef KODI_ADDON_INSTANCE_HDL KODI_ADDON_AUDIOENCODER_HDL; struct KODI_ADDON_AUDIOENCODER_INFO_TAG { @@ -47,28 +51,26 @@ extern "C" typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_FINISH_V1)( KODI_ADDON_AUDIOENCODER_HDL hdl); - typedef struct AddonToKodiFuncTable_AudioEncoder - { - KODI_HANDLE kodiInstance; - ssize_t (*write)(KODI_HANDLE kodiInstance, const uint8_t* data, size_t len); - ssize_t (*seek)(KODI_HANDLE kodiInstance, ssize_t pos, int whence); - } AddonToKodiFuncTable_AudioEncoder; - - typedef struct KodiToAddonFuncTable_AudioEncoder + typedef struct KODI_ADDON_AUDIOENCODER_FUNC { + PFN_KODI_ADDON_INSTANCE_CREATE_V1 create; + PFN_KODI_ADDON_INSTANCE_DESTROY_V1 destroy; PFN_KODI_ADDON_AUDIOENCODER_START_V1 start; PFN_KODI_ADDON_AUDIOENCODER_ENCODE_V1 encode; PFN_KODI_ADDON_AUDIOENCODER_FINISH_V1 finish; - } KodiToAddonFuncTable_AudioEncoder; + } KODI_ADDON_AUDIOENCODER_FUNC; - typedef struct AddonInstance_AudioEncoder - { - struct AddonToKodiFuncTable_AudioEncoder* toKodi; - struct KodiToAddonFuncTable_AudioEncoder* toAddon; - } AddonInstance_AudioEncoder; + ATTR_DLL_EXPORT ssize_t kodi_addon_audioencoder_write(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const uint8_t* data, + size_t len) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT ssize_t kodi_addon_audioencoder_seek(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + ssize_t pos, + int whence) __INTRODUCED_IN_KODI(1); + +#endif /* __KODI_API__ >= 1 */ #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ -#endif /* !C_API_ADDONINSTANCE_AUDIO_ENCODER_H */ +#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 e0bbf94664677..3c602e1b2d043 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,526 +27,200 @@ 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; - } ATTR_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; - } ATTR_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; - } ATTR_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; - } ATTR_PACKED game_stream_video_packet; + } 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** - /// - ///@{ - - //============================================================================ - /// @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; - } ATTR_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; - } ATTR_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; - } ATTR_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; - } ATTR_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; }; - } ATTR_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; }; - } ATTR_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; }; - } ATTR_PACKED game_stream_packet; + } game_stream_packet; //---------------------------------------------------------------------------- ///@} @@ -555,240 +232,88 @@ extern "C" /// ///@{ - //============================================================================ - /// @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,42 +334,23 @@ extern "C" unsigned int abs_pointer_count; char** motors; unsigned int motor_count; - } ATTR_PACKED game_controller_layout; + } game_controller_layout; /*! @endcond */ 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; - } ATTR_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 Flag to prevent a port from being disconnected @@ -855,190 +361,107 @@ extern "C" bool force_connected; /// @brief - game_input_device* accepted_devices; + struct game_input_device* accepted_devices; /// @brief unsigned int device_count; - } ATTR_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; - } ATTR_PACKED game_input_topology; + } game_input_topology; //---------------------------------------------------------------------------- - //============================================================================ - /// @brief typedef struct game_digital_button_event { - /// @brief bool pressed; - } ATTR_PACKED game_digital_button_event; + } game_digital_button_event; //---------------------------------------------------------------------------- - //============================================================================ - /// @brief typedef struct game_analog_button_event { - /// @brief float magnitude; - } ATTR_PACKED game_analog_button_event; + } game_analog_button_event; //---------------------------------------------------------------------------- - //============================================================================ - /// @brief typedef struct game_axis_event { /// @brief float position; - } ATTR_PACKED game_axis_event; + } game_axis_event; //---------------------------------------------------------------------------- - //============================================================================ - /// @brief typedef struct game_analog_stick_event { - /// @brief float x; - - /// @brief float y; - } ATTR_PACKED game_analog_stick_event; + } game_analog_stick_event; //---------------------------------------------------------------------------- - //============================================================================ - /// @brief typedef struct game_accelerometer_event { - /// @brief float x; - - /// @brief float y; - - /// @brief float z; - } ATTR_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; - /// @brief - GAME_KEY_MOD modifiers; - } ATTR_PACKED game_key_event; + enum GAME_KEY_MOD modifiers; + } game_key_event; //---------------------------------------------------------------------------- //============================================================================ /// @brief typedef struct game_rel_pointer_event { - /// @brief int x; - - /// @brief int y; - } ATTR_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; - } ATTR_PACKED game_abs_pointer_event; + } game_abs_pointer_event; //---------------------------------------------------------------------------- - //============================================================================ - /// @brief typedef struct game_motor_event { - /// @brief float magnitude; - } ATTR_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; }; - } ATTR_PACKED game_input_event; + } game_input_event; //---------------------------------------------------------------------------- ///@} @@ -1050,186 +473,173 @@ extern "C" /// ///@{ - //============================================================================ - /// @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 */ + typedef KODI_ADDON_GAME_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_CREATE_V1)( + KODI_ADDON_INSTANCE_BACKEND_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 enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RC_GENERATE_HASH_FROM_FILE_V1)(const KODI_ADDON_GAME_HDL hdl, char** hash, unsigned int console_id, const char* file_path); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RC_GET_GAME_ID_URL_V1)(const KODI_ADDON_GAME_HDL hdl, char** url, const char* hash); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RC_GET_PATCH_FILE_URL_V1)(const KODI_ADDON_GAME_HDL hdl, char** url, const char* username, const char* token, unsigned int game_id); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RC_POST_RICH_PRESENCE_URL_V1)(const KODI_ADDON_GAME_HDL hdl, + char** url, + char** post_data, + const char* username, + const char* token, + unsigned int game_id, + const char* rich_presence); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RC_ENABLE_RICH_PRESENCE_V1)(const KODI_ADDON_GAME_HDL hdl, const char* script); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RC_GET_RICH_PRESENCE_EVALUATION_V1)(const KODI_ADDON_GAME_HDL hdl, char** evaluation, unsigned int console_id); + typedef enum GAME_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_GAME_RC_RESET_RUNTIME_V1)(const KODI_ADDON_GAME_HDL hdl); + + 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; + PFN_KODI_ADDON_GAME_RC_GENERATE_HASH_FROM_FILE_V1 rc_generate_hash_from_file; + PFN_KODI_ADDON_GAME_RC_GET_GAME_ID_URL_V1 rc_get_game_id_url; + PFN_KODI_ADDON_GAME_RC_GET_PATCH_FILE_URL_V1 rc_get_patch_file_url; + PFN_KODI_ADDON_GAME_RC_POST_RICH_PRESENCE_URL_V1 rc_post_rich_presence_url; + PFN_KODI_ADDON_GAME_RC_ENABLE_RICH_PRESENCE_V1 rc_enable_rich_presence; + PFN_KODI_ADDON_GAME_RC_GET_RICH_PRESENCE_EVALUATION_V1 rc_get_rich_presence_evaluation; + PFN_KODI_ADDON_GAME_RC_RESET_RUNTIME_V1 rc_reset_runtime; + } KODI_ADDON_GAME_FUNC; - struct AddonInstance_Game; + typedef void* KODI_GAME_STREAM_HANDLE; - /*! - * @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; - - /*! - * @brief Game function hooks - * - * Not to be used outside this header. - */ - typedef struct KodiToAddonFuncTable_Game - { - KODI_HANDLE addonInstance; - - 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*); - GAME_ERROR(__cdecl* RCGenerateHashFromFile) - (const AddonInstance_Game*, char**, unsigned int, const char*); - GAME_ERROR(__cdecl* RCGetGameIDUrl)(const AddonInstance_Game*, char**, const char*); - GAME_ERROR(__cdecl* RCGetPatchFileUrl) - (const AddonInstance_Game*, char**, const char*, const char*, unsigned int); - GAME_ERROR(__cdecl* RCPostRichPresenceUrl) - (const AddonInstance_Game*, - char**, - char**, - const char*, - const char*, - unsigned int, - const char*); - GAME_ERROR(__cdecl* RCEnableRichPresence)(const AddonInstance_Game*, const char*); - GAME_ERROR(__cdecl* RCGetRichPresenceEvaluation) - (const AddonInstance_Game*, char**, unsigned int); - GAME_ERROR(__cdecl* RCResetRuntime)(const AddonInstance_Game*); - void(__cdecl* FreeString)(const AddonInstance_Game*, char*); - } KodiToAddonFuncTable_Game; - - /*! - * @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; + ATTR_DLL_EXPORT void kodi_addon_game_close(KODI_ADDON_INSTANCE_BACKEND_HDL hdl) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT KODI_GAME_STREAM_HANDLE kodi_addon_game_open_stream( + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const struct game_stream_properties* properties) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_game_get_stream_buffer(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT game_proc_address_t kodi_addon_game_hw_get_proc_address( + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* symbol) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_game_input_event(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const struct game_input_event* event) + __INTRODUCED_IN_KODI(1); #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/imagedecoder.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/imagedecoder.h index bc74e8aed03e5..819bdfc537acd 100644 --- 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 @@ -6,16 +6,20 @@ * See LICENSES/README.md for more information. */ -#ifndef C_API_ADDONINSTANCE_IMAGE_DECODER_H -#define C_API_ADDONINSTANCE_IMAGE_DECODER_H +#ifndef C_API_ADDONINSTANCE_IMAGEDECODER_H +#define C_API_ADDONINSTANCE_IMAGEDECODER_H #include "../addon_base.h" +#include + #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ +#if __KODI_API__ >= 1 + typedef void* KODI_ADDON_IMAGEDECODER_HDL; //============================================================================ @@ -371,21 +375,21 @@ extern "C" int width; int height; float distance; - ADDON_IMG_ORIENTATION orientation; - ADDON_IMG_COLOR color; - ADDON_IMG_METERING_MODE metering_mode; + enum ADDON_IMG_ORIENTATION orientation; + enum ADDON_IMG_COLOR color; + enum ADDON_IMG_METERING_MODE metering_mode; float exposure_time; float exposure_bias; - ADDON_IMG_EXPOSURE_PROGRAM exposure_program; - ADDON_IMG_EXPOSURE_MODE exposure_mode; + enum ADDON_IMG_EXPOSURE_PROGRAM exposure_program; + enum ADDON_IMG_EXPOSURE_MODE exposure_mode; time_t time_created; float aperture_f_number; - ADDON_IMG_FLASH_TYPE flash_used; + enum ADDON_IMG_FLASH_TYPE flash_used; int focal_length; int focal_length_in_35mm_format; float digital_zoom_ratio; float iso_speed; - ADDON_IMG_LIGHT_SOURCE light_source; + enum ADDON_IMG_LIGHT_SOURCE light_source; bool gps_info_present; char latitude_ref; @@ -424,27 +428,20 @@ extern "C" unsigned int pitch, enum ADDON_IMG_FMT format); - typedef struct KodiToAddonFuncTable_ImageDecoder + struct KODI_ADDON_IMAGEDECODER_FUNC { + PFN_KODI_ADDON_INSTANCE_CREATE_V1 create; + PFN_KODI_ADDON_INSTANCE_DESTROY_V1 destroy; PFN_KODI_ADDON_IMAGEDECODER_SUPPORTS_FILE_V1 supports_file; PFN_KODI_ADDON_IMAGEDECODER_READ_TAG_V1 read_tag; PFN_KODI_ADDON_IMAGEDECODER_LOAD_IMAGE_FROM_MEMORY_V1 load_image_from_memory; PFN_KODI_ADDON_IMAGEDECODER_DECODE_V1 decode; - } KodiToAddonFuncTable_ImageDecoder; - - typedef struct AddonToKodiFuncTable_ImageDecoder - { - KODI_HANDLE kodi_instance; - } AddonToKodiFuncTable_ImageDecoder; + }; - typedef struct AddonInstance_ImageDecoder - { - struct AddonToKodiFuncTable_ImageDecoder* toKodi; - struct KodiToAddonFuncTable_ImageDecoder* toAddon; - } AddonInstance_ImageDecoder; +#endif /* __KODI_API__ >= 1 */ #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ -#endif /* !C_API_ADDONINSTANCE_IMAGE_DECODER_H */ +#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 58047a6cf024a..a16dae0dc16e4 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,147 @@ 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_ADDON_INSTANCE_BACKEND_HDL (*PFN_CB_KODI_ADDON_INPUTSTREAM_TRANSFER_STREAM)( + KODI_ADDON_INSTANCE_BACKEND_HDL handle, int streamId, struct INPUTSTREAM_INFO* stream); + + typedef KODI_ADDON_INPUTSTREAM_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_CREATE_V1)( + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, int data_size) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT struct DEMUX_PACKET* kodi_addon_inputstream_allocate_encrypted_demux_packet( + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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/peripheral.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/peripheral.h index d5e1d2b63e25c..852036091c48d 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,6 +26,8 @@ extern "C" { #endif /* __cplusplus */ + typedef void* KODI_ADDON_PERIPHERAL_HDL; + //============================================================================ /// @defgroup cpp_kodi_addon_peripheral_Defs_General_PERIPHERAL_ERROR enum PERIPHERAL_ERROR /// @ingroup cpp_kodi_addon_peripheral_Defs_General @@ -84,25 +90,25 @@ extern "C" /*! * @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 */ - } ATTR_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 */ - } ATTR_PACKED PERIPHERAL_CAPABILITIES; + }; //} @@ -210,22 +216,22 @@ extern "C" /*! * @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; + enum PERIPHERAL_EVENT_TYPE type; /*! @brief The index of the event source */ 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; - } ATTR_PACKED PERIPHERAL_EVENT; + }; //} @@ -235,9 +241,9 @@ extern "C" /*! * @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,7 +251,7 @@ 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 */ - } ATTR_PACKED JOYSTICK_INFO; + }; //============================================================================ /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_PRIMITIVE_TYPE enum JOYSTICK_DRIVER_PRIMITIVE_TYPE @@ -292,10 +298,10 @@ extern "C" /*! * @brief Button primitive */ - typedef struct JOYSTICK_DRIVER_BUTTON + struct JOYSTICK_DRIVER_BUTTON { int index; - } ATTR_PACKED JOYSTICK_DRIVER_BUTTON; + }; //============================================================================ /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_HAT_DIRECTION enum JOYSTICK_DRIVER_HAT_DIRECTION @@ -326,11 +332,11 @@ extern "C" /*! * @brief Hat direction primitive */ - typedef struct JOYSTICK_DRIVER_HAT + struct JOYSTICK_DRIVER_HAT { int index; - JOYSTICK_DRIVER_HAT_DIRECTION direction; - } ATTR_PACKED JOYSTICK_DRIVER_HAT; + enum JOYSTICK_DRIVER_HAT_DIRECTION direction; + }; //============================================================================ /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_SEMIAXIS_DIRECTION enum JOYSTICK_DRIVER_SEMIAXIS_DIRECTION @@ -355,29 +361,29 @@ extern "C" /*! * @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; - } ATTR_PACKED JOYSTICK_DRIVER_SEMIAXIS; + }; /*! * @brief Motor primitive */ - typedef struct JOYSTICK_DRIVER_MOTOR + struct JOYSTICK_DRIVER_MOTOR { int index; - } ATTR_PACKED JOYSTICK_DRIVER_MOTOR; + }; /*! * @brief Keyboard key primitive */ - typedef struct JOYSTICK_DRIVER_KEY + struct JOYSTICK_DRIVER_KEY { char keycode[16]; - } ATTR_PACKED JOYSTICK_DRIVER_KEY; + }; //============================================================================ /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_MOUSE_INDEX enum JOYSTICK_DRIVER_MOUSE_INDEX @@ -423,10 +429,10 @@ extern "C" /*! * @brief Mouse button primitive */ - typedef struct JOYSTICK_DRIVER_MOUSE_BUTTON + struct JOYSTICK_DRIVER_MOUSE_BUTTON { - JOYSTICK_DRIVER_MOUSE_INDEX button; - } ATTR_PACKED JOYSTICK_DRIVER_MOUSE_BUTTON; + enum JOYSTICK_DRIVER_MOUSE_INDEX button; + }; //============================================================================ /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_DRIVER_RELPOINTER_DIRECTION enum JOYSTICK_DRIVER_RELPOINTER_DIRECTION @@ -457,17 +463,17 @@ extern "C" /*! * @brief Relative pointer direction primitive */ - typedef struct JOYSTICK_DRIVER_RELPOINTER + struct JOYSTICK_DRIVER_RELPOINTER { - JOYSTICK_DRIVER_RELPOINTER_DIRECTION direction; - } ATTR_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,7 +484,7 @@ extern "C" struct JOYSTICK_DRIVER_MOUSE_BUTTON mouse; struct JOYSTICK_DRIVER_RELPOINTER relpointer; }; - } ATTR_PACKED JOYSTICK_DRIVER_PRIMITIVE; + }; //============================================================================ /// @defgroup cpp_kodi_addon_peripheral_Defs_Joystick_JOYSTICK_FEATURE_TYPE enum JOYSTICK_FEATURE_TYPE @@ -590,115 +596,119 @@ extern "C" /*! * @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]; - } ATTR_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 */ - } ATTR_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_peripheral_refresh_button_maps( + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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 96e1eea9710a7..3843c789bf6ec 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,328 @@ #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 + 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); + + //--==----==----==----==----==----==----==----==----==----==----==----==----== + // Provider interface functions + + 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 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); - - //--==----==----==----==----==----==----==----==----==----==----==----==----== - // Transfer functions where give data back to Kodi, e.g. GetChannels calls TransferChannelEntry - void (*TransferChannelEntry)(void* kodiInstance, - const PVR_HANDLE handle, - const struct PVR_CHANNEL* chan); - void (*TransferProviderEntry)(void* kodiInstance, - const PVR_HANDLE handle, - const struct PVR_PROVIDER* chanProvider); - void (*TransferChannelGroup)(void* kodiInstance, - const PVR_HANDLE handle, - const struct PVR_CHANNEL_GROUP* group); - void (*TransferChannelGroupMember)(void* kodiInstance, - const PVR_HANDLE handle, - const struct PVR_CHANNEL_GROUP_MEMBER* member); - void (*TransferEpgEntry)(void* kodiInstance, - const PVR_HANDLE handle, - const struct EPG_TAG* epgentry); - void (*TransferRecordingEntry)(void* kodiInstance, - const PVR_HANDLE handle, - const struct PVR_RECORDING* recording); - void (*TransferTimerEntry)(void* kodiInstance, - const PVR_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; - - /*! - * @brief Structure to transfer the methods from addon to Kodi - */ - typedef struct KodiToAddonFuncTable_PVR - { - // 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*, PVR_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*, PVR_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*, PVR_HANDLE, bool); - enum PVR_ERROR(__cdecl* GetChannelGroupMembers)(const struct AddonInstance_PVR*, - PVR_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*, PVR_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*, PVR_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*, PVR_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_ADDON_INSTANCE_BACKEND_HDL hdl) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT int kodi_addon_pvr_get_epg_max_past_days(KODI_ADDON_INSTANCE_BACKEND_HDL hdl) + __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT void kodi_addon_pvr_add_menu_hook(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const struct PVR_MENUHOOK* hook) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_recording_notification(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_providers_update(KODI_ADDON_INSTANCE_BACKEND_HDL hdl) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_channel_groups_update( + KODI_ADDON_INSTANCE_BACKEND_HDL hdl) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_epg_update(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + unsigned int iChannelUid) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_recording_update(KODI_ADDON_INSTANCE_BACKEND_HDL hdl) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_timer_update(KODI_ADDON_INSTANCE_BACKEND_HDL hdl) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } 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 062390d3583b9..5322dcbd26aee 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,7 +16,7 @@ extern "C" { #endif /* __cplusplus */ - typedef void* KODI_ADDON_SCREENSAVER_HDL; + typedef KODI_ADDON_INSTANCE_HDL KODI_ADDON_SCREENSAVER_HDL; struct KODI_ADDON_SCREENSAVER_PROPS { @@ -28,30 +28,23 @@ extern "C" float pixelRatio; }; - typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_START_V1)( - const KODI_ADDON_SCREENSAVER_HDL hdl); - typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_STOP_V1)( - const KODI_ADDON_SCREENSAVER_HDL hdl); - typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_RENDER_V1)( - const KODI_ADDON_SCREENSAVER_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_START_V1)(const KODI_ADDON_SCREENSAVER_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_STOP_V1)(const KODI_ADDON_SCREENSAVER_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_RENDER_V1)(const KODI_ADDON_SCREENSAVER_HDL hdl); - typedef struct KodiToAddonFuncTable_Screensaver + typedef struct KODI_ADDON_SCREENSAVER_FUNC { + PFN_KODI_ADDON_INSTANCE_CREATE_V1 create; + PFN_KODI_ADDON_INSTANCE_DESTROY_V1 destroy; PFN_KODI_ADDON_SCREENSAVER_START_V1 start; PFN_KODI_ADDON_SCREENSAVER_STOP_V1 stop; PFN_KODI_ADDON_SCREENSAVER_RENDER_V1 render; - } KodiToAddonFuncTable_Screensaver; + } KODI_ADDON_SCREENSAVER_FUNC; + /*---AUTO_GEN_PARSE---*/ - typedef struct AddonToKodiFuncTable_Screensaver - { - void (*get_properties)(const KODI_HANDLE hdl, struct KODI_ADDON_SCREENSAVER_PROPS* props); - } AddonToKodiFuncTable_Screensaver; - - typedef struct AddonInstance_Screensaver - { - struct AddonToKodiFuncTable_Screensaver* toKodi; - struct KodiToAddonFuncTable_Screensaver* toAddon; - } AddonInstance_Screensaver; + ATTR_DLL_EXPORT void kodi_addon_screensaver_get_properties( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, struct KODI_ADDON_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 b4fd90cf32207..1d49fb07b0005 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 KODI_ADDON_INSTANCE_HDL KODI_ADDON_VFS_HDL; + typedef void* KODI_VFS_FILE_HDL; + typedef void* KODI_CTX_CB_HDL; + + struct KODI_ADDON_VFS_URL { const char* url; const char* domain; @@ -33,112 +36,124 @@ 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 KODI_VFS_FILE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_OPEN_V1)( + const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url); + typedef KODI_VFS_FILE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_OPEN_FOR_WRITE_V1)( + const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url, bool overwrite); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_CLOSE_V1)(const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context); + typedef ssize_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_READ_V1)(const 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)(const 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)(const 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)(const 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)( + const KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); + typedef int64_t(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_GET_POSITION_V1)( + const KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context); + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_GET_CHUNK_SIZE_V1)( + const 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)( + const 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)( + const 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)( + const KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, uint32_t rate); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_RETRY_V1)( + const KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, bool retry); + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_STAT_V1)(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url, + struct VFS_STAT_STRUCTURE* buffer); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_EXISTS_V1)(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_CLEAR_OUT_IDLE_V1)(const KODI_ADDON_VFS_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DISCONNECT_ALL_V1)(const KODI_ADDON_VFS_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DELETE_IT_V1)( + const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_RENAME_V1)(const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url, + const struct KODI_ADDON_VFS_URL* url2); - typedef struct AddonProps_VFSEntry /* internal */ - { - int dummy; - } AddonProps_VFSEntry; + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_EXISTS_V1)( + const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_REMOVE_V1)( + const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_CREATE_V1)( + const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_DIRECTORY_GET_V1)( + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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)( + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url, + struct VFS_DIR_ENTRY** entries, + size_t* num_entries, + char** rootpath); - typedef struct AddonToKodiFuncTable_VFSEntry /* internal */ + struct KODI_ADDON_VFS_FUNC { - KODI_HANDLE kodiInstance; - } AddonToKodiFuncTable_VFSEntry; + PFN_KODI_ADDON_INSTANCE_CREATE_V1 create; + PFN_KODI_ADDON_INSTANCE_DESTROY_V1 destroy; - struct AddonInstance_VFSEntry; - typedef struct KodiToAddonFuncTable_VFSEntry /* internal */ - { - KODI_HANDLE addonInstance; + PFN_KODI_ADDON_VFS_CLEAR_OUT_IDLE_V1 clear_out_idle; + PFN_KODI_ADDON_VFS_DISCONNECT_ALL_V1 disconnect_all; - 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, - uint32_t 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); + 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; - 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; + 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; - typedef struct AddonInstance_VFSEntry /* internal */ - { - struct AddonProps_VFSEntry* props; - struct AddonToKodiFuncTable_VFSEntry* toKodi; - struct KodiToAddonFuncTable_VFSEntry* toAddon; - } AddonInstance_VFSEntry; + 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; + }; + + ATTR_DLL_EXPORT bool kodi_addon_vfs_get_dir_cb__get_keyboard_input( + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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/videocodec.h similarity index 72% rename from xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/video_codec.h rename to xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/videocodec.h index 98a32f2db4ab7..570fb3103f63d 100644 --- 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/videocodec.h @@ -1,11 +1,13 @@ /* - * Copyright (C) 2017-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_VIDEOCODEC_H #define C_API_ADDONINSTANCE_VIDEOCODEC_H @@ -19,6 +21,8 @@ extern "C" { #endif /* __cplusplus */ + typedef void* KODI_ADDON_VIDEOCODEC_HDL; + //============================================================================ /// @ingroup cpp_kodi_addon_videocodec_Defs /// @brief Return values used by video decoder interface @@ -148,7 +152,7 @@ extern "C" { /// @brief The video format declared with @ref VIDEOCODEC_FORMAT and to be /// used on the addon. - enum VIDEOCODEC_FORMAT videoFormat; + enum VIDEOCODEC_FORMAT video_format; /// @brief Video coded process flags, used to perform special operations in /// stream calls. @@ -163,16 +167,16 @@ extern "C" uint32_t height; /// @brief Data to be decoded in the addon. - uint8_t* decodedData; + uint8_t* decoded_data; /// @brief Size of the data given with @ref decodedData - size_t decodedDataSize; + size_t decoded_data_size; /// @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]; + uint32_t plane_offsets[VIDEOCODEC_PICTURE_MAXPLANES]; /// @brief YUV color stride calculation array /// @@ -188,7 +192,7 @@ extern "C" /// 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; + KODI_OWN_HDL video_buffer_handle; }; ///@} //---------------------------------------------------------------------------- @@ -196,63 +200,51 @@ extern "C" struct VIDEOCODEC_INITDATA { enum VIDEOCODEC_TYPE codec; - enum STREAMCODEC_PROFILE codecProfile; - enum VIDEOCODEC_FORMAT* videoFormats; + enum STREAMCODEC_PROFILE codec_profile; + enum VIDEOCODEC_FORMAT* video_formats; uint32_t width; uint32_t height; - const uint8_t* extraData; - unsigned int extraDataSize; - struct STREAM_CRYPTO_SESSION cryptoSession; + const uint8_t* extra_data; + unsigned int extra_data_size; + struct STREAM_CRYPTO_SESSION crypto_session; }; - // 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); + typedef KODI_ADDON_VIDEOCODEC_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_CREATE_V1)( + KODI_ADDON_INSTANCE_BACKEND_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); - //! @brief Get a decoded picture / request new data - enum VIDEOCODEC_RETVAL(__cdecl* get_picture)(const struct AddonInstance_VideoCodec* instance, - struct VIDEOCODEC_PICTURE* picture); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_RECONFIGURE_V1)( + KODI_ADDON_VIDEOCODEC_HDL hdl, struct VIDEOCODEC_INITDATA* initData); - //! @brief Get the name of this video decoder - const char*(__cdecl* get_name)(const struct AddonInstance_VideoCodec* instance); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_ADD_DATA_V1)( + KODI_ADDON_VIDEOCODEC_HDL hdl, const struct DEMUX_PACKET* packet); - //! @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 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 AddonInstance_VideoCodec + typedef struct KODI_ADDON_VIDEOCODEC_FUNC { - struct AddonProps_VideoCodec* props; - struct AddonToKodiFuncTable_VideoCodec* toKodi; - struct KodiToAddonFuncTable_VideoCodec* toAddon; - } AddonInstance_VideoCodec; + 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_ADDON_INSTANCE_BACKEND_HDL hdl, + struct VIDEOCODEC_PICTURE* picture) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_videocodec_release_frame_buffer( + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, struct VIDEOCODEC_PICTURE* picture) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ 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..a88d937065be2 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,25 @@ #include "../addon_base.h" -#define VIZ_LYRICS_SIZE 32768 - #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - struct VIS_INFO - { - bool bWantsFreq; - int iSyncDelay; - }; + typedef KODI_ADDON_INSTANCE_HDL KODI_ADDON_VISUALIZATION_HDL; - struct VIS_TRACK + struct KODI_ADDON_VISUALIZATION_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,7 +41,7 @@ extern "C" int reserved4; }; - typedef struct AddonProps_Visualization + struct KODI_ADDON_VISUALIZATION_PROPS { ADDON_HARDWARE_CONTEXT device; int x; @@ -55,63 +49,90 @@ extern "C" 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; + }; - 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 bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_START_V1)( + const 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)( + const KODI_ADDON_VISUALIZATION_HDL hdl); + + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_SYNC_DELAY_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl); + + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_AUDIO_DATA_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl, + const float* audio_data, + size_t audio_data_length); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_IS_DIRTY_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RENDER_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl); + + typedef unsigned int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_PRESETS_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl); + typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_ACTIVE_PRESET_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_PREV_PRESET_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_NEXT_PRESET_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_LOAD_PRESET_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl, int select); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RANDOM_PRESET_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_LOCK_PRESET_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_RATE_PRESET_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl, bool plus_minus); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_IS_LOCKED_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl); + + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_UPDATE_ALBUMART_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl, const char* albumart); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_UPDATE_TRACK_V1)( + const KODI_ADDON_VISUALIZATION_HDL hdl, const struct KODI_ADDON_VISUALIZATION_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_INSTANCE_CREATE_V1 create; + PFN_KODI_ADDON_INSTANCE_DESTROY_V1 destroy; + PFN_KODI_ADDON_VISUALIZATION_START_V1 start; + PFN_KODI_ADDON_VISUALIZATION_STOP_V1 stop; + + PFN_KODI_ADDON_VISUALIZATION_GET_SYNC_DELAY_V1 get_sync_delay; + + 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; + /*---AUTO_GEN_PARSE---*/ + + ATTR_DLL_EXPORT void kodi_addon_visualization_get_properties(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + struct KODI_ADDON_VISUALIZATION_PROPS* props) + __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT void kodi_addon_visualization_transfer_preset(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* preset) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_visualization_clear_presets(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl) + __INTRODUCED_IN_KODI(1); #ifdef __cplusplus } /* extern "C" */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/web.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/web.h new file mode 100644 index 0000000000000..181272a25b4be --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/web.h @@ -0,0 +1,341 @@ +/* + * 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 + +#ifndef C_API_ADDONINSTANCE_WEB_H +#define C_API_ADDONINSTANCE_WEB_H + +#include "../addon_base.h" + +#define WEB_TYPE_ID_BROWSER 0 +#define WEB_MAX_NAME_STRING_SIZE 80 + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#if __KODI_API__ >= 1 + + typedef KODI_ADDON_INSTANCE_HDL KODI_ADDON_WEB_HDL; + typedef void* KODI_ADDON_WEB_CONTROL_HDL; + typedef void* WEB_KODI_CONTROL; + + //============================================================================ + /// @brief Web add-on error codes + /// + enum WEB_ADDON_ERROR + { + /// @brief if something was go complete wrong + WEB_ADDON_ERROR_PERMANENT_FAILED = -7, + + /// @brief the command failed + WEB_ADDON_ERROR_FAILED = -6, + + /// @brief the parameters of the method that was called are invalid for this operation + WEB_ADDON_ERROR_INVALID_PARAMETERS = -5, + + /// @brief the command was rejected by the addon + WEB_ADDON_ERROR_REJECTED = -4, + + /// @brief the method that KODI called is not implemented by the add-on + WEB_ADDON_ERROR_NOT_IMPLEMENTED = -3, + + /// @brief an unknown error occurred + WEB_ADDON_ERROR_UNKNOWN = -2, + + /// @brief no error occurred, but existing part reopened + WEB_ADDON_ERROR_NO_ERROR_REOPEN = -1, + + /// @brief no error occurred + WEB_ADDON_ERROR_NO_ERROR = 0, + }; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief + typedef enum WEB_KEY_MOD + { + /// @brief + WEB_KEY_MOD_NONE = 0x0000, + + /// @brief + WEB_KEY_MOD_SHIFT = 0x0001, + + /// @brief + WEB_KEY_MOD_CTRL = 0x0002, + + /// @brief + WEB_KEY_MOD_ALT = 0x0004, + + /// @brief + WEB_KEY_MOD_META = 0x0008, + + /// @brief + WEB_KEY_MOD_SUPER = 0x0010, + + /// @brief + WEB_KEY_MOD_NUMLOCK = 0x0100, + + /// @brief + WEB_KEY_MOD_CAPSLOCK = 0x0200, + + /// @brief + WEB_KEY_MOD_SCROLLOCK = 0x0400, + } WEB_KEY_MOD; + //---------------------------------------------------------------------------- + + typedef struct WEB_KEYBOARD_INPUT_EVENT + { + const char* controller_id; + const char* feature_name; + bool pressed; + uint32_t unicode; + enum WEB_KEY_MOD modifiers; + } WEB_KEYBOARD_INPUT_EVENT; + + /*! + * @brief Type defination structure + */ + typedef struct WEB_ADDON_VARIOUS_TYPE + { + const char* strName; + int iAddonInternalId; + int iType; + } WEB_ADDON_VARIOUS_TYPE; + + /*! + * @brief Web addon gui control handle data + */ + typedef struct WEB_ADDON_GUI_PROPS + { + /*! + * @brief identify name of related control to know on next open + */ + char strName[WEB_MAX_NAME_STRING_SIZE]; + + /*! + * @brief Used render device, NULL for OpenGL and only be used for DirectX + */ + ADDON_HARDWARE_CONTEXT pDevice; + + /*! + * @brief For GUI control used render positions and sizes + */ + float fXPos; + float fYPos; + float fWidth; + float fHeight; + float fPixelRatio; + float fFPS; + + /*! + * @brief For GUI control used positions and sizes on skin + */ + float fSkinXPos; + float fSkinYPos; + float fSkinWidth; + float fSkinHeight; + + /*! + * @brief If set the opened control becomes handled transparent with the + * color value given on iBackgroundColorARGB + */ + bool bUseTransparentBackground; + + /*! + * @brief The wanted background color on opened control. + * + * If bUseTransparentBackground is false it is the background during empty + * control (Webside not loaded) + * If bUseTransparentBackground is true then it set the transparency color + * of the handled control + */ + uint32_t iBackgroundColorARGB; + + /*! + * @brief The id's from control outside of the web GUI render control. + * Used with OnAction to inform about next GUI item to select if inside + * control a point comes to the end. + */ + int iGUIItemLeft; + int iGUIItemRight; + int iGUIItemTop; + int iGUIItemBottom; + int iGUIItemBack; + + /*! + * @brief Identifier of the control on Kodi. Required to have on callbacks, + * must set by callback functions on WEB_KODI_CONTROL::dataAddress with this! + */ + WEB_KODI_CONTROL pControlIdent; + } WEB_ADDON_GUI_PROPS; + + struct ADDON_HANDLE_STRUCT + { + void* callerAddress; /*!< address of the caller */ + void* dataAddress; /*!< address to store data in */ + int dataIdentifier; /*!< parameter to pass back when calling the callback */ + }; + + struct KODI_ADDON_ACTION_DATA; + + typedef enum WEB_ADDON_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_START_INSTANCE_V1)(const KODI_ADDON_WEB_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_STOP_INSTANCE_V1)(const KODI_ADDON_WEB_HDL hdl); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_MAIN_INITIALIZE_V1)(const KODI_ADDON_WEB_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_MAIN_LOOP_V1)(const KODI_ADDON_WEB_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_MAIN_SHUTDOWN_V1)(const KODI_ADDON_WEB_HDL hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_SET_MUTE_V1)(const KODI_ADDON_WEB_HDL hdl, bool mute); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_SET_LANGUAGE_V1)(const KODI_ADDON_WEB_HDL hdl, + const char* language); + + typedef enum WEB_ADDON_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CREATE_CONTROL_V1)(const KODI_ADDON_WEB_HDL hdl, + const struct WEB_ADDON_GUI_PROPS* props, + const char* start_url, + WEB_KODI_CONTROL* handle); + typedef enum WEB_ADDON_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_DESTROY_CONTROL_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + bool complete); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_RENDER_INIT_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_RENDER_DEINIT_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_RENDER_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_DIRTY_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_ON_INIT_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_ON_ACTION_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const struct KODI_ADDON_ACTION_DATA* action, + int* nextItem); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_ON_MOUSE_EVENT_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + int id, + double x, + double y, + double offsetX, + double offsetY, + int state); + + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_OPEN_WEBSITE_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const char* url); + typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_GET_HISTORY_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + char*** list, + size_t* entries, + bool behind_current); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SEARCH_TEXT_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const char* text, + bool forward, + bool matchCase, + bool findNext); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_STOP_SEARCH_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + bool clearSelection); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_RELOAD_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_STOP_LOAD_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_BACK_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_FORWARD_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_OPEN_OWN_CONTEXT_MENU_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SCREEN_SIZE_CHANGE_V1)(const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + float x, + float y, + float width, + float height, + bool fullscreen); + + struct KODI_ADDON_WEB_FUNC + { + PFN_KODI_ADDON_INSTANCE_CREATE_V1 create; + PFN_KODI_ADDON_INSTANCE_DESTROY_V1 destroy; + + PFN_KODI_ADDON_WEB_START_INSTANCE_V1 start_instance; + PFN_KODI_ADDON_WEB_STOP_INSTANCE_V1 stop_instance; + PFN_KODI_ADDON_WEB_MAIN_INITIALIZE_V1 main_initialize; + PFN_KODI_ADDON_WEB_MAIN_LOOP_V1 main_loop; + PFN_KODI_ADDON_WEB_MAIN_SHUTDOWN_V1 main_shutdown; + PFN_KODI_ADDON_WEB_SET_MUTE_V1 set_mute; + PFN_KODI_ADDON_WEB_SET_LANGUAGE_V1 set_language; + + PFN_KODI_ADDON_WEB_CREATE_CONTROL_V1 create_control; + PFN_KODI_ADDON_WEB_DESTROY_CONTROL_V1 destroy_control; + PFN_KODI_ADDON_WEB_CONTROL_RENDER_INIT_V1 control_render_init; + PFN_KODI_ADDON_WEB_CONTROL_RENDER_DEINIT_V1 control_render_deinit; + PFN_KODI_ADDON_WEB_CONTROL_RENDER_V1 control_render; + PFN_KODI_ADDON_WEB_CONTROL_DIRTY_V1 control_dirty; + PFN_KODI_ADDON_WEB_CONTROL_ON_INIT_V1 control_on_init; + PFN_KODI_ADDON_WEB_CONTROL_ON_ACTION_V1 control_on_action; + PFN_KODI_ADDON_WEB_CONTROL_ON_MOUSE_EVENT_V1 control_on_mouse_event; + + PFN_KODI_ADDON_WEB_CONTROL_OPEN_WEBSITE_V1 control_open_website; + PFN_KODI_ADDON_WEB_CONTROL_GET_HISTORY_V1 control_get_history; + PFN_KODI_ADDON_WEB_CONTROL_SEARCH_TEXT_V1 control_search_text; + PFN_KODI_ADDON_WEB_CONTROL_STOP_SEARCH_V1 control_stop_search; + PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_RELOAD_V1 control_web_cmd_reload; + PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_STOP_LOAD_V1 control_web_cmd_stop_load; + PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_BACK_V1 control_web_cmd_nav_back; + PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_FORWARD_V1 control_web_cmd_nav_forward; + PFN_KODI_ADDON_WEB_CONTROL_WEB_OPEN_OWN_CONTEXT_MENU_V1 control_web_open_own_context_menu; + PFN_KODI_ADDON_WEB_CONTROL_SCREEN_SIZE_CHANGE_V1 control_screen_size_change; + }; + /*---AUTO_GEN_PARSE---*/ + + ATTR_DLL_EXPORT void kodi_addon_web_inhibit_shutdown(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + bool inhibit); __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_web_inhibit_screensaver(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + bool inhibit); __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_web_is_muted(KODI_ADDON_INSTANCE_BACKEND_HDL hdl); __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_web_control_set_control_ready(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + bool ready); __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_web_control_set_opened_address(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* title); __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_web_control_set_opened_title(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* title); __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_web_control_set_icon_url(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* icon); __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_web_control_set_fullscreen(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + bool fullscreen); __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_web_control_set_loading_state(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + bool isLoading, + bool canGoBack, + bool canGoForward); __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_web_control_set_tooltip(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* tooltip); __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_web_control_set_status_message(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* status); __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT void kodi_addon_web_control_request_open_site_in_new_tab(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* url); __INTRODUCED_IN_KODI(1); + + +#endif /* __KODI_API__ >= 1 */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* !C_API_ADDONINSTANCE_WEB_H */ 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 ca0e4416e71b7..ad383961a12b4 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 @@ -74,8 +77,12 @@ #if __GNUC__ >= 4 #define ATTR_DLL_IMPORT __attribute__((visibility("default"))) #define ATTR_DLL_EXPORT __attribute__((visibility("default"))) +#ifndef SWIG #define ATTR_DLL_LOCAL __attribute__((visibility("hidden"))) #else +#define ATTR_DLL_LOCAL +#endif +#else #define ATTR_DLL_IMPORT #define ATTR_DLL_EXPORT #define ATTR_DLL_LOCAL @@ -100,26 +107,23 @@ 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 */ +#if __KODI_API__ >= 1 + + typedef void* KODI_HANDLE; + typedef void* KODI_DLL_HDL; + typedef void* KODI_OWN_HDL; + typedef void* KODI_IFC_HDL; typedef void* KODI_ADDON_HDL; typedef void* KODI_ADDON_BACKEND_HDL; typedef void* KODI_ADDON_INSTANCE_HDL; typedef void* KODI_ADDON_INSTANCE_BACKEND_HDL; - typedef void* KODI_ADDON_FUNC_DUMMY; + typedef void* ADDON_HARDWARE_CONTEXT; //============================================================================ /// @ingroup cpp_kodi_addon_addonbase_Defs @@ -131,30 +135,14 @@ extern "C" ///@{ 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_ADDON_LOG enum ADDON_LOG @@ -175,172 +163,66 @@ extern "C" ///@{ 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 } ADDON_LOG; ///@} //---------------------------------------------------------------------------- - typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_STRING_V1)( - const KODI_ADDON_INSTANCE_HDL hdl, const char* name, const char* value); - typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_BOOLEAN_V1)( - const KODI_ADDON_INSTANCE_HDL hdl, const char* name, bool value); - typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_INTEGER_V1)( - const KODI_ADDON_INSTANCE_HDL hdl, const char* name, int value); - typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_FLOAT_V1)( - const KODI_ADDON_INSTANCE_HDL hdl, const char* name, float value); - - typedef struct KODI_ADDON_INSTANCE_FUNC - { - PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_STRING_V1 instance_setting_change_string; - PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_BOOLEAN_V1 instance_setting_change_boolean; - PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_INTEGER_V1 instance_setting_change_integer; - PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_FLOAT_V1 instance_setting_change_float; - } KODI_ADDON_INSTANCE_FUNC; - - typedef struct KODI_ADDON_INSTANCE_FUNC_CB + typedef enum KODI_ADDON_INSTANCE_TYPE { - char* (*get_instance_user_path)(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl); - bool (*is_instance_setting_using_default)(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id); - - bool (*get_instance_setting_bool)(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - bool* value); - bool (*get_instance_setting_int)(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - int* value); - bool (*get_instance_setting_float)(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - float* value); - bool (*get_instance_setting_string)(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - char** value); - - bool (*set_instance_setting_bool)(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - bool value); - bool (*set_instance_setting_int)(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - int value); - bool (*set_instance_setting_float)(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - float value); - bool (*set_instance_setting_string)(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, - const char* id, - const char* value); - } KODI_ADDON_INSTANCE_FUNC_CB; - - typedef int KODI_ADDON_INSTANCE_TYPE; + 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, + } KODI_ADDON_INSTANCE_TYPE; struct KODI_ADDON_INSTANCE_INFO { - KODI_ADDON_INSTANCE_TYPE type; - uint32_t number; - const char* id; - const char* version; + enum KODI_ADDON_INSTANCE_TYPE type; + uint32_t instance_id; + const char* unique_work_id; KODI_ADDON_INSTANCE_BACKEND_HDL kodi; KODI_ADDON_INSTANCE_HDL parent; - bool first_instance; - - struct KODI_ADDON_INSTANCE_FUNC_CB* functions; }; + /*---AUTO_GEN_PARSE---*/ - typedef struct KODI_ADDON_INSTANCE_STRUCT + struct KODI_ADDON_INSTANCE_STRUCT { - const KODI_ADDON_INSTANCE_INFO* info; - KODI_ADDON_INSTANCE_HDL hdl; - struct KODI_ADDON_INSTANCE_FUNC* functions; - union { - KODI_ADDON_FUNC_DUMMY dummy; - struct AddonInstance_AudioDecoder* audiodecoder; - struct AddonInstance_AudioEncoder* audioencoder; - struct AddonInstance_ImageDecoder* imagedecoder; - struct AddonInstance_Game* game; - struct AddonInstance_InputStream* inputstream; - struct AddonInstance_Peripheral* peripheral; - struct AddonInstance_PVR* pvr; - struct AddonInstance_Screensaver* screensaver; - struct AddonInstance_VFSEntry* vfs; - struct AddonInstance_VideoCodec* videocodec; - struct AddonInstance_Visualization* visualization; + union + { + KODI_HANDLE dummy; + struct KODI_ADDON_INSTANCE_FUNC* instance; + 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; + struct KODI_ADDON_WEB_FUNC* web; }; - } KODI_ADDON_INSTANCE_STRUCT; - - /*! @brief Standard undefined pointer handle */ - typedef void* KODI_HANDLE; - - typedef struct AddonToKodiFuncTable_kodi_addon - { - char* (*get_addon_path)(const KODI_ADDON_BACKEND_HDL hdl); - char* (*get_lib_path)(const KODI_ADDON_BACKEND_HDL hdl); - char* (*get_user_path)(const KODI_ADDON_BACKEND_HDL hdl); - char* (*get_temp_path)(const KODI_ADDON_BACKEND_HDL hdl); - - char* (*get_localized_string)(const KODI_ADDON_BACKEND_HDL hdl, long label_id); - - bool (*open_settings_dialog)(const KODI_ADDON_BACKEND_HDL hdl); - bool (*is_setting_using_default)(const KODI_ADDON_BACKEND_HDL hdl, const char* id); - - bool (*get_setting_bool)(const KODI_ADDON_BACKEND_HDL hdl, const char* id, bool* value); - bool (*get_setting_int)(const KODI_ADDON_BACKEND_HDL hdl, const char* id, int* value); - bool (*get_setting_float)(const KODI_ADDON_BACKEND_HDL hdl, const char* id, float* value); - bool (*get_setting_string)(const KODI_ADDON_BACKEND_HDL hdl, const char* id, char** value); - - bool (*set_setting_bool)(const KODI_ADDON_BACKEND_HDL hdl, const char* id, bool value); - bool (*set_setting_int)(const KODI_ADDON_BACKEND_HDL hdl, const char* id, int value); - bool (*set_setting_float)(const KODI_ADDON_BACKEND_HDL hdl, const char* id, float value); - bool (*set_setting_string)(const KODI_ADDON_BACKEND_HDL hdl, const char* id, const char* value); - - char* (*get_addon_info)(const KODI_ADDON_BACKEND_HDL hdl, const char* id); + }; - char* (*get_type_version)(const KODI_ADDON_BACKEND_HDL hdl, int type); - void* (*get_interface)(const KODI_ADDON_BACKEND_HDL hdl, const char* name, const char* version); - } AddonToKodiFuncTable_kodi_addon; + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_CREATE_V1)(const struct KODI_ADDON_INSTANCE_INFO* first_instance, KODI_ADDON_HDL* hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_DESTROY_V1)(KODI_ADDON_HDL hdl); - /*! - * @brief Callback function tables from addon to Kodi - * Set complete from Kodi! - */ - typedef struct AddonToKodiFuncTable_Addon - { - // Pointer inside Kodi, used on callback functions to give related handle - // class, for this ADDON::CAddonDll inside Kodi. - KODI_ADDON_BACKEND_HDL kodiBase; - - void (*free_string)(const KODI_ADDON_BACKEND_HDL hdl, char* str); - void (*free_string_array)(const KODI_ADDON_BACKEND_HDL hdl, char** arr, int numElements); - void (*addon_log_msg)(const KODI_ADDON_BACKEND_HDL hdl, const int loglevel, const char* msg); - - struct AddonToKodiFuncTable_kodi* kodi; - struct AddonToKodiFuncTable_kodi_addon* kodi_addon; - struct AddonToKodiFuncTable_kodi_audioengine* kodi_audioengine; - struct AddonToKodiFuncTable_kodi_filesystem* kodi_filesystem; - struct AddonToKodiFuncTable_kodi_gui* kodi_gui; - struct AddonToKodiFuncTable_kodi_network* kodi_network; - } AddonToKodiFuncTable_Addon; - - typedef ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_CREATE_V1)( - const KODI_ADDON_INSTANCE_BACKEND_HDL first_instance, KODI_ADDON_HDL* hdl); - typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_DESTROY_V1)(const KODI_ADDON_HDL hdl); - typedef ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_CREATE_INSTANCE_V1)( - const KODI_ADDON_HDL hdl, struct KODI_ADDON_INSTANCE_STRUCT* instance); - typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_DESTROY_INSTANCE_V1)( - const KODI_ADDON_HDL hdl, struct KODI_ADDON_INSTANCE_STRUCT* instance); 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)( @@ -348,52 +230,151 @@ extern "C" 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); + const KODI_ADDON_HDL hdl, const char* name, double value); - /*! - * @brief Function tables from Kodi to addon - */ - typedef struct KodiToAddonFuncTable_Addon + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_CREATE_INSTANCE_V1)( + const KODI_ADDON_HDL hdl, + const struct KODI_ADDON_INSTANCE_INFO* info, + struct KODI_ADDON_INSTANCE_STRUCT* instance); + /*---AUTO_GEN_PARSE---*/ + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_DESTROY_INSTANCE_V1)( + const KODI_ADDON_HDL hdl, + const struct KODI_ADDON_INSTANCE_INFO* info, + const KODI_ADDON_INSTANCE_HDL instance_hdl); + /*---AUTO_GEN_PARSE---*/ + + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_STRING_V1)( + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + const char* value); + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_BOOLEAN_V1)( + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + bool value); + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_INTEGER_V1)( + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + int value); + typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_FLOAT_V1)( + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + double value); + + 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; PFN_KODI_ADDON_SETTING_CHANGE_FLOAT_V1 setting_change_float; - } KodiToAddonFuncTable_Addon; - /*! - * @brief Main structure passed from kodi to addon with basic information needed to - * create add-on. - */ - typedef struct AddonGlobalInterface - { - // Pointer of first created instance, used in case this add-on goes with single way - // Set from Kodi! - struct KODI_ADDON_INSTANCE_STRUCT* firstKodiInstance; + PFN_KODI_ADDON_CREATE_INSTANCE_V1 create_instance; + PFN_KODI_ADDON_DESTROY_INSTANCE_V1 destroy_instance; - // Pointer to master base class inside add-on - // Set from addon header (kodi::addon::CAddonBase)! - KODI_ADDON_HDL addonBase; + PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_STRING_V1 instance_setting_change_string; + PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_BOOLEAN_V1 instance_setting_change_boolean; + PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_INTEGER_V1 instance_setting_change_integer; + PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_FLOAT_V1 instance_setting_change_float; + }; - // Pointer to a instance used on single way (together with this class) - // Set from addon header (kodi::addon::IAddonInstance)! - KODI_ADDON_INSTANCE_HDL globalSingleInstance; + typedef KODI_ADDON_INSTANCE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_CREATE_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL kodi_hdl); + typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_DESTROY_V1)(KODI_ADDON_INSTANCE_HDL hdl); - // Callback function tables from addon to Kodi - // Set from Kodi! - AddonToKodiFuncTable_Addon* toKodi; + struct KODI_ADDON_INSTANCE_FUNC + { + PFN_KODI_ADDON_INSTANCE_CREATE_V1 create; + PFN_KODI_ADDON_INSTANCE_DESTROY_V1 destroy; + }; - // Function tables from Kodi to addon - // Set from addon header! - KodiToAddonFuncTable_Addon* toAddon; - } AddonGlobalInterface; + 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_addon_path() __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT char* kodi_addon_get_lib_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_localized_string(long label_id) __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, double* 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, double value) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_set_setting_string(const char* id, const char* value) + __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT char* kodi_addon_instance_get_user_path(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_instance_is_setting_using_default( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id) __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_bool( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, bool* value) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_int( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, int* value) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_float( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, double* value) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_string( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, char** value) + __INTRODUCED_IN_KODI(1); + + ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_bool( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, bool value) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_int( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, int value) __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_float( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, double value) + __INTRODUCED_IN_KODI(1); + ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_string( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, 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..9de0a9ff3c249 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,139 @@ 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..125ec79e019a8 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/dl/kodi_api_1.h @@ -0,0 +1,1466 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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/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-instance/web.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 KODI_ADDON_SCREENSAVER_PROPS; + struct VIDEOCODEC_PICTURE; + struct KODI_ADDON_VISUALIZATION_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*, double*); + 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_INSTANCE_GET_SETTING_BOOL_V1)( + const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, bool*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_INSTANCE_GET_SETTING_FLOAT_V1)( + const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, double*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_INSTANCE_GET_SETTING_INT_V1)( + const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, int*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_INSTANCE_GET_SETTING_STRING_V1)( + const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, char**); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_INSTANCE_IS_SETTING_USING_DEFAULT_V1)( + const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_INSTANCE_SET_SETTING_BOOL_V1)( + const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, bool); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_INSTANCE_SET_SETTING_FLOAT_V1)( + const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, double); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_INSTANCE_SET_SETTING_INT_V1)( + const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, int); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_INSTANCE_SET_SETTING_STRING_V1)( + const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, const 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*, double); + 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_ADDON_PATH_V1)(); + 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_TEMP_PATH_V1)(); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GET_USER_PATH_V1)(); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_ADDON_INSTANCE_GET_USER_PATH_V1)( + const KODI_ADDON_INSTANCE_BACKEND_HDL); + typedef char*(ATTR_DL_APIENTRYP PFN_KODI_ADDON_LOCALIZED_STRING_V1)(long); + 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, + uint32_t); + 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_ADDON_INSTANCE_BACKEND_HDL, ssize_t, int); + typedef ssize_t(ATTR_DL_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_WRITE_V1)( + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL, const struct game_stream_properties*); + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GAME_GET_STREAM_BUFFER_V1)( + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL, const struct game_input_event*); + typedef game_proc_address_t(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GAME_HW_GET_PROC_ADDRESS_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GAME_ADD_STREAM_DATA_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, KODI_GAME_STREAM_HANDLE, const struct game_stream_packet*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GAME_CLOSE_STREAM_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, KODI_GAME_STREAM_HANDLE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GAME_CLOSE_V1)(KODI_ADDON_INSTANCE_BACKEND_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_GAME_RELEASE_STREAM_BUFFER_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, KODI_GAME_STREAM_HANDLE, struct game_stream_buffer*); + + // addon-instance/inputstream.h + typedef struct DEMUX_PACKET*( + ATTR_DL_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_ALLOCATE_DEMUX_PACKET_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, int); + typedef struct DEMUX_PACKET*( + ATTR_DL_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_ALLOCATE_ENCRYPTED_DEMUX_PACKET_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, unsigned int, unsigned int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_INPUTSTREAM_FREE_DEMUX_PACKET_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, struct DEMUX_PACKET*); + + // addon-instance/peripheral.h + typedef enum JOYSTICK_FEATURE_TYPE(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_FEATURE_TYPE_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, const char*); + typedef unsigned int(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_FEATURE_COUNT_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, enum JOYSTICK_FEATURE_TYPE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_REFRESH_BUTTON_MAPS_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PERIPHERAL_TRIGGER_SCAN_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL); + + // addon-instance/pvr.h + typedef int(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_MAX_FUTURE_DAYS_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL); + typedef int(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_GET_EPG_MAX_PAST_DAYS_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_ADD_MENU_HOOK_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, const struct PVR_MENUHOOK*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_CONNECTION_STATE_CHANGE_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, enum PVR_CONNECTION_STATE, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_EPG_EVENT_STATE_CHANGE_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, struct EPG_TAG*, enum EPG_EVENT_STATE); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_RECORDING_NOTIFICATION_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, const char*, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRANSFER_CHANNEL_ENTRY_V1)( + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRIGGER_CHANNEL_UPDATE_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRIGGER_EPG_UPDATE_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, unsigned int); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRIGGER_PROVIDERS_UPDATE_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRIGGER_RECORDING_UPDATE_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_PVR_TRIGGER_TIMER_UPDATE_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL); + + // addon-instance/screensaver.h + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_GET_PROPERTIES_V1)( + const KODI_ADDON_INSTANCE_BACKEND_HDL, struct KODI_ADDON_SCREENSAVER_PROPS*); + + // addon-instance/vfs.h + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_VFS_GET_DIR_CB__GET_KEYBOARD_INPUT_V1)( + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL, KODI_CTX_CB_HDL, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_VFS_GET_DIR_CB__SET_ERROR_DIALOG_V1)( + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL, struct VIDEOCODEC_PICTURE*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_VIDEOCODEC_RELEASE_FRAME_BUFFER_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, struct VIDEOCODEC_PICTURE*); + + // addon-instance/visualization.h + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_CLEAR_PRESETS_V1)( + const KODI_ADDON_INSTANCE_BACKEND_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_PROPERTIES_V1)( + const KODI_ADDON_INSTANCE_BACKEND_HDL, struct KODI_ADDON_VISUALIZATION_PROPS*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_TRANSFER_PRESET_V1)( + const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*); + + // addon-instance/web.h + typedef bool(ATTR_DL_APIENTRYP PFN_KODI_ADDON_WEB_IS_MUTED_V1)(KODI_ADDON_INSTANCE_BACKEND_HDL); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_REQUEST_OPEN_SITE_IN_NEW_TAB_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SET_CONTROL_READY_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SET_FULLSCREEN_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SET_ICON_URL_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SET_LOADING_STATE_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, bool, bool, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SET_OPENED_ADDRESS_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SET_OPENED_TITLE_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SET_STATUS_MESSAGE_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SET_TOOLTIP_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, const char*); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_WEB_INHIBIT_SCREENSAVER_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, bool); + typedef void(ATTR_DL_APIENTRYP PFN_KODI_ADDON_WEB_INHIBIT_SHUTDOWN_V1)( + KODI_ADDON_INSTANCE_BACKEND_HDL, bool); + + // gui/general.h + typedef ADDON_HARDWARE_CONTEXT(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_ADDON_PATH_V1 kodi_addon_get_addon_path; + 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_TEMP_PATH_V1 kodi_addon_get_temp_path; + PFN_KODI_ADDON_GET_USER_PATH_V1 kodi_addon_get_user_path; + PFN_KODI_ADDON_INSTANCE_GET_SETTING_BOOL_V1 kodi_addon_instance_get_setting_bool; + PFN_KODI_ADDON_INSTANCE_GET_SETTING_FLOAT_V1 kodi_addon_instance_get_setting_float; + PFN_KODI_ADDON_INSTANCE_GET_SETTING_INT_V1 kodi_addon_instance_get_setting_int; + PFN_KODI_ADDON_INSTANCE_GET_SETTING_STRING_V1 kodi_addon_instance_get_setting_string; + PFN_KODI_ADDON_INSTANCE_GET_USER_PATH_V1 kodi_addon_instance_get_user_path; + PFN_KODI_ADDON_INSTANCE_IS_SETTING_USING_DEFAULT_V1 + kodi_addon_instance_is_setting_using_default; + PFN_KODI_ADDON_INSTANCE_SET_SETTING_BOOL_V1 kodi_addon_instance_set_setting_bool; + PFN_KODI_ADDON_INSTANCE_SET_SETTING_FLOAT_V1 kodi_addon_instance_set_setting_float; + PFN_KODI_ADDON_INSTANCE_SET_SETTING_INT_V1 kodi_addon_instance_set_setting_int; + PFN_KODI_ADDON_INSTANCE_SET_SETTING_STRING_V1 kodi_addon_instance_set_setting_string; + PFN_KODI_ADDON_IS_SETTING_USING_DEFAULT_V1 kodi_addon_is_setting_using_default; + PFN_KODI_ADDON_LOCALIZED_STRING_V1 kodi_addon_localized_string; + 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_HW_GET_PROC_ADDRESS_V1 kodi_addon_game_hw_get_proc_address; + 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; + + // 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; + + // addon-instance/web.h + PFN_KODI_ADDON_WEB_CONTROL_REQUEST_OPEN_SITE_IN_NEW_TAB_V1 + kodi_addon_web_control_request_open_site_in_new_tab; + PFN_KODI_ADDON_WEB_CONTROL_SET_CONTROL_READY_V1 kodi_addon_web_control_set_control_ready; + PFN_KODI_ADDON_WEB_CONTROL_SET_FULLSCREEN_V1 kodi_addon_web_control_set_fullscreen; + PFN_KODI_ADDON_WEB_CONTROL_SET_ICON_URL_V1 kodi_addon_web_control_set_icon_url; + PFN_KODI_ADDON_WEB_CONTROL_SET_LOADING_STATE_V1 kodi_addon_web_control_set_loading_state; + PFN_KODI_ADDON_WEB_CONTROL_SET_OPENED_ADDRESS_V1 kodi_addon_web_control_set_opened_address; + PFN_KODI_ADDON_WEB_CONTROL_SET_OPENED_TITLE_V1 kodi_addon_web_control_set_opened_title; + PFN_KODI_ADDON_WEB_CONTROL_SET_STATUS_MESSAGE_V1 kodi_addon_web_control_set_status_message; + PFN_KODI_ADDON_WEB_CONTROL_SET_TOOLTIP_V1 kodi_addon_web_control_set_tooltip; + PFN_KODI_ADDON_WEB_INHIBIT_SCREENSAVER_V1 kodi_addon_web_inhibit_screensaver; + PFN_KODI_ADDON_WEB_INHIBIT_SHUTDOWN_V1 kodi_addon_web_inhibit_shutdown; + PFN_KODI_ADDON_WEB_IS_MUTED_V1 kodi_addon_web_is_muted; + + // 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 aedcf6434e378..78a45b2cfc062 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,6 +40,9 @@ extern "C" { #endif /* __cplusplus */ + typedef void* KODI_FILE_HDL; + typedef void* KODI_HTTP_HEADER_HDL; + //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // "C" Definitions, structures and enumerators of filesystem //{{{ @@ -169,54 +172,24 @@ extern "C" //}}} - //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ - // "C" Internal interface tables for intercommunications between addon and kodi - //{{{ - - struct KODI_HTTP_HEADER - { - 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 + struct VFS_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; uint32_t maxrate; @@ -224,99 +197,149 @@ extern "C" uint32_t lowrate; }; - 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, uint32_t 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, uint32_t 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 2188db90bd6aa..f4b9c3b54d997 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,7 +9,7 @@ #ifndef C_API_GENERAL_H #define C_API_GENERAL_H -#include +#include "addon_base.h" #ifdef __cplusplus extern "C" @@ -69,56 +69,53 @@ extern "C" } 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* (*unknown_to_utf8)(void* kodiBase, const char* source, bool* ret, bool failOnBadChar); - 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_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/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/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..97fbbc0dad865 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,64 @@ #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..f041111077ad2 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_CONTEXT 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 eb7dde09c9fab..70788a3c9b035 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 @@ -2,6 +2,7 @@ # See xbmc/addons/kodi-dev-kit/tools/code-generator.py. set(HEADERS + action.h action_ids.h ) diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/input/action.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/input/action.h new file mode 100644 index 0000000000000..7749ba7374ce6 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/gui/input/action.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. + */ + +#ifndef C_API_GUI_ACTION_H +#define C_API_GUI_ACTION_H + +#include "action_ids.h" + +#include + +#define ADDON_ACTION_AMOUNT_MAX 6 // Must be at least 6 + +struct KODI_ADDON_ACTION_DATA +{ + enum ADDON_ACTION id; + const char* name; + float amount[ADDON_ACTION_AMOUNT_MAX]; + float repeat; + unsigned int hold_time; + unsigned int button_code; + wchar_t unicode; + const char* text; +}; + +#endif /* !C_API_GUI_ACTION_H */ 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..c4f24c1b0c6ef 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,48 @@ #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..43ca955d009ca 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,10 @@ #ifndef C_API_GUI_WINDOW_H #define C_API_GUI_WINDOW_H -#include "definitions.h" +#include "../addon_base.h" +#include "input/action.h" #include "input/action_ids.h" +#include "list_item.h" #include @@ -22,157 +24,157 @@ 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..064259d7ff7bd 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,29 @@ #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/version.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/version.h new file mode 100644 index 0000000000000..7bdcd0f75bc3a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/version.h @@ -0,0 +1,64 @@ +/* + * 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 + +#ifndef __INTRODUCED_IN_KODI +#define __INTRODUCED_IN_KODI(api_level) +#endif +#ifndef __DEPRECATED_IN_KODI +#define __DEPRECATED_IN_KODI(api_level) +#endif +#ifndef __REMOVED_IN_KODI +#define __REMOVED_IN_KODI(api_level) +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* !C_API_VERSION_H */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/General.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/General.h index 3aaa854ae5094..632720176a623 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/General.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/General.h @@ -35,7 +35,7 @@ namespace gui inline void ATTR_DLL_LOCAL Lock() { using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->general->lock(); + CPrivateBase::ifc.toKodi->kodi_gui->general->lock(); } //------------------------------------------------------------------------------ @@ -46,7 +46,7 @@ inline void ATTR_DLL_LOCAL Lock() inline void ATTR_DLL_LOCAL Unlock() { using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->general->unlock(); + CPrivateBase::ifc.toKodi->kodi_gui->general->unlock(); } //------------------------------------------------------------------------------ @@ -59,8 +59,8 @@ inline void ATTR_DLL_LOCAL Unlock() inline int ATTR_DLL_LOCAL GetScreenHeight() { using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->general->get_screen_height( - CPrivateBase::m_interface->toKodi->kodiBase); + return CPrivateBase::ifc.toKodi->kodi_gui->general->get_screen_height( + CPrivateBase::ifc.toKodi->kodiBase); } //------------------------------------------------------------------------------ @@ -73,8 +73,8 @@ inline int ATTR_DLL_LOCAL GetScreenHeight() inline int ATTR_DLL_LOCAL GetScreenWidth() { using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->general->get_screen_width( - CPrivateBase::m_interface->toKodi->kodiBase); + return CPrivateBase::ifc.toKodi->kodi_gui->general->get_screen_width( + CPrivateBase::ifc.toKodi->kodiBase); } //------------------------------------------------------------------------------ @@ -87,8 +87,8 @@ inline int ATTR_DLL_LOCAL GetScreenWidth() inline int ATTR_DLL_LOCAL GetVideoResolution() { using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->general->get_video_resolution( - CPrivateBase::m_interface->toKodi->kodiBase); + return CPrivateBase::ifc.toKodi->kodi_gui->general->get_video_resolution( + CPrivateBase::ifc.toKodi->kodiBase); } //------------------------------------------------------------------------------ @@ -111,8 +111,8 @@ inline int ATTR_DLL_LOCAL GetVideoResolution() inline int ATTR_DLL_LOCAL GetCurrentWindowDialogId() { using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->general->get_current_window_dialog_id( - CPrivateBase::m_interface->toKodi->kodiBase); + return CPrivateBase::ifc.toKodi->kodi_gui->general->get_current_window_dialog_id( + CPrivateBase::ifc.toKodi->kodiBase); } //------------------------------------------------------------------------------ @@ -135,8 +135,8 @@ inline int ATTR_DLL_LOCAL GetCurrentWindowDialogId() inline int ATTR_DLL_LOCAL GetCurrentWindowId() { using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->general->get_current_window_id( - CPrivateBase::m_interface->toKodi->kodiBase); + return CPrivateBase::ifc.toKodi->kodi_gui->general->get_current_window_id( + CPrivateBase::ifc.toKodi->kodiBase); } //------------------------------------------------------------------------------ @@ -165,8 +165,8 @@ inline int ATTR_DLL_LOCAL GetCurrentWindowId() inline kodi::HardwareContext GetHWContext() { using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->general->get_hw_context( - CPrivateBase::m_interface->toKodi->kodiBase); + return CPrivateBase::ifc.toKodi->kodi_gui->general->get_hw_context( + CPrivateBase::ifc.toKodi->kodiBase); } //------------------------------------------------------------------------------ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/ListItem.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/ListItem.h index 0d3e057113178..8eed9eff68655 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/ListItem.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/ListItem.h @@ -30,7 +30,7 @@ class ATTR_DLL_LOCAL CAddonGUIControlBase protected: explicit CAddonGUIControlBase(CAddonGUIControlBase* window) : m_controlHandle(nullptr), - m_interface(::kodi::addon::CPrivateBase::m_interface->toKodi), + m_interface(::kodi::addon::CPrivateBase::ifc.toKodi), m_Window(window) { } 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 93d75cbbe0e92..0d7cbe53c0d80 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 @@ -67,15 +69,13 @@ namespace ContextMenu /// 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 = CPrivateBase::m_interface->toKodi->kodi_gui->dialogContextMenu->open( - CPrivateBase::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; } @@ -115,15 +115,13 @@ 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 = CPrivateBase::m_interface->toKodi->kodi_gui->dialogContextMenu->open( - CPrivateBase::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; } @@ -163,15 +161,13 @@ inline int ATTR_DLL_LOCAL 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 = CPrivateBase::m_interface->toKodi->kodi_gui->dialogContextMenu->open( - CPrivateBase::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 3c21877c327c9..40272af983c73 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 @@ -66,10 +68,7 @@ class ATTR_DLL_LOCAL CExtendedProgress /// explicit CExtendedProgress(const std::string& title = "") { - using namespace ::kodi::addon; - m_DialogHandle = - CPrivateBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->new_dialog( - CPrivateBase::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 !!!"); @@ -82,10 +81,8 @@ class ATTR_DLL_LOCAL CExtendedProgress /// ~CExtendedProgress() { - using namespace ::kodi::addon; if (m_DialogHandle) - CPrivateBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->delete_dialog( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle); + kodi::dl::api.kodi_gui_dialogs_extended_progress_delete_dialog(m_DialogHandle); } //---------------------------------------------------------------------------- @@ -97,16 +94,13 @@ class ATTR_DLL_LOCAL CExtendedProgress /// std::string Title() const { - using namespace ::kodi::addon; std::string text; - char* strMsg = CPrivateBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->get_title( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - strMsg); + free(strMsg); } return text; } @@ -120,9 +114,7 @@ class ATTR_DLL_LOCAL CExtendedProgress /// void SetTitle(const std::string& title) { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_title( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle, title.c_str()); + kodi::dl::api.kodi_gui_dialogs_extended_progress_set_title(m_DialogHandle, title.c_str()); } //---------------------------------------------------------------------------- @@ -134,16 +126,13 @@ class ATTR_DLL_LOCAL CExtendedProgress /// std::string Text() const { - using namespace ::kodi::addon; std::string text; - char* strMsg = CPrivateBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->get_text( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - strMsg); + free(strMsg); } return text; } @@ -157,9 +146,7 @@ class ATTR_DLL_LOCAL CExtendedProgress /// void SetText(const std::string& text) { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_text( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle, text.c_str()); + kodi::dl::api.kodi_gui_dialogs_extended_progress_set_text(m_DialogHandle, text.c_str()); } //---------------------------------------------------------------------------- @@ -171,9 +158,7 @@ class ATTR_DLL_LOCAL CExtendedProgress /// bool IsFinished() const { - using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->is_finished( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle); + return kodi::dl::api.kodi_gui_dialogs_extended_progress_is_finished(m_DialogHandle); } //---------------------------------------------------------------------------- @@ -183,9 +168,7 @@ class ATTR_DLL_LOCAL CExtendedProgress /// void MarkFinished() { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->mark_finished( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle); + kodi::dl::api.kodi_gui_dialogs_extended_progress_mark_finished(m_DialogHandle); } //---------------------------------------------------------------------------- @@ -197,9 +180,7 @@ class ATTR_DLL_LOCAL CExtendedProgress /// float Percentage() const { - using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->get_percentage( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle); + return kodi::dl::api.kodi_gui_dialogs_extended_progress_get_percentage(m_DialogHandle); } //---------------------------------------------------------------------------- @@ -211,9 +192,7 @@ class ATTR_DLL_LOCAL CExtendedProgress /// void SetPercentage(float percentage) { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_percentage( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle, percentage); + kodi::dl::api.kodi_gui_dialogs_extended_progress_set_percentage(m_DialogHandle, percentage); } //---------------------------------------------------------------------------- @@ -226,9 +205,8 @@ class ATTR_DLL_LOCAL CExtendedProgress /// void SetProgress(int currentItem, int itemCount) { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_progress( - CPrivateBase::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 b7550f2c23c73..cff8ef41c573f 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 @@ -72,17 +75,14 @@ inline bool ATTR_DLL_LOCAL ShowAndGetDirectory(const std::string& shares, std::string& path, bool writeOnly = false) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CPrivateBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_directory( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -109,17 +109,15 @@ inline bool ATTR_DLL_LOCAL ShowAndGetFile(const std::string& shares, bool useThumbs = false, bool useFileDirectories = false) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CPrivateBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -149,18 +147,15 @@ inline bool ATTR_DLL_LOCAL ShowAndGetFileFromDir(const std::string& directory, bool useFileDirectories = false, bool singleList = false) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = - CPrivateBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file_from_dir( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -186,18 +181,16 @@ inline bool ATTR_DLL_LOCAL ShowAndGetFileList(const std::string& shares, bool useThumbs = false, bool useFileDirectories = false) { - using namespace ::kodi::addon; char** list = nullptr; - unsigned int listSize = 0; - bool ret = CPrivateBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file_list( - CPrivateBase::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]); - CPrivateBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->clear_file_list( - CPrivateBase::m_interface->toKodi->kodiBase, &list, listSize); + kodi::dl::api.kodi_gui_dialogs_file_browser_clear_file_list(&list, listSize); } return ret; } @@ -220,17 +213,14 @@ inline bool ATTR_DLL_LOCAL ShowAndGetSource(std::string& path, const std::string& additionalShare = "", const std::string& type = "") { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CPrivateBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_source( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -249,17 +239,14 @@ 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 = CPrivateBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_image( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -278,24 +265,22 @@ 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 = - CPrivateBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_image_list( - CPrivateBase::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]); - CPrivateBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->clear_file_list( - CPrivateBase::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 9aded507007b0..ba59544691607 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 @@ -77,17 +79,13 @@ inline bool ATTR_DLL_LOCAL ShowAndGetInput(std::string& text, bool hiddenInput = false, unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = - CPrivateBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_input_with_head( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -111,16 +109,13 @@ inline bool ATTR_DLL_LOCAL ShowAndGetInput(std::string& text, bool allowEmptyResult, unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CPrivateBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_input( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -145,17 +140,14 @@ inline bool ATTR_DLL_LOCAL ShowAndGetNewPassword(std::string& newPassword, bool allowEmptyResult, unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; + ; char* retString = nullptr; - bool ret = CPrivateBase::m_interface->toKodi->kodi_gui->dialogKeyboard - ->show_and_get_new_password_with_head( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -176,15 +168,13 @@ inline bool ATTR_DLL_LOCAL ShowAndGetNewPassword(std::string& newPassword, inline bool ATTR_DLL_LOCAL ShowAndGetNewPassword(std::string& newPassword, unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CPrivateBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_new_password( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -251,17 +241,13 @@ inline bool ATTR_DLL_LOCAL ShowAndVerifyNewPassword(std::string& newPassword, bool allowEmptyResult, unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CPrivateBase::m_interface->toKodi->kodi_gui->dialogKeyboard - ->show_and_verify_new_password_with_head( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -282,16 +268,13 @@ inline bool ATTR_DLL_LOCAL ShowAndVerifyNewPassword(std::string& newPassword, inline bool ATTR_DLL_LOCAL ShowAndVerifyNewPassword(std::string& newPassword, unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; bool ret = - CPrivateBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_verify_new_password( - CPrivateBase::m_interface->toKodi->kodiBase, &retString, autoCloseMs); + kodi::dl::api.kodi_gui_dialogs_keyboard_show_and_verify_new_password(&retString, autoCloseMs); if (retString != nullptr) { newPassword = retString; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -316,16 +299,13 @@ inline int ATTR_DLL_LOCAL ShowAndVerifyPassword(std::string& password, int retries, unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; - int ret = CPrivateBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_verify_password( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -350,16 +330,13 @@ inline bool ATTR_DLL_LOCAL ShowAndGetFilter(std::string& text, bool searching, unsigned int autoCloseMs = 0) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CPrivateBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_filter( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -377,9 +354,8 @@ inline bool ATTR_DLL_LOCAL ShowAndGetFilter(std::string& text, inline bool ATTR_DLL_LOCAL SendTextToActiveKeyboard(const std::string& text, bool closeKeyboard = false) { - using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->dialogKeyboard->send_text_to_active_keyboard( - CPrivateBase::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); } //------------------------------------------------------------------------------ @@ -391,9 +367,7 @@ inline bool ATTR_DLL_LOCAL SendTextToActiveKeyboard(const std::string& text, /// inline bool ATTR_DLL_LOCAL IsKeyboardActivated() { - using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->dialogKeyboard->is_keyboard_activated( - CPrivateBase::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 54b77206f7e84..9229d2d1e2814 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 @@ -49,15 +49,12 @@ namespace Numeric /// inline bool ATTR_DLL_LOCAL ShowAndVerifyNewPassword(std::string& newPassword) { - using namespace ::kodi::addon; char* pw = nullptr; - bool ret = - CPrivateBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_verify_new_password( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, pw); + free(pw); } return ret; } @@ -126,9 +123,8 @@ inline int ATTR_DLL_LOCAL ShowAndVerifyPassword(const std::string& password, const std::string& heading, int retries) { - using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_verify_password( - CPrivateBase::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); } //------------------------------------------------------------------------------ @@ -147,16 +143,13 @@ inline bool ATTR_DLL_LOCAL ShowAndVerifyInput(std::string& toVerify, const std::string& heading, bool verifyInput) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CPrivateBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_verify_input( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -194,9 +187,7 @@ inline bool ATTR_DLL_LOCAL ShowAndVerifyInput(std::string& toVerify, /// inline bool ATTR_DLL_LOCAL ShowAndGetTime(tm& time, const std::string& heading) { - using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_time( - CPrivateBase::m_interface->toKodi->kodiBase, &time, heading.c_str()); + return kodi::dl::api.kodi_gui_dialogs_numeric_show_and_get_time(&time, heading.c_str()); } //------------------------------------------------------------------------------ @@ -232,9 +223,7 @@ inline bool ATTR_DLL_LOCAL ShowAndGetTime(tm& time, const std::string& heading) /// inline bool ATTR_DLL_LOCAL ShowAndGetDate(tm& date, const std::string& heading) { - using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_date( - CPrivateBase::m_interface->toKodi->kodiBase, &date, heading.c_str()); + return kodi::dl::api.kodi_gui_dialogs_numeric_show_and_get_date(&date, heading.c_str()); } //------------------------------------------------------------------------------ @@ -250,15 +239,13 @@ inline bool ATTR_DLL_LOCAL ShowAndGetDate(tm& date, 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 = CPrivateBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_ip_address( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -297,16 +284,13 @@ 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 = CPrivateBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_number( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::m_interface->toKodi->kodiBase, - retString); + free(retString); } return ret; } @@ -324,15 +308,13 @@ inline bool ATTR_DLL_LOCAL ShowAndGetNumber(std::string& input, /// inline bool ATTR_DLL_LOCAL ShowAndGetSeconds(std::string& time, const std::string& heading) { - using namespace ::kodi::addon; char* retString = nullptr; - bool ret = CPrivateBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_seconds( - CPrivateBase::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; - CPrivateBase::m_interface->toKodi->free_string(CPrivateBase::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 a9fcb3fd3f7e4..3901e3b77cd72 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 @@ -54,9 +54,7 @@ namespace OK /// inline void ATTR_DLL_LOCAL ShowAndGetInput(const std::string& heading, const std::string& text) { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogOK->show_and_get_input_single_text( - CPrivateBase::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()); } //------------------------------------------------------------------------------ @@ -85,10 +83,8 @@ inline void ATTR_DLL_LOCAL ShowAndGetInput(const std::string& heading, const std::string& line1, const std::string& line2) { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogOK->show_and_get_input_line_text( - CPrivateBase::m_interface->toKodi->kodiBase, heading.c_str(), line0.c_str(), line1.c_str(), - line2.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()); } //------------------------------------------------------------------------------ } // namespace OK 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 3dfd8badbf45e..775f6a1336999 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 @@ -58,9 +58,7 @@ class ATTR_DLL_LOCAL CProgress /// CProgress() { - using namespace ::kodi::addon; - m_DialogHandle = CPrivateBase::m_interface->toKodi->kodi_gui->dialogProgress->new_dialog( - CPrivateBase::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 ATTR_DLL_LOCAL CProgress /// ~CProgress() { - using namespace ::kodi::addon; if (m_DialogHandle) - CPrivateBase::m_interface->toKodi->kodi_gui->dialogProgress->delete_dialog( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle); + kodi::dl::api.kodi_gui_dialogs_progress_delete_dialog(m_DialogHandle); } //---------------------------------------------------------------------------- @@ -84,12 +80,7 @@ class ATTR_DLL_LOCAL CProgress /// @ingroup cpp_kodi_gui_dialogs_CProgress /// @brief To open the dialog /// - void Open() - { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogProgress->open( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle); - } + void Open() { kodi::dl::api.kodi_gui_dialogs_progress_open(m_DialogHandle); } //---------------------------------------------------------------------------- //============================================================================ @@ -100,9 +91,7 @@ class ATTR_DLL_LOCAL CProgress /// void SetHeading(const std::string& heading) { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogProgress->set_heading( - CPrivateBase::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 ATTR_DLL_LOCAL CProgress /// void SetLine(unsigned int iLine, const std::string& line) { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogProgress->set_line( - CPrivateBase::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 ATTR_DLL_LOCAL CProgress /// void SetCanCancel(bool canCancel) { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogProgress->set_can_cancel( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle, canCancel); + kodi::dl::api.kodi_gui_dialogs_progress_set_can_cancel(m_DialogHandle, canCancel); } //---------------------------------------------------------------------------- @@ -143,9 +128,7 @@ class ATTR_DLL_LOCAL CProgress /// bool IsCanceled() const { - using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->dialogProgress->is_canceled( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle); + return kodi::dl::api.kodi_gui_dialogs_progress_is_canceled(m_DialogHandle); } //---------------------------------------------------------------------------- @@ -157,9 +140,7 @@ class ATTR_DLL_LOCAL CProgress /// void SetPercentage(int percentage) { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogProgress->set_percentage( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle, percentage); + kodi::dl::api.kodi_gui_dialogs_progress_set_percentage(m_DialogHandle, percentage); } //---------------------------------------------------------------------------- @@ -171,9 +152,7 @@ class ATTR_DLL_LOCAL CProgress /// int GetPercentage() const { - using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->dialogProgress->get_percentage( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle); + return kodi::dl::api.kodi_gui_dialogs_progress_get_percentage(m_DialogHandle); } //---------------------------------------------------------------------------- @@ -185,9 +164,7 @@ class ATTR_DLL_LOCAL CProgress /// void ShowProgressBar(bool onOff) { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogProgress->show_progress_bar( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle, onOff); + kodi::dl::api.kodi_gui_dialogs_progress_show_progress_bar(m_DialogHandle, onOff); } //---------------------------------------------------------------------------- @@ -199,9 +176,7 @@ class ATTR_DLL_LOCAL CProgress /// void SetProgressMax(int max) { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogProgress->set_progress_max( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle, max); + kodi::dl::api.kodi_gui_dialogs_progress_set_progress_max(m_DialogHandle, max); } //---------------------------------------------------------------------------- @@ -213,9 +188,7 @@ class ATTR_DLL_LOCAL CProgress /// void SetProgressAdvance(int steps = 1) { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogProgress->set_progress_advance( - CPrivateBase::m_interface->toKodi->kodiBase, m_DialogHandle, steps); + kodi::dl::api.kodi_gui_dialogs_progress_set_progress_advance(m_DialogHandle, steps); } //---------------------------------------------------------------------------- @@ -225,12 +198,7 @@ class ATTR_DLL_LOCAL CProgress /// /// @return True if aborted /// - bool Abort() - { - using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->dialogProgress->abort( - CPrivateBase::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 09bccc31af9a3..7479517250449 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 @@ -115,9 +117,8 @@ inline int ATTR_DLL_LOCAL Show(const std::string& heading, { cEntries[i] = entries[i].c_str(); } - int ret = CPrivateBase::m_interface->toKodi->kodi_gui->dialogSelect->open( - CPrivateBase::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; } @@ -167,7 +168,6 @@ inline int ATTR_DLL_LOCAL Show(const std::string& heading, 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 +176,8 @@ inline int ATTR_DLL_LOCAL Show(const std::string& heading, if (selected == -1 && entries[i].selected) selected = i; } - int ret = CPrivateBase::m_interface->toKodi->kodi_gui->dialogSelect->open( - CPrivateBase::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; @@ -235,20 +234,18 @@ 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 = CPrivateBase::m_interface->toKodi->kodi_gui->dialogSelect->open_multi_select( - CPrivateBase::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 7c2e6ca8046ca..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 @@ -94,9 +94,7 @@ namespace TextViewer /// inline void ATTR_DLL_LOCAL Show(const std::string& heading, const std::string& text) { - using namespace ::kodi::addon; - CPrivateBase::m_interface->toKodi->kodi_gui->dialogTextViewer->open( - CPrivateBase::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 e4d3d1201e09d..3678604eb0852 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 @@ -77,10 +77,8 @@ inline bool ATTR_DLL_LOCAL ShowAndGetInput(const std::string& heading, const std::string& noLabel = "", const std::string& yesLabel = "") { - using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->dialogYesNo->show_and_get_input_single_text( - CPrivateBase::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()); } //------------------------------------------------------------------------------ @@ -121,10 +119,9 @@ inline bool ATTR_DLL_LOCAL ShowAndGetInput(const std::string& heading, const std::string& noLabel = "", const std::string& yesLabel = "") { - using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->dialogYesNo->show_and_get_input_line_text( - CPrivateBase::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()); } //------------------------------------------------------------------------------ @@ -171,11 +168,9 @@ inline bool ATTR_DLL_LOCAL ShowAndGetInput(const std::string& heading, const std::string& noLabel = "", const std::string& yesLabel = "") { - using namespace ::kodi::addon; - return CPrivateBase::m_interface->toKodi->kodi_gui->dialogYesNo - ->show_and_get_input_line_button_text( - CPrivateBase::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/GLonDX.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/GLonDX.h index 9ba76eacc3653..508726a7846d4 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 @@ -12,13 +12,14 @@ #if defined(WIN32) && defined(HAS_ANGLE) +#include "../../AddonBase.h" +#include "../../gui/General.h" + #include #include #include #include #include -#include -#include #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 ae78b7c36032f..88fb8241cfb15 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 @@ -12,13 +12,13 @@ #ifdef __cplusplus +#include "../../AddonBase.h" +#include "../../Filesystem.h" + #include #include #include -#include -#include - #define LOG_SIZE 1024 #define GLchar char @@ -51,7 +51,7 @@ class ATTR_DLL_LOCAL 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(); diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/Action.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/Action.h new file mode 100644 index 0000000000000..50875093fa913 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/Action.h @@ -0,0 +1,343 @@ +/* + * 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.h" +#include "ActionIDs.h" + +#ifdef __cplusplus + +#include + +namespace kodi +{ + +namespace addon +{ + class CInstanceWeb; +} /* namespace addon */ + +namespace gui +{ + +class CWindow; + +namespace input +{ + +/// @defgroup cpp_kodi_gui_Defs_CAction class CAction +/// @ingroup cpp_kodi_gui_Defs +/// @brief **Action signal class**\n +/// Class e to manage given actions calls from Kodi. +/// +/// This used by @ref kodi::gui::CWindow::OnAction() and partly on +/// other parts. +/// +///@{ +class CAction +{ +public: + //============================================================================ + /// @brief Default constructor with values set to default/empty. + /// + CAction() = default; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Constructor for unicode date e.g. from Keyboard. + /// + /// @param[in] actionID ID to use, see @ref ADDON_ACTION about possible values + /// @param[in] unicode Unicode character to give on construction + /// + CAction(ADDON_ACTION actionID, wchar_t unicode) + : m_id(actionID), + m_unicode(unicode) + { + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Constructor with set also used name. + /// + /// @param[in] actionID ID to use, see @ref ADDON_ACTION about possible values + /// @param[in] name Action name to set + /// + CAction(ADDON_ACTION actionID, const std::string& name) + : m_id(actionID), + m_name(name) + { + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Constructor about joystick analog signals. + /// + /// @param[in] actionID ID to use, see @ref ADDON_ACTION about possible values + /// @param[in] amount1 + /// @param[in] amount2 + /// @param[in] name ]optional] Action name to set + /// @param[in] holdTime ]optional] Time how long the key was pressed + /// + CAction(ADDON_ACTION actionID, + float amount1 = 1.0f, + float amount2 = 0.0f, + const std::string& name = "", + unsigned int holdTime = 0) + : m_id(actionID), + m_name(name), + m_holdTime(holdTime) + { + m_amount[0] = amount1; + m_amount[1] = amount2; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Constructor about joystick analog signals. + /// + /// @param[in] actionID ID to use, see @ref ADDON_ACTION about possible values + /// @param[in] state + /// @param[in] posX + /// @param[in] posY + /// @param[in] offsetX + /// @param[in] offsetY + /// @param[in] posX + /// @param[in] velocityX + /// @param[in] velocityY + /// @param[in] name ]optional] Action name to set + /// + CAction(ADDON_ACTION actionID, + unsigned int state, + float posX, + float posY, + float offsetX, + float offsetY, + float velocityX = 0.0f, + float velocityY = 0.0f, + const std::string& name = "") + : m_id(actionID), + m_name(name), + m_holdTime(state) + { + m_amount[0] = posX; + m_amount[1] = posY; + m_amount[2] = offsetX; + m_amount[3] = offsetY; + m_amount[4] = velocityX; + m_amount[5] = velocityY; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Clone constructor. + /// + CAction(const CAction& other) { *this = other; } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Copy class to another. + /// + /// + CAction& operator=(const CAction& rhs) + { + if (this != &rhs) + { + m_id = rhs.m_id; + for (unsigned int i = 0; i < ADDON_ACTION_AMOUNT_MAX; i++) + m_amount[i] = rhs.m_amount[i]; + m_name = rhs.m_name; + m_repeat = rhs.m_repeat; + m_buttonCode = rhs.m_buttonCode; + m_unicode = rhs.m_unicode; + m_holdTime = rhs.m_holdTime; + m_text = rhs.m_text; + } + return *this; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Identifier of the action. + /// + /// @return id of the action + /// + ADDON_ACTION GetID() const { return m_id; } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Is this an action from the mouse. + /// + /// @return true if this is a mouse action, false otherwise + /// + bool IsMouse() const + { + return (m_id >= ADDON_ACTION_MOUSE_START && m_id <= ADDON_ACTION_MOUSE_END); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Check action is gesture signal. + /// + /// @return True if gesture, false otherwise + /// + bool IsGesture() const + { + return (m_id >= ADDON_ACTION_GESTURE_NOTIFY && m_id <= ADDON_ACTION_GESTURE_END); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Check action is analog signal. + /// + /// @return True if analog, false otherwise + /// + bool IsAnalog() const + { + switch (m_id) + { + case ADDON_ACTION_ANALOG_SEEK_FORWARD: + case ADDON_ACTION_ANALOG_SEEK_BACK: + case ADDON_ACTION_SCROLL_UP: + case ADDON_ACTION_SCROLL_DOWN: + case ADDON_ACTION_ANALOG_FORWARD: + case ADDON_ACTION_ANALOG_REWIND: + case ADDON_ACTION_ANALOG_MOVE: + case ADDON_ACTION_ANALOG_MOVE_X_LEFT: + case ADDON_ACTION_ANALOG_MOVE_X_RIGHT: + case ADDON_ACTION_ANALOG_MOVE_Y_UP: + case ADDON_ACTION_ANALOG_MOVE_Y_DOWN: + case ADDON_ACTION_CURSOR_LEFT: + case ADDON_ACTION_CURSOR_RIGHT: + case ADDON_ACTION_VOLUME_UP: + case ADDON_ACTION_VOLUME_DOWN: + case ADDON_ACTION_ZOOM_IN: + case ADDON_ACTION_ZOOM_OUT: + return true; + default: + return false; + } + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Human-readable name of the action. + /// + /// @return name of the action + /// + const std::string& GetName() const { return m_name; } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Text of the action if any. + /// + /// @return text payload of this action. + /// + const std::string& GetText() const { return m_text; } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Set the text payload of the action. + /// + /// @param text to be set + /// + void SetText(const std::string& text) { m_text = text; } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Get an amount associated with this action. + /// + /// @param[in] index [optional] index of amount to retrieve, defaults to 0 + /// @return an amount associated with this action + /// + float GetAmount(unsigned int index = 0) const + { + return (index < ADDON_ACTION_AMOUNT_MAX) ? m_amount[index] : 0; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Reset all amount values to zero. + /// + void ClearAmount() + { + for (float& amount : m_amount) + amount = 0; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Unicode value associated with this action. + /// + /// @return unicode value associated with this action, for keyboard input. + /// + wchar_t GetUnicode() const { return m_unicode; } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Time in ms that the key has been held. + /// + /// @return time that the key has been held down in ms. + /// + unsigned int GetHoldTime() const { return m_holdTime; } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Time since last repeat in ms. + /// + /// @return time since last repeat in ms. Returns 0 if unknown. + /// + float GetRepeat() const { return m_repeat; } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @brief Button code that triggered this action. + /// + /// @return button code + /// + unsigned int GetButtonCode() const { return m_buttonCode; } + //---------------------------------------------------------------------------- + +private: + friend class kodi::gui::CWindow; + friend class kodi::addon::CInstanceWeb; + + CAction(const KODI_ADDON_ACTION_DATA* addonData) + { + if (!addonData) + return; + + m_id = addonData->id; + m_name = addonData->name; + m_repeat = addonData->repeat; + m_holdTime = addonData->hold_time; + m_buttonCode = addonData->button_code; + m_unicode = addonData->unicode; + m_text = addonData->text; + for (unsigned int i = 0; i < ADDON_ACTION_AMOUNT_MAX; ++i) + m_amount[i] = addonData->amount[i]; + } + + ADDON_ACTION m_id = ADDON_ACTION_NONE; + std::string m_name; + + float m_amount[ADDON_ACTION_AMOUNT_MAX] = {}; + + float m_repeat = 0.0f; + unsigned int m_holdTime = 0; + unsigned int m_buttonCode = 0; + wchar_t m_unicode = 0; + std::string m_text; +}; +///@} + +} /* namespace input */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ 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 index 769cad2456942..bf94a4779f9e9 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/CMakeLists.txt +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/CMakeLists.txt @@ -2,6 +2,7 @@ # See xbmc/addons/kodi-dev-kit/tools/code-generator.py. set(HEADERS + Action.h ActionIDs.h ) 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 f369205e86ad9..ba17b5583d6a9 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/gui/renderHelper.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/renderHelper.h @@ -64,14 +64,14 @@ namespace gui inline std::shared_ptr ATTR_DLL_LOCAL GetRenderHelper() { using namespace ::kodi::addon; - if (static_cast(CPrivateBase::m_interface->addonBase)->m_renderHelper) - return static_cast(CPrivateBase::m_interface->addonBase)->m_renderHelper; + if (kodi::dl::local.addonBase->m_renderHelper) + return kodi::dl::local.addonBase->m_renderHelper; std::shared_ptr renderHelper(new CRenderHelper()); if (!renderHelper->Init()) return nullptr; - static_cast(CPrivateBase::m_interface->addonBase)->m_renderHelper = + kodi::dl::local.addonBase->m_renderHelper = renderHelper; // Hold on base for other types return renderHelper; } 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 2003171f324a3..bb34400bd1941 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/tools/DllHelper.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/tools/DllHelper.h @@ -10,11 +10,13 @@ #ifdef __cplusplus +#include "../AddonBase.h" +#include "../Filesystem.h" +#include "../General.h" + #include #include -#include -#include //============================================================================== /// @ingroup cpp_kodi_tools_CDllHelper diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/versions.h b/xbmc/addons/kodi-dev-kit/include/kodi/versions.h deleted file mode 100644 index bbfad40f4f548..0000000000000 --- a/xbmc/addons/kodi-dev-kit/include/kodi/versions.h +++ /dev/null @@ -1,517 +0,0 @@ -/* - * Copyright (C) 2016-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 - -#ifndef KODI_VERSIONS_H -#define KODI_VERSIONS_H - -#include - -#define STR_HELPER(x) #x -#define STR(x) STR_HELPER(x) - -/* - *------------------------------------------------------------------------------ - * Some parts on headers are only be used for Kodi itself and internally (not - * for add-on development). - * - * For this reason also no doxygen part with "///" defined there. - * ----------------------------------------------------------------------------- - */ - -/* - * Versions of all add-on globals and instances are defined below. - * - * This is added here and not in related header to prevent not - * needed includes during compile. Also have it here a better - * overview. - */ - -// Ignore clang here, as this must be good in overview and as the main reason, -// because cmake uses this area in this form to perform its addon dependency -// check. -// clang-format off -#define ADDON_GLOBAL_VERSION_MAIN "2.0.1" -#define ADDON_GLOBAL_VERSION_MAIN_MIN "2.0.0" -#define ADDON_GLOBAL_VERSION_MAIN_XML_ID "kodi.binary.global.main" -#define ADDON_GLOBAL_VERSION_MAIN_DEPENDS "AddonBase.h" \ - "addon-instance/" \ - "c-api/addon_base.h" - -#define ADDON_GLOBAL_VERSION_GENERAL "1.0.5" -#define ADDON_GLOBAL_VERSION_GENERAL_MIN "1.0.4" -#define ADDON_GLOBAL_VERSION_GENERAL_XML_ID "kodi.binary.global.general" -#define ADDON_GLOBAL_VERSION_GENERAL_DEPENDS "General.h" - -#define ADDON_GLOBAL_VERSION_GUI "5.15.0" -#define ADDON_GLOBAL_VERSION_GUI_MIN "5.15.0" -#define ADDON_GLOBAL_VERSION_GUI_XML_ID "kodi.binary.global.gui" -#define ADDON_GLOBAL_VERSION_GUI_DEPENDS "c-api/gui/input/action_ids.h" \ - "c-api/gui/" \ - "gui/" - -#define ADDON_GLOBAL_VERSION_AUDIOENGINE "1.1.1" -#define ADDON_GLOBAL_VERSION_AUDIOENGINE_MIN "1.1.0" -#define ADDON_GLOBAL_VERSION_AUDIOENGINE_XML_ID "kodi.binary.global.audioengine" -#define ADDON_GLOBAL_VERSION_AUDIOENGINE_DEPENDS "AudioEngine.h" \ - "c-api/audio_engine.h" - -#define ADDON_GLOBAL_VERSION_FILESYSTEM "1.1.7" -#define ADDON_GLOBAL_VERSION_FILESYSTEM_MIN "1.1.7" -#define ADDON_GLOBAL_VERSION_FILESYSTEM_XML_ID "kodi.binary.global.filesystem" -#define ADDON_GLOBAL_VERSION_FILESYSTEM_DEPENDS "Filesystem.h" \ - "c-api/filesystem.h" \ - "gui/gl/Shader.h" \ - "tools/DllHelper.h" - -#define ADDON_GLOBAL_VERSION_NETWORK "1.0.4" -#define ADDON_GLOBAL_VERSION_NETWORK_MIN "1.0.0" -#define ADDON_GLOBAL_VERSION_NETWORK_XML_ID "kodi.binary.global.network" -#define ADDON_GLOBAL_VERSION_NETWORK_DEPENDS "Network.h" \ - "c-api/network.h" - -#define ADDON_GLOBAL_VERSION_TOOLS "1.0.4" -#define ADDON_GLOBAL_VERSION_TOOLS_MIN "1.0.0" -#define ADDON_GLOBAL_VERSION_TOOLS_XML_ID "kodi.binary.global.tools" -#define ADDON_GLOBAL_VERSION_TOOLS_DEPENDS "tools/DllHelper.h" \ - "tools/EndTime.h" \ - "tools/StringUtils.h" \ - "tools/Thread.h" \ - "tools/Timer.h" - -#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/audiodecoder.h" \ - "addon-instance/AudioDecoder.h" - -#define ADDON_INSTANCE_VERSION_AUDIOENCODER "3.0.0" -#define ADDON_INSTANCE_VERSION_AUDIOENCODER_MIN "3.0.0" -#define ADDON_INSTANCE_VERSION_AUDIOENCODER_XML_ID "kodi.binary.instance.audioencoder" -#define ADDON_INSTANCE_VERSION_AUDIOENCODER_DEPENDS "c-api/addon-instance/audioencoder.h" \ - "addon-instance/AudioEncoder.h" - -#define ADDON_INSTANCE_VERSION_GAME "3.0.0" -#define ADDON_INSTANCE_VERSION_GAME_MIN "3.0.0" -#define ADDON_INSTANCE_VERSION_GAME_XML_ID "kodi.binary.instance.game" -#define ADDON_INSTANCE_VERSION_GAME_DEPENDS "addon-instance/Game.h" - -#define ADDON_INSTANCE_VERSION_IMAGEDECODER "3.0.0" -#define ADDON_INSTANCE_VERSION_IMAGEDECODER_MIN "3.0.0" -#define ADDON_INSTANCE_VERSION_IMAGEDECODER_XML_ID "kodi.binary.instance.imagedecoder" -#define ADDON_INSTANCE_VERSION_IMAGEDECODER_DEPENDS "c-api/addon-instance/imagedecoder.h" \ - "addon-instance/ImageDecoder.h" - -#define ADDON_INSTANCE_VERSION_INPUTSTREAM "3.1.0" -#define ADDON_INSTANCE_VERSION_INPUTSTREAM_MIN "3.1.0" -#define ADDON_INSTANCE_VERSION_INPUTSTREAM_XML_ID "kodi.binary.instance.inputstream" -#define ADDON_INSTANCE_VERSION_INPUTSTREAM_DEPENDS "c-api/addon-instance/inputstream.h" \ - "c-api/addon-instance/inputstream/demux_packet.h" \ - "c-api/addon-instance/inputstream/stream_codec.h" \ - "c-api/addon-instance/inputstream/stream_constants.h" \ - "c-api/addon-instance/inputstream/stream_crypto.h" \ - "c-api/addon-instance/inputstream/timing_constants.h" \ - "addon-instance/Inputstream.h" \ - "addon-instance/inputstream/DemuxPacket.h" \ - "addon-instance/inputstream/StreamCodec.h" \ - "addon-instance/inputstream/StreamConstants.h" \ - "addon-instance/inputstream/StreamCrypto.h" \ - "addon-instance/inputstream/TimingConstants.h" - -#define ADDON_INSTANCE_VERSION_PERIPHERAL "2.0.0" -#define ADDON_INSTANCE_VERSION_PERIPHERAL_MIN "2.0.0" -#define ADDON_INSTANCE_VERSION_PERIPHERAL_XML_ID "kodi.binary.instance.peripheral" -#define ADDON_INSTANCE_VERSION_PERIPHERAL_DEPENDS "addon-instance/Peripheral.h" \ - "addon-instance/PeripheralUtils.h" - -#define ADDON_INSTANCE_VERSION_PVR "8.1.0" -#define ADDON_INSTANCE_VERSION_PVR_MIN "8.0.0" -#define ADDON_INSTANCE_VERSION_PVR_XML_ID "kodi.binary.instance.pvr" -#define ADDON_INSTANCE_VERSION_PVR_DEPENDS "c-api/addon-instance/pvr.h" \ - "c-api/addon-instance/pvr/pvr_providers.h" \ - "c-api/addon-instance/pvr/pvr_channel_groups.h" \ - "c-api/addon-instance/pvr/pvr_channels.h" \ - "c-api/addon-instance/pvr/pvr_defines.h" \ - "c-api/addon-instance/pvr/pvr_edl.h" \ - "c-api/addon-instance/pvr/pvr_epg.h" \ - "c-api/addon-instance/pvr/pvr_general.h" \ - "c-api/addon-instance/pvr/pvr_menu_hook.h" \ - "c-api/addon-instance/pvr/pvr_recordings.h" \ - "c-api/addon-instance/pvr/pvr_stream.h" \ - "c-api/addon-instance/pvr/pvr_timers.h" \ - "addon-instance/PVR.h" \ - "addon-instance/pvr/ChannelGroups.h" \ - "addon-instance/pvr/Channels.h" \ - "addon-instance/pvr/EDL.h" \ - "addon-instance/pvr/EPG.h" \ - "addon-instance/pvr/General.h" \ - "addon-instance/pvr/MenuHook.h" \ - "addon-instance/pvr/Recordings.h" \ - "addon-instance/pvr/Stream.h" \ - "addon-instance/pvr/Timers.h" - -#define ADDON_INSTANCE_VERSION_SCREENSAVER "2.2.0" -#define ADDON_INSTANCE_VERSION_SCREENSAVER_MIN "2.2.0" -#define ADDON_INSTANCE_VERSION_SCREENSAVER_XML_ID "kodi.binary.instance.screensaver" -#define ADDON_INSTANCE_VERSION_SCREENSAVER_DEPENDS "c-api/addon-instance/screensaver.h" \ - "addon-instance/Screensaver.h" - -#define ADDON_INSTANCE_VERSION_VFS "3.0.1" -#define ADDON_INSTANCE_VERSION_VFS_MIN "3.0.1" -#define ADDON_INSTANCE_VERSION_VFS_XML_ID "kodi.binary.instance.vfs" -#define ADDON_INSTANCE_VERSION_VFS_DEPENDS "c-api/addon-instance/vfs.h" \ - "addon-instance/VFS.h" - -#define ADDON_INSTANCE_VERSION_VISUALIZATION "3.0.0" -#define ADDON_INSTANCE_VERSION_VISUALIZATION_MIN "3.0.0" -#define ADDON_INSTANCE_VERSION_VISUALIZATION_XML_ID "kodi.binary.instance.visualization" -#define ADDON_INSTANCE_VERSION_VISUALIZATION_DEPENDS "addon-instance/Visualization.h" \ - "c-api/addon-instance/visualization.h" - -#define ADDON_INSTANCE_VERSION_VIDEOCODEC "2.0.2" -#define ADDON_INSTANCE_VERSION_VIDEOCODEC_MIN "2.0.1" -#define ADDON_INSTANCE_VERSION_VIDEOCODEC_XML_ID "kodi.binary.instance.videocodec" -#define ADDON_INSTANCE_VERSION_VIDEOCODEC_DEPENDS "c-api/addon-instance/video_codec.h" \ - "c-api/addon-instance/inputstream/stream_codec.h" \ - "c-api/addon-instance/inputstream/stream_crypto.h" \ - "addon-instance/VideoCodec.h" \ - "addon-instance/inputstream/StreamCodec.h" \ - "addon-instance/inputstream/StreamCrypto.h" \ -// clang-format on - -//============================================================================== -/// @ingroup cpp_kodi_addon_addonbase_Defs -/// @defgroup cpp_kodi_addon_addonbase_Defs_ADDON_TYPE enum ADDON_TYPE -/// **The currently available instance types for Kodi add-ons**\n -/// This identifies the associated API part on the interface in Kodi and in the -/// addon. -/// -/// \internal -/// @note For add of new types take a new number on end. To change -/// existing numbers can be make problems on already compiled add-ons. -/// \endinternal -/// -///@{ -typedef enum ADDON_TYPE -{ - /* addon global parts */ - ADDON_GLOBAL_MAIN = 0, - ADDON_GLOBAL_GUI = 1, - ADDON_GLOBAL_AUDIOENGINE = 2, - ADDON_GLOBAL_GENERAL = 3, - ADDON_GLOBAL_NETWORK = 4, - ADDON_GLOBAL_FILESYSTEM = 5, - ADDON_GLOBAL_TOOLS = 6, - // Last used global id, used in loops to check versions. - // Need to change if new global type becomes added! - ADDON_GLOBAL_MAX = 6, - - /* addon type instances */ - - /// Audio decoder instance, see @ref cpp_kodi_addon_audiodecoder "kodi::addon::CInstanceAudioDecoder" - ADDON_INSTANCE_AUDIODECODER = 102, - - /// Audio encoder instance, see @ref cpp_kodi_addon_audioencoder "kodi::addon::CInstanceAudioEncoder" - ADDON_INSTANCE_AUDIOENCODER = 103, - - /// Game instance, see @ref cpp_kodi_addon_game "kodi::addon::CInstanceGame" - ADDON_INSTANCE_GAME = 104, - - /// Input stream instance, see @ref cpp_kodi_addon_inputstream "kodi::addon::CInstanceInputStream" - ADDON_INSTANCE_INPUTSTREAM = 105, - - /// Peripheral instance, see @ref cpp_kodi_addon_peripheral "kodi::addon::CInstancePeripheral" - ADDON_INSTANCE_PERIPHERAL = 106, - - /// Game instance, see @ref cpp_kodi_addon_pvr "kodi::addon::CInstancePVRClient" - ADDON_INSTANCE_PVR = 107, - - /// PVR client instance, see @ref cpp_kodi_addon_screensaver "kodi::addon::CInstanceScreensaver" - ADDON_INSTANCE_SCREENSAVER = 108, - - /// Music visualization instance, see @ref cpp_kodi_addon_visualization "kodi::addon::CInstanceVisualization" - ADDON_INSTANCE_VISUALIZATION = 109, - - /// Virtual Filesystem (VFS) instance, see @ref cpp_kodi_addon_vfs "kodi::addon::CInstanceVFS" - ADDON_INSTANCE_VFS = 110, - - /// Image Decoder instance, see @ref cpp_kodi_addon_imagedecoder "kodi::addon::CInstanceImageDecoder" - ADDON_INSTANCE_IMAGEDECODER = 111, - - /// Video Decoder instance, see @ref cpp_kodi_addon_videocodec "kodi::addon::CInstanceVideoCodec" - ADDON_INSTANCE_VIDEOCODEC = 112, -} ADDON_TYPE; -///@} -//------------------------------------------------------------------------------ - -#ifdef __cplusplus -extern "C" { -namespace kodi { -namespace addon { -#endif - -/// -/// This is used from Kodi to get the active version of add-on parts. -/// It is compiled in add-on and also in Kodi itself, with this can be Kodi -/// compare the version from him with them on add-on. -/// -/// @param[in] type The with 'enum ADDON_TYPE' type to ask -/// @return version The current version of asked type -/// -inline const char* GetTypeVersion(int type) -{ - /* - * #ifdef's below becomes set by cmake, no set by hand needed. - */ - switch (type) - { - /* addon global parts */ - case ADDON_GLOBAL_MAIN: - return ADDON_GLOBAL_VERSION_MAIN; -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_GLOBAL_VERSION_GENERAL_USED) - case ADDON_GLOBAL_GENERAL: - return ADDON_GLOBAL_VERSION_GENERAL; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_GLOBAL_VERSION_GUI_USED) - case ADDON_GLOBAL_GUI: - return ADDON_GLOBAL_VERSION_GUI; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_GLOBAL_VERSION_AUDIOENGINE_USED) - case ADDON_GLOBAL_AUDIOENGINE: - return ADDON_GLOBAL_VERSION_AUDIOENGINE; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_GLOBAL_VERSION_FILESYSTEM_USED) - case ADDON_GLOBAL_FILESYSTEM: - return ADDON_GLOBAL_VERSION_FILESYSTEM; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_GLOBAL_VERSION_NETWORK_USED) - case ADDON_GLOBAL_NETWORK: - return ADDON_GLOBAL_VERSION_NETWORK; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_GLOBAL_VERSION_TOOLS_USED) - case ADDON_GLOBAL_TOOLS: - return ADDON_GLOBAL_VERSION_TOOLS; -#endif - - /* addon type instances */ -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_AUDIODECODER_USED) - case ADDON_INSTANCE_AUDIODECODER: - return ADDON_INSTANCE_VERSION_AUDIODECODER; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_AUDIOENCODER_USED) - case ADDON_INSTANCE_AUDIOENCODER: - return ADDON_INSTANCE_VERSION_AUDIOENCODER; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_GAME_USED) - case ADDON_INSTANCE_GAME: - return ADDON_INSTANCE_VERSION_GAME; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_IMAGEDECODER_USED) - case ADDON_INSTANCE_IMAGEDECODER: - return ADDON_INSTANCE_VERSION_IMAGEDECODER; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_INPUTSTREAM_USED) - case ADDON_INSTANCE_INPUTSTREAM: - return ADDON_INSTANCE_VERSION_INPUTSTREAM; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_PERIPHERAL_USED) - case ADDON_INSTANCE_PERIPHERAL: - return ADDON_INSTANCE_VERSION_PERIPHERAL; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_PVR_USED) - case ADDON_INSTANCE_PVR: - return ADDON_INSTANCE_VERSION_PVR; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_SCREENSAVER_USED) - case ADDON_INSTANCE_SCREENSAVER: - return ADDON_INSTANCE_VERSION_SCREENSAVER; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_VFS_USED) - case ADDON_INSTANCE_VFS: - return ADDON_INSTANCE_VERSION_VFS; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_VISUALIZATION_USED) - case ADDON_INSTANCE_VISUALIZATION: - return ADDON_INSTANCE_VERSION_VISUALIZATION; -#endif -#if !defined(BUILD_KODI_ADDON) || defined(ADDON_INSTANCE_VERSION_VIDEOCODEC_USED) - case ADDON_INSTANCE_VIDEOCODEC: - return ADDON_INSTANCE_VERSION_VIDEOCODEC; -#endif - } - return "0.0.0"; -} - -/// -/// This is used from Kodi to get the minimum supported version of add-on parts. -/// It is compiled in add-on and also in Kodi itself, with this can be Kodi -/// compare the version from him with them on add-on. -/// -/// @param[in] type The with 'enum ADDON_TYPE' type to ask -/// @return version The minimum version of asked type -/// -inline const char* GetTypeMinVersion(int type) -{ - switch (type) - { - /* addon global parts */ - case ADDON_GLOBAL_MAIN: - return ADDON_GLOBAL_VERSION_MAIN_MIN; - case ADDON_GLOBAL_GUI: - return ADDON_GLOBAL_VERSION_GUI_MIN; - case ADDON_GLOBAL_GENERAL: - return ADDON_GLOBAL_VERSION_GENERAL_MIN; - case ADDON_GLOBAL_AUDIOENGINE: - return ADDON_GLOBAL_VERSION_AUDIOENGINE_MIN; - case ADDON_GLOBAL_FILESYSTEM: - return ADDON_GLOBAL_VERSION_FILESYSTEM_MIN; - case ADDON_GLOBAL_NETWORK: - return ADDON_GLOBAL_VERSION_NETWORK_MIN; - case ADDON_GLOBAL_TOOLS: - return ADDON_GLOBAL_VERSION_TOOLS_MIN; - - /* addon type instances */ - case ADDON_INSTANCE_AUDIODECODER: - return ADDON_INSTANCE_VERSION_AUDIODECODER_MIN; - case ADDON_INSTANCE_AUDIOENCODER: - return ADDON_INSTANCE_VERSION_AUDIOENCODER_MIN; - case ADDON_INSTANCE_GAME: - return ADDON_INSTANCE_VERSION_GAME_MIN; - case ADDON_INSTANCE_IMAGEDECODER: - return ADDON_INSTANCE_VERSION_IMAGEDECODER_MIN; - case ADDON_INSTANCE_INPUTSTREAM: - return ADDON_INSTANCE_VERSION_INPUTSTREAM_MIN; - case ADDON_INSTANCE_PERIPHERAL: - return ADDON_INSTANCE_VERSION_PERIPHERAL_MIN; - case ADDON_INSTANCE_PVR: - return ADDON_INSTANCE_VERSION_PVR_MIN; - case ADDON_INSTANCE_SCREENSAVER: - return ADDON_INSTANCE_VERSION_SCREENSAVER_MIN; - case ADDON_INSTANCE_VFS: - return ADDON_INSTANCE_VERSION_VFS_MIN; - case ADDON_INSTANCE_VISUALIZATION: - return ADDON_INSTANCE_VERSION_VISUALIZATION_MIN; - case ADDON_INSTANCE_VIDEOCODEC: - return ADDON_INSTANCE_VERSION_VIDEOCODEC_MIN; - } - return "0.0.0"; -} - -/// -/// Function used internally on add-on and in Kodi itself to get name -/// about given type. -/// -/// @param[in] type The with 'enum ADDON_TYPE' defined type to ask -/// @return Name of the asked instance type -/// -inline const char* GetTypeName(int type) -{ - switch (type) - { - /* addon global parts */ - case ADDON_GLOBAL_MAIN: - return "Addon"; - case ADDON_GLOBAL_GUI: - return "GUI"; - case ADDON_GLOBAL_GENERAL: - return "General"; - case ADDON_GLOBAL_AUDIOENGINE: - return "AudioEngine"; - case ADDON_GLOBAL_FILESYSTEM: - return "Filesystem"; - case ADDON_GLOBAL_NETWORK: - return "Network"; - case ADDON_GLOBAL_TOOLS: - return "Tools"; - - /* addon type instances */ - case ADDON_INSTANCE_AUDIODECODER: - return "AudioDecoder"; - case ADDON_INSTANCE_AUDIOENCODER: - return "AudioEncoder"; - case ADDON_INSTANCE_GAME: - return "Game"; - case ADDON_INSTANCE_IMAGEDECODER: - return "ImageDecoder"; - case ADDON_INSTANCE_INPUTSTREAM: - return "Inputstream"; - case ADDON_INSTANCE_PERIPHERAL: - return "Peripheral"; - case ADDON_INSTANCE_PVR: - return "PVR"; - case ADDON_INSTANCE_SCREENSAVER: - return "ScreenSaver"; - case ADDON_INSTANCE_VISUALIZATION: - return "Visualization"; - case ADDON_INSTANCE_VIDEOCODEC: - return "VideoCodec"; - } - return "unknown"; -} - -/// -/// Function used internally on add-on and in Kodi itself to get id number -/// about given type name. -/// -/// @param[in] name The type name string to ask -/// @return Id number of the asked instance type -/// -/// @warning String must be lower case here! -/// -inline int GetTypeId(const char* name) -{ - if (name) - { - if (strcmp(name, "addon") == 0) - return ADDON_GLOBAL_MAIN; - else if (strcmp(name, "general") == 0) - return ADDON_GLOBAL_GENERAL; - else if (strcmp(name, "gui") == 0) - return ADDON_GLOBAL_GUI; - else if (strcmp(name, "audioengine") == 0) - return ADDON_GLOBAL_AUDIOENGINE; - else if (strcmp(name, "filesystem") == 0) - return ADDON_GLOBAL_FILESYSTEM; - else if (strcmp(name, "network") == 0) - return ADDON_GLOBAL_NETWORK; - else if (strcmp(name, "tools") == 0) - return ADDON_GLOBAL_TOOLS; - else if (strcmp(name, "audiodecoder") == 0) - return ADDON_INSTANCE_AUDIODECODER; - else if (strcmp(name, "audioencoder") == 0) - return ADDON_INSTANCE_AUDIOENCODER; - else if (strcmp(name, "game") == 0) - return ADDON_INSTANCE_GAME; - else if (strcmp(name, "imagedecoder") == 0) - return ADDON_INSTANCE_IMAGEDECODER; - else if (strcmp(name, "inputstream") == 0) - return ADDON_INSTANCE_INPUTSTREAM; - else if (strcmp(name, "peripheral") == 0) - return ADDON_INSTANCE_PERIPHERAL; - else if (strcmp(name, "pvr") == 0) - return ADDON_INSTANCE_PVR; - else if (strcmp(name, "screensaver") == 0) - return ADDON_INSTANCE_SCREENSAVER; - else if (strcmp(name, "vfs") == 0) - return ADDON_INSTANCE_VFS; - else if (strcmp(name, "visualization") == 0) - return ADDON_INSTANCE_VISUALIZATION; - else if (strcmp(name, "videocodec") == 0) - return ADDON_INSTANCE_VIDEOCODEC; - } - return -1; -} - -#ifdef __cplusplus -} /* namespace addon */ -} /* namespace kodi */ -} /* extern "C" */ -#endif - -#endif /* !KODI_VERSIONS_H */ 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..df050db6a3a53 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/CMakeLists.txt @@ -0,0 +1,98 @@ +# 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) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../..) + +message(STATUS "kodidevkit Version: ${__KDK_MAJOR__}.${__KDK_MINOR__}.${__KDK_BETA__}") + +if(APP_RENDER_SYSTEM STREQUAL "gl" OR NOT APP_RENDER_SYSTEM) + find_package(OpenGl REQUIRED) + find_package(EGL REQUIRED) + set(${PROJECT_NAME}_DEPLIBS ${OPENGL_LIBRARIES} ${EGL_LIBRARIES}) + set(${PROJECT_NAME}_INCLUDES ${OPENGL_INCLUDE_DIR} ${EGL_INCLUDE_DIR}) + set(${PROJECT_NAME}_DEFINITIONS ${OPENGL_DEFINITIONS}) +else() + find_package(OpenGLES REQUIRED) + set(${PROJECT_NAME}_DEPLIBS ${OPENGLES_LIBRARIES}) + set(${PROJECT_NAME}_INCLUDES ${OPENGLES_INCLUDE_DIR}) + set(${PROJECT_NAME}_DEFINITIONS ${OPENGLES_DEFINITIONS}) +endif() + +#---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) +add_subdirectory(third_party/backward-cpp) +#---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} + $ + $) +add_backward(${PROJECT_NAME}) +target_compile_definitions(${PROJECT_NAME} PRIVATE ${BACKWARD_DEFINITIONS} ${${PROJECT_NAME}_DEFINITIONS}) +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 "") +target_include_directories(${PROJECT_NAME} PRIVATE ${${PROJECT_NAME}_INCLUDES}) +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 ${${PROJECT_NAME}_DEPLIBS} dw) + #target_link_libraries(${PROJECT_NAME} PUBLIC stdc++ gcc pthread m c rt ) + + # Remove as splitted dwarf not works currently in included "backward-cpp" and further should on + # user installed add-ons some debug infos available. + remove_flag_from_target(${PROJECT_NAME} -gsplit-dwarf) +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/FindEGL.cmake b/xbmc/addons/kodi-dev-kit/src/addon/FindEGL.cmake new file mode 100644 index 0000000000000..b00fe08a25f95 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/FindEGL.cmake @@ -0,0 +1,48 @@ +#.rst: +# FindEGL +# ------- +# Finds the EGL library +# +# This will define the following variables:: +# +# EGL_FOUND - system has EGL +# EGL_INCLUDE_DIRS - the EGL include directory +# EGL_LIBRARIES - the EGL libraries +# EGL_DEFINITIONS - the EGL definitions +# +# and the following imported targets:: +# +# EGL::EGL - The EGL library + +if(PKG_CONFIG_FOUND) + pkg_check_modules(PC_EGL egl QUIET) +endif() + +find_path(EGL_INCLUDE_DIR EGL/egl.h + PATHS ${PC_EGL_INCLUDEDIR}) + +find_library(EGL_LIBRARY NAMES EGL egl + PATHS ${PC_EGL_LIBDIR}) + +set(EGL_VERSION ${PC_EGL_VERSION}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(EGL + REQUIRED_VARS EGL_LIBRARY EGL_INCLUDE_DIR + VERSION_VAR EGL_VERSION) + +if(EGL_FOUND) + set(EGL_LIBRARIES ${EGL_LIBRARY}) + set(EGL_INCLUDE_DIRS ${EGL_INCLUDE_DIR}) + set(EGL_DEFINITIONS -DHAS_EGL=1) + + if(NOT TARGET EGL::EGL) + add_library(EGL::EGL UNKNOWN IMPORTED) + set_target_properties(EGL::EGL PROPERTIES + IMPORTED_LOCATION "${EGL_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${EGL_INCLUDE_DIR}" + INTERFACE_COMPILE_DEFINITIONS HAS_EGL=1) + endif() +endif() + +mark_as_advanced(EGL_INCLUDE_DIR EGL_LIBRARY) diff --git a/xbmc/addons/kodi-dev-kit/src/addon/FindOpenGl.cmake b/xbmc/addons/kodi-dev-kit/src/addon/FindOpenGl.cmake new file mode 100644 index 0000000000000..616325083cb52 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/FindOpenGl.cmake @@ -0,0 +1,40 @@ +#.rst: +# FindOpenGl +# ---------- +# Finds the FindOpenGl library +# +# This will define the following variables:: +# +# OPENGL_FOUND - system has OpenGl +# OPENGL_INCLUDE_DIRS - the OpenGl include directory +# OPENGL_LIBRARIES - the OpenGl libraries +# OPENGL_DEFINITIONS - the OpenGl definitions + +if(PKG_CONFIG_FOUND) + pkg_check_modules(PC_OPENGL gl QUIET) +endif() + +if(NOT CORE_SYSTEM_NAME STREQUAL osx) + find_path(OPENGL_INCLUDE_DIR GL/gl.h + PATHS ${PC_OPENGL_gl_INCLUDEDIR}) + find_library(OPENGL_gl_LIBRARY NAMES GL + PATHS ${PC_OPENGL_gl_LIBDIR}) +else() + find_library(OPENGL_gl_LIBRARY NAMES OpenGL + PATHS ${CMAKE_OSX_SYSROOT}/System/Library + PATH_SUFFIXES Frameworks + NO_DEFAULT_PATH) + set(OPENGL_INCLUDE_DIR ${OPENGL_gl_LIBRARY}/Headers) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpenGl + REQUIRED_VARS OPENGL_gl_LIBRARY OPENGL_INCLUDE_DIR) +message(FATAL_ERROR "ffff ${DEPLIBS}") +if(OPENGL_FOUND) + set(OPENGL_INCLUDE_DIRS ${OPENGL_INCLUDE_DIR}) + set(OPENGL_LIBRARIES ${OPENGL_gl_LIBRARY} EGL) + set(OPENGL_DEFINITIONS -DHAS_GL=1) +endif() + +mark_as_advanced(OPENGL_INCLUDE_DIR OPENGL_gl_LIBRARY) 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..6c0d50afe0c23 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/CMakeLists.txt @@ -0,0 +1,36 @@ +# 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 + web.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 + web.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..e1a4d3ed1bbfc --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audiodecoder.cpp @@ -0,0 +1,296 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_supports_file_v1 = kodi_addon_audiodecoder_supports_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_supports_file_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_SUPPORTS_FILE_V1)(const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_supports_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_supports_file_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_audiodecoder_supports_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_supports_file_v1(this, auto_gen_hdl, file.c_str()); + + msgpack::pack(out, msgChild_OUT_kodi_addon_audiodecoder_supports_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---*/ + +bool CHdl_kodi_addoninstance_audiodecoder_h::kodi_addon_audiodecoder_supports_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.supports_file) + { + auto_gen_ret = + union_data->types.kodi_addon_audiodecoder.v1.supports_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..e883a056347c8 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audiodecoder.h @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 bool kodi_addon_audiodecoder_supports_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..6170db9109e30 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audioencoder.cpp @@ -0,0 +1,237 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_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_start_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_START_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl, const struct KODI_ADDON_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)); + KODI_ADDON_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---*/ + +bool CHdl_kodi_addoninstance_audioencoder_h::kodi_addon_audioencoder_start_v1( + void* thisClassHdl, + KODI_ADDON_AUDIOENCODER_HDL hdl, + const struct KODI_ADDON_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_ADDON_INSTANCE_BACKEND_HDL hdl, + const uint8_t* data, + size_t len) +{ + // Original API call: ATTR_DLL_EXPORT ssize_t kodi_addon_audioencoder_write(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, + ssize_t pos, + int whence) +{ + // Original API call: ATTR_DLL_EXPORT ssize_t kodi_addon_audioencoder_seek(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, ssize_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..3df4065531c52 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/audioencoder.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 bool kodi_addon_audioencoder_start_v1( + void* thisClassHdl, + KODI_ADDON_AUDIOENCODER_HDL hdl, + const struct KODI_ADDON_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..3dbe5705ecc42 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/game.cpp @@ -0,0 +1,818 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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; + ifcToAddon->kodi_addon_game_rc_generate_hash_from_file_v1 = + kodi_addon_game_rc_generate_hash_from_file_v1; + ifcToAddon->kodi_addon_game_rc_get_game_id_url_v1 = kodi_addon_game_rc_get_game_id_url_v1; + ifcToAddon->kodi_addon_game_rc_get_patch_file_url_v1 = kodi_addon_game_rc_get_patch_file_url_v1; + ifcToAddon->kodi_addon_game_rc_post_rich_presence_url_v1 = + kodi_addon_game_rc_post_rich_presence_url_v1; + ifcToAddon->kodi_addon_game_rc_enable_rich_presence_v1 = + kodi_addon_game_rc_enable_rich_presence_v1; + ifcToAddon->kodi_addon_game_rc_get_rich_presence_evaluation_v1 = + kodi_addon_game_rc_get_rich_presence_evaluation_v1; + ifcToAddon->kodi_addon_game_rc_reset_runtime_v1 = kodi_addon_game_rc_reset_runtime_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_ADDON_INSTANCE_BACKEND_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; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_rc_generate_hash_from_file_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + char** hash, + unsigned int console_id, + const char* file_path) // 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.rc_generate_hash_from_file) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.rc_generate_hash_from_file( + union_data->hdl, hash, console_id, file_path); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_rc_get_game_id_url_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + char** url, + const char* hash) // 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.rc_get_game_id_url) + { + auto_gen_ret = + union_data->types.kodi_addon_game.v1.rc_get_game_id_url(union_data->hdl, url, hash); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_rc_get_patch_file_url_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + char** url, + const char* username, + const char* token, + unsigned int game_id) // 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.rc_get_patch_file_url) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.rc_get_patch_file_url( + union_data->hdl, url, username, token, game_id); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_rc_post_rich_presence_url_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + char** url, + char** post_data, + const char* username, + const char* token, + unsigned int game_id, + const char* rich_presence) // 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.rc_post_rich_presence_url) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.rc_post_rich_presence_url( + union_data->hdl, url, post_data, username, token, game_id, rich_presence); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_rc_enable_rich_presence_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl, const char* script) // 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.rc_enable_rich_presence) + { + auto_gen_ret = + union_data->types.kodi_addon_game.v1.rc_enable_rich_presence(union_data->hdl, script); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_rc_get_rich_presence_evaluation_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + char** evaluation, + unsigned int console_id) // 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.rc_get_rich_presence_evaluation) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.rc_get_rich_presence_evaluation( + union_data->hdl, evaluation, console_id); + } + return auto_gen_ret; +} + +enum GAME_ERROR CHdl_kodi_addoninstance_game_h::kodi_addon_game_rc_reset_runtime_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.rc_reset_runtime) + { + auto_gen_ret = union_data->types.kodi_addon_game.v1.rc_reset_runtime(union_data->hdl); + } + return auto_gen_ret; +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_addon_game_close(KODI_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_game_close(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, const struct game_stream_properties* properties) +{ + // Original API call: ATTR_DLL_EXPORT KODI_GAME_STREAM_HANDLE kodi_addon_game_open_stream( KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, + KODI_GAME_STREAM_HANDLE game_hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_game_close_stream(KODI_ADDON_INSTANCE_BACKEND_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_game_hw_get_proc_address(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* symbol) +{ + // Original API call: ATTR_DLL_EXPORT game_proc_address_t kodi_addon_game_hw_get_proc_address( KODI_ADDON_INSTANCE_BACKEND_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_game_hw_get_proc_address_v1(auto_gen_group.thisClassHdl, hdl, + symbol); +} + +ATTR_DLL_EXPORT bool kodi_addon_game_input_event(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const struct game_input_event* event) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_game_input_event(KODI_ADDON_INSTANCE_BACKEND_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..0f63a43f15fec --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/game.h @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_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 + + static enum GAME_ERROR kodi_addon_game_rc_generate_hash_from_file_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + char** hash, + unsigned int console_id, + const char* file_path); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_rc_get_game_id_url_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + char** url, + const char* hash); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_rc_get_patch_file_url_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + char** url, + const char* username, + const char* token, + unsigned int game_id); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_rc_post_rich_presence_url_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + char** url, + char** post_data, + const char* username, + const char* token, + unsigned int game_id, + const char* rich_presence); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_rc_enable_rich_presence_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl, const char* script); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_rc_get_rich_presence_evaluation_v1( + void* thisClassHdl, + const KODI_ADDON_GAME_HDL hdl, + char** evaluation, + unsigned int console_id); // Added with API 1 + + static enum GAME_ERROR kodi_addon_game_rc_reset_runtime_v1( + void* thisClassHdl, const KODI_ADDON_GAME_HDL hdl); // 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..c50c893dc2a01 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/imagedecoder.cpp @@ -0,0 +1,229 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_supports_file_v1 = kodi_addon_imagedecoder_supports_file_v1; + ifcToAddon->kodi_addon_imagedecoder_read_tag_v1 = kodi_addon_imagedecoder_read_tag_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_supports_file_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_SUPPORTS_FILE_V1)(const KODI_ADDON_IMAGEDECODER_HDL hdl, const char* file); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_supports_file_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_supports_file_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_imagedecoder_supports_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_imagedecoder_supports_file_v1(this, auto_gen_hdl, file.c_str()); + + msgpack::pack(out, msgChild_OUT_kodi_addon_imagedecoder_supports_file_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_imagedecoder_read_tag_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_READ_TAG_V1)(const KODI_ADDON_IMAGEDECODER_HDL hdl, const char* file, struct KODI_ADDON_IMAGEDECODER_INFO_TAG* info); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_read_tag_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_read_tag_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_imagedecoder_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_IMAGEDECODER_INFO_TAG info = {}; + bool auto_gen_ret = + kodi_addon_imagedecoder_read_tag_v1(this, auto_gen_hdl, file.c_str(), &info); + + msgpack::pack(out, msgChild_OUT_kodi_addon_imagedecoder_read_tag_v1(auto_gen_ret, &info)); + IFC_KODI_ADDON_IMAGEDECODER_INFO_TAG::CleanCStructure(&info); + 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)(const KODI_ADDON_IMAGEDECODER_HDL hdl, const char* mimetype, 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::string& mimetype = std::get<1>(t); + const std::vector& buffer = std::get<2>(t); + size_t buf_size = std::get<3>(t); + unsigned int width = std::get<4>(t); + unsigned int height = std::get<5>(t); + bool auto_gen_ret = kodi_addon_imagedecoder_load_image_from_memory_v1( + this, auto_gen_hdl, mimetype.c_str(), 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)(const 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---*/ + +bool CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_supports_file_v1( + void* thisClassHdl, const KODI_ADDON_IMAGEDECODER_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_imagedecoder.v1.supports_file) + { + auto_gen_ret = + union_data->types.kodi_addon_imagedecoder.v1.supports_file(union_data->hdl, file); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_read_tag_v1( + void* thisClassHdl, + const KODI_ADDON_IMAGEDECODER_HDL hdl, + const char* file, + struct KODI_ADDON_IMAGEDECODER_INFO_TAG* info) // 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.read_tag) + { + auto_gen_ret = + union_data->types.kodi_addon_imagedecoder.v1.read_tag(union_data->hdl, file, info); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_load_image_from_memory_v1( + void* thisClassHdl, + const KODI_ADDON_IMAGEDECODER_HDL hdl, + const char* mimetype, + 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, mimetype, buffer, buf_size, width, height); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_imagedecoder_h::kodi_addon_imagedecoder_decode_v1( + void* thisClassHdl, + const 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 */ + +/* 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..f7fa8d99c044f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/imagedecoder.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 bool kodi_addon_imagedecoder_supports_file_v1(void* thisClassHdl, + const KODI_ADDON_IMAGEDECODER_HDL hdl, + const char* file); // Added with API 1 + + static bool kodi_addon_imagedecoder_read_tag_v1( + void* thisClassHdl, + const KODI_ADDON_IMAGEDECODER_HDL hdl, + const char* file, + struct KODI_ADDON_IMAGEDECODER_INFO_TAG* info); // Added with API 1 + + static bool kodi_addon_imagedecoder_load_image_from_memory_v1( + void* thisClassHdl, + const KODI_ADDON_IMAGEDECODER_HDL hdl, + const char* mimetype, + 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, + const 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..04dcb699ab97d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/inputstream.cpp @@ -0,0 +1,675 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, int data_size) +{ + // Original API call: ATTR_DLL_EXPORT struct DEMUX_PACKET* kodi_addon_inputstream_allocate_demux_packet( KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, + struct DEMUX_PACKET* packet) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_inputstream_free_demux_packet(KODI_ADDON_INSTANCE_BACKEND_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..350947e0a054e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/inputstream.h @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_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..36676b909a94b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/peripheral.cpp @@ -0,0 +1,506 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_peripheral_trigger_scan(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* device_name, + const char* controller_id) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_peripheral_refresh_button_maps( KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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..ac6f153787b08 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/peripheral.h @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_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..72e95902ac8f5 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/pvr.cpp @@ -0,0 +1,2659 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_addon_pvr_get_epg_max_future_days(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT int kodi_addon_pvr_get_epg_max_past_days(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, + const struct PVR_MENUHOOK* hook) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_add_menu_hook(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* name, + const char* fileName, + bool on) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_recording_notification(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_channel_update(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_providers_update(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_channel_groups_update( KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, + unsigned int iChannelUid) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_epg_update(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_recording_update(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_pvr_trigger_timer_update(KODI_ADDON_INSTANCE_BACKEND_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..b3f7ede654267 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/pvr.h @@ -0,0 +1,340 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..aa6b66661ad0f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/screensaver.cpp @@ -0,0 +1,218 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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" + +#include "src/addon/core/addon_offscreen_render_control.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_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_start_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_START_V1)(const 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(); + PtrKodiOffscreen kodiOffsetHdl = std::get<0>(t); + uint64_t renderId = std::get<1>(t); + int x = std::get<2>(t); + int y = std::get<3>(t); + int width = std::get<4>(t); + int height = std::get<5>(t); + ADDON_HARDWARE_CONTEXT context = reinterpret_cast(std::get<6>(t)); + IAddonOffscreenRenderControl* auto_gen_render_control = + GenerateOffscreenControl(kodiOffsetHdl, renderId, x, y, width, height, context); + bool auto_gen_render_ret = auto_gen_render_control && auto_gen_render_control->Start(); + + const KODI_ADDON_SCREENSAVER_HDL hdl = + reinterpret_cast(std::get<7>(t)); + bool auto_gen_ret = kodi_addon_screensaver_start_v1(this, hdl); + + msgpack::pack( + out, msgChild_OUT_kodi_addon_screensaver_start_v1( + auto_gen_ret, PtrAddonOffscreen(auto_gen_render_control), auto_gen_render_ret)); + return true; + } + case funcChild_kodi_addon_screensaver_stop_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_STOP_V1)(const 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(); + IAddonOffscreenRenderControl* auto_gen_render_control = + reinterpret_cast(std::get<0>(t)); + const KODI_ADDON_SCREENSAVER_HDL hdl = + reinterpret_cast(std::get<1>(t)); + kodi_addon_screensaver_stop_v1(this, hdl); + + if (auto_gen_render_control) + { + { + auto_gen_render_control->Stop(); + delete auto_gen_render_control; + } + } + return true; + } + case funcChild_kodi_addon_screensaver_render_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_RENDER_V1)(const 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(); + IAddonOffscreenRenderControl* auto_gen_render_control = + reinterpret_cast(std::get<0>(t)); + if (auto_gen_render_control) + auto_gen_render_control->RenderBegin(); + + const KODI_ADDON_SCREENSAVER_HDL hdl = + reinterpret_cast(std::get<1>(t)); + kodi_addon_screensaver_render_v1(this, hdl); + + if (auto_gen_render_control) + auto_gen_render_control->RenderEnd(); + 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---*/ + +bool CHdl_kodi_addoninstance_screensaver_h::kodi_addon_screensaver_start_v1( + void* thisClassHdl, const 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, const 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, const 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( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, struct KODI_ADDON_SCREENSAVER_PROPS* props) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_screensaver_get_properties( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, struct KODI_ADDON_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..780a376c13aa4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/screensaver.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 bool kodi_addon_screensaver_start_v1( + void* thisClassHdl, const KODI_ADDON_SCREENSAVER_HDL hdl); // Added with API 1 + + static void kodi_addon_screensaver_stop_v1( + void* thisClassHdl, const KODI_ADDON_SCREENSAVER_HDL hdl); // Added with API 1 + + static void kodi_addon_screensaver_render_v1( + void* thisClassHdl, const 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..19855b1ccc628 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/vfs.cpp @@ -0,0 +1,1080 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_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_file_open_v1: + { + // Original API call: typedef KODI_VFS_FILE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_OPEN_V1)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)); + KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)); + KODI_ADDON_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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, uint32_t 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)); + uint32_t 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)(const 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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)); + KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)); + KODI_ADDON_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)(const 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)(const 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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)); + KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url, const struct KODI_ADDON_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)); + KODI_ADDON_VFS_URL url; + KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)); + KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)); + KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)); + KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)); + KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)); + KODI_ADDON_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_VFS_FILE_HDL CHdl_kodi_addoninstance_vfs_h::kodi_addon_vfs_file_open_v1( + void* thisClassHdl, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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, const 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, + const 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, + const 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, + const 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, + const 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, const 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, const 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, const 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, const 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, + const 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, + const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + uint32_t 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, + const 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, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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, const 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, const 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, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url, + const struct KODI_ADDON_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, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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..6c6e296a67ae4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/vfs.h @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_VFS_FILE_HDL kodi_addon_vfs_file_open_v1( + void* thisClassHdl, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url); // Added with API 1 + + static KODI_VFS_FILE_HDL kodi_addon_vfs_file_open_for_write_v1( + void* thisClassHdl, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url, + bool overwrite); // Added with API 1 + + static bool kodi_addon_vfs_file_close_v1(void* thisClassHdl, + const 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, + const 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, + const 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, + const 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, + const 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, + const 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, + const 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, + const 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, + const 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, + const 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, + const KODI_ADDON_VFS_HDL hdl, + KODI_VFS_FILE_HDL context, + uint32_t rate); // Added with API 1 + + static bool kodi_addon_vfs_file_io_control_set_retry_v1(void* thisClassHdl, + const 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, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url, + struct VFS_STAT_STRUCTURE* buffer); // Added with API 1 + + static bool kodi_addon_vfs_exists_v1(void* thisClassHdl, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url); // Added with API 1 + + static void kodi_addon_vfs_clear_out_idle_v1(void* thisClassHdl, + const KODI_ADDON_VFS_HDL hdl); // Added with API 1 + + static void kodi_addon_vfs_disconnect_all_v1(void* thisClassHdl, + const KODI_ADDON_VFS_HDL hdl); // Added with API 1 + + static bool kodi_addon_vfs_delete_it_v1(void* thisClassHdl, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url); // Added with API 1 + + static bool kodi_addon_vfs_rename_v1(void* thisClassHdl, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url, + const struct KODI_ADDON_VFS_URL* url2); // Added with API 1 + + static bool kodi_addon_vfs_directory_exists_v1( + void* thisClassHdl, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url); // Added with API 1 + + static bool kodi_addon_vfs_directory_remove_v1( + void* thisClassHdl, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url); // Added with API 1 + + static bool kodi_addon_vfs_directory_create_v1( + void* thisClassHdl, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_VFS_URL* url); // Added with API 1 + + static bool kodi_addon_vfs_directory_get_v1(void* thisClassHdl, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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, + const KODI_ADDON_VFS_HDL hdl, + const struct KODI_ADDON_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..d59361f2fe822 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/videocodec.cpp @@ -0,0 +1,234 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, + struct VIDEOCODEC_PICTURE* picture) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_videocodec_get_frame_buffer(KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, + struct VIDEOCODEC_PICTURE* picture) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_videocodec_release_frame_buffer( KODI_ADDON_INSTANCE_BACKEND_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..bef8d52697fb7 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/videocodec.h @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_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..4faae208e6ab9 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/visualization.cpp @@ -0,0 +1,734 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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" + +#include "src/addon/core/addon_offscreen_render_control.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_start_v1 = kodi_addon_visualization_start_v1; + ifcToAddon->kodi_addon_visualization_stop_v1 = kodi_addon_visualization_stop_v1; + ifcToAddon->kodi_addon_visualization_get_sync_delay_v1 = + kodi_addon_visualization_get_sync_delay_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_start_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_START_V1)(const 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(); + PtrKodiOffscreen kodiOffsetHdl = std::get<0>(t); + uint64_t renderId = std::get<1>(t); + int x = std::get<2>(t); + int y = std::get<3>(t); + int width = std::get<4>(t); + int height = std::get<5>(t); + ADDON_HARDWARE_CONTEXT context = reinterpret_cast(std::get<6>(t)); + IAddonOffscreenRenderControl* auto_gen_render_control = + GenerateOffscreenControl(kodiOffsetHdl, renderId, x, y, width, height, context); + bool auto_gen_render_ret = auto_gen_render_control && auto_gen_render_control->Start(); + + const KODI_ADDON_VISUALIZATION_HDL hdl = + reinterpret_cast(std::get<7>(t)); + int channels = std::get<8>(t); + int samples_per_sec = std::get<9>(t); + int bits_per_sample = std::get<10>(t); + const std::string& song_name = std::get<11>(t); + bool auto_gen_ret = kodi_addon_visualization_start_v1(this, 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, PtrAddonOffscreen(auto_gen_render_control), auto_gen_render_ret)); + return true; + } + case funcChild_kodi_addon_visualization_stop_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_STOP_V1)(const 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(); + IAddonOffscreenRenderControl* auto_gen_render_control = + reinterpret_cast(std::get<0>(t)); + const KODI_ADDON_VISUALIZATION_HDL hdl = + reinterpret_cast(std::get<1>(t)); + kodi_addon_visualization_stop_v1(this, hdl); + + if (auto_gen_render_control) + { + { + auto_gen_render_control->Stop(); + delete auto_gen_render_control; + } + } + return true; + } + case funcChild_kodi_addon_visualization_get_sync_delay_v1: + { + // Original API call: typedef int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_SYNC_DELAY_V1)(const KODI_ADDON_VISUALIZATION_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_visualization_get_sync_delay_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_visualization_get_sync_delay_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_visualization_get_sync_delay_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_sync_delay_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_visualization_get_sync_delay_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_visualization_audio_data_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_AUDIO_DATA_V1)(const KODI_ADDON_VISUALIZATION_HDL hdl, const float* audio_data, size_t audio_data_length); + // Tuple in: typedef std::tuple, 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); + kodi_addon_visualization_audio_data_v1(this, auto_gen_hdl, audio_data.data(), + audio_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)(const 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)(const 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(); + IAddonOffscreenRenderControl* auto_gen_render_control = + reinterpret_cast(std::get<0>(t)); + if (auto_gen_render_control) + auto_gen_render_control->RenderBegin(); + + const KODI_ADDON_VISUALIZATION_HDL hdl = + reinterpret_cast(std::get<1>(t)); + kodi_addon_visualization_render_v1(this, hdl); + + if (auto_gen_render_control) + auto_gen_render_control->RenderEnd(); + 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const KODI_ADDON_VISUALIZATION_HDL hdl, const struct KODI_ADDON_VISUALIZATION_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)); + KODI_ADDON_VISUALIZATION_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---*/ + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_start_v1( + void* thisClassHdl, + const 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, const 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); + } +} + +int CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_get_sync_delay_v1( + void* thisClassHdl, const 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_sync_delay) + { + auto_gen_ret = union_data->types.kodi_addon_visualization.v1.get_sync_delay(union_data->hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_audio_data_v1( + void* thisClassHdl, + const KODI_ADDON_VISUALIZATION_HDL hdl, + const float* audio_data, + size_t audio_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); + } +} + +bool CHdl_kodi_addoninstance_visualization_h::kodi_addon_visualization_is_dirty_v1( + void* thisClassHdl, const 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, const 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, const 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, const 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, const 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, const 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, const 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, const 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, const 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, const 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, const 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, + const 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, + const KODI_ADDON_VISUALIZATION_HDL hdl, + const struct KODI_ADDON_VISUALIZATION_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( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, struct KODI_ADDON_VISUALIZATION_PROPS* props) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_visualization_get_properties(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, struct KODI_ADDON_VISUALIZATION_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( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* preset) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_visualization_transfer_preset(const KODI_ADDON_INSTANCE_BACKEND_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( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_visualization_clear_presets(const KODI_ADDON_INSTANCE_BACKEND_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..b7c68a19546d8 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/visualization.h @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 bool kodi_addon_visualization_start_v1(void* thisClassHdl, + const 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, const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static int kodi_addon_visualization_get_sync_delay_v1( + void* thisClassHdl, const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static void kodi_addon_visualization_audio_data_v1(void* thisClassHdl, + const KODI_ADDON_VISUALIZATION_HDL hdl, + const float* audio_data, + size_t audio_data_length); // Added with API 1 + + static bool kodi_addon_visualization_is_dirty_v1( + void* thisClassHdl, const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static void kodi_addon_visualization_render_v1( + void* thisClassHdl, const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static unsigned int kodi_addon_visualization_get_presets_v1( + void* thisClassHdl, const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static int kodi_addon_visualization_get_active_preset_v1( + void* thisClassHdl, const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static bool kodi_addon_visualization_prev_preset_v1( + void* thisClassHdl, const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static bool kodi_addon_visualization_next_preset_v1( + void* thisClassHdl, const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static bool kodi_addon_visualization_load_preset_v1(void* thisClassHdl, + const KODI_ADDON_VISUALIZATION_HDL hdl, + int select); // Added with API 1 + + static bool kodi_addon_visualization_random_preset_v1( + void* thisClassHdl, const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static bool kodi_addon_visualization_lock_preset_v1( + void* thisClassHdl, const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static bool kodi_addon_visualization_rate_preset_v1(void* thisClassHdl, + const KODI_ADDON_VISUALIZATION_HDL hdl, + bool plus_minus); // Added with API 1 + + static bool kodi_addon_visualization_is_locked_v1( + void* thisClassHdl, const KODI_ADDON_VISUALIZATION_HDL hdl); // Added with API 1 + + static bool kodi_addon_visualization_update_albumart_v1(void* thisClassHdl, + const KODI_ADDON_VISUALIZATION_HDL hdl, + const char* albumart); // Added with API 1 + + static bool kodi_addon_visualization_update_track_v1( + void* thisClassHdl, + const KODI_ADDON_VISUALIZATION_HDL hdl, + const struct KODI_ADDON_VISUALIZATION_TRACK* track); // Added with API 1 +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/web.cpp b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/web.cpp new file mode 100644 index 0000000000000..5a5506355b1da --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/web.cpp @@ -0,0 +1,1329 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 "web.h" + +#include "src/addon/core/addon_offscreen_render_control.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_web_h::InitDirect(directFuncToAddon_addoninstance_web_h* ifcToAddon) +{ + ifcToAddon->thisClassHdl = this; + ifcToAddon->kodi_addon_web_start_instance_v1 = kodi_addon_web_start_instance_v1; + ifcToAddon->kodi_addon_web_stop_instance_v1 = kodi_addon_web_stop_instance_v1; + ifcToAddon->kodi_addon_web_main_initialize_v1 = kodi_addon_web_main_initialize_v1; + ifcToAddon->kodi_addon_web_main_loop_v1 = kodi_addon_web_main_loop_v1; + ifcToAddon->kodi_addon_web_main_shutdown_v1 = kodi_addon_web_main_shutdown_v1; + ifcToAddon->kodi_addon_web_set_mute_v1 = kodi_addon_web_set_mute_v1; + ifcToAddon->kodi_addon_web_set_language_v1 = kodi_addon_web_set_language_v1; + ifcToAddon->kodi_addon_web_create_control_v1 = kodi_addon_web_create_control_v1; + ifcToAddon->kodi_addon_web_destroy_control_v1 = kodi_addon_web_destroy_control_v1; + ifcToAddon->kodi_addon_web_control_render_init_v1 = kodi_addon_web_control_render_init_v1; + ifcToAddon->kodi_addon_web_control_render_deinit_v1 = kodi_addon_web_control_render_deinit_v1; + ifcToAddon->kodi_addon_web_control_render_v1 = kodi_addon_web_control_render_v1; + ifcToAddon->kodi_addon_web_control_dirty_v1 = kodi_addon_web_control_dirty_v1; + ifcToAddon->kodi_addon_web_control_on_init_v1 = kodi_addon_web_control_on_init_v1; + ifcToAddon->kodi_addon_web_control_on_action_v1 = kodi_addon_web_control_on_action_v1; + ifcToAddon->kodi_addon_web_control_on_mouse_event_v1 = kodi_addon_web_control_on_mouse_event_v1; + ifcToAddon->kodi_addon_web_control_open_website_v1 = kodi_addon_web_control_open_website_v1; + ifcToAddon->kodi_addon_web_control_get_history_v1 = kodi_addon_web_control_get_history_v1; + ifcToAddon->kodi_addon_web_control_search_text_v1 = kodi_addon_web_control_search_text_v1; + ifcToAddon->kodi_addon_web_control_stop_search_v1 = kodi_addon_web_control_stop_search_v1; + ifcToAddon->kodi_addon_web_control_web_cmd_reload_v1 = kodi_addon_web_control_web_cmd_reload_v1; + ifcToAddon->kodi_addon_web_control_web_cmd_stop_load_v1 = + kodi_addon_web_control_web_cmd_stop_load_v1; + ifcToAddon->kodi_addon_web_control_web_cmd_nav_back_v1 = + kodi_addon_web_control_web_cmd_nav_back_v1; + ifcToAddon->kodi_addon_web_control_web_cmd_nav_forward_v1 = + kodi_addon_web_control_web_cmd_nav_forward_v1; + ifcToAddon->kodi_addon_web_control_web_open_own_context_menu_v1 = + kodi_addon_web_control_web_open_own_context_menu_v1; + ifcToAddon->kodi_addon_web_control_screen_size_change_v1 = + kodi_addon_web_control_screen_size_change_v1; +} + +#ifndef KODI_INHIBIT_SHARED +bool CHdl_kodi_addoninstance_web_h::HandleMessage(int funcGroup, + int func, + const msgpack::unpacked& in, + msgpack::sbuffer& out) +{ + if (funcGroup != funcGroup_addoninstance_web_h) + return false; + + switch (func) + { + case funcChild_kodi_addon_web_start_instance_v1: + { + // Original API call: typedef enum WEB_ADDON_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_START_INSTANCE_V1)(const KODI_ADDON_WEB_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_start_instance_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_start_instance_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_start_instance_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + + enum WEB_ADDON_ERROR auto_gen_ret = kodi_addon_web_start_instance_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_web_start_instance_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_web_stop_instance_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_STOP_INSTANCE_V1)(const KODI_ADDON_WEB_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_stop_instance_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_stop_instance_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_stop_instance_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + + kodi_addon_web_stop_instance_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_web_main_initialize_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_MAIN_INITIALIZE_V1)(const KODI_ADDON_WEB_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_main_initialize_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_main_initialize_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_main_initialize_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + + bool auto_gen_ret = kodi_addon_web_main_initialize_v1(this, auto_gen_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_web_main_initialize_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_web_main_loop_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_MAIN_LOOP_V1)(const KODI_ADDON_WEB_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_main_loop_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_main_loop_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_main_loop_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + + kodi_addon_web_main_loop_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_web_main_shutdown_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_MAIN_SHUTDOWN_V1)(const KODI_ADDON_WEB_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_main_shutdown_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_main_shutdown_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_main_shutdown_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + + kodi_addon_web_main_shutdown_v1(this, auto_gen_hdl); + + return true; + } + case funcChild_kodi_addon_web_set_mute_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_SET_MUTE_V1)(const KODI_ADDON_WEB_HDL hdl, bool mute); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_set_mute_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_set_mute_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_set_mute_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + bool mute = std::get<1>(t); + kodi_addon_web_set_mute_v1(this, auto_gen_hdl, mute); + + return true; + } + case funcChild_kodi_addon_web_set_language_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_SET_LANGUAGE_V1)(const KODI_ADDON_WEB_HDL hdl, const char* language); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_set_language_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_set_language_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_set_language_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const std::string& language = std::get<1>(t); + bool auto_gen_ret = kodi_addon_web_set_language_v1(this, auto_gen_hdl, language.c_str()); + + msgpack::pack(out, msgChild_OUT_kodi_addon_web_set_language_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_web_create_control_v1: + { + // Original API call: typedef enum WEB_ADDON_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CREATE_CONTROL_V1)(const KODI_ADDON_WEB_HDL hdl, const struct WEB_ADDON_GUI_PROPS* props, const char* start_url, WEB_KODI_CONTROL* handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_create_control_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_create_control_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_create_control_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + WEB_ADDON_GUI_PROPS props; + std::get<1>(t).SetCStructure(&props); + const std::string& start_url = std::get<2>(t); + WEB_KODI_CONTROL handle = nullptr; + enum WEB_ADDON_ERROR auto_gen_ret = + kodi_addon_web_create_control_v1(this, auto_gen_hdl, &props, start_url.c_str(), &handle); + + msgpack::pack(out, + msgChild_OUT_kodi_addon_web_create_control_v1(auto_gen_ret, PtrValue(handle))); + return true; + } + case funcChild_kodi_addon_web_destroy_control_v1: + { + // Original API call: typedef enum WEB_ADDON_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_DESTROY_CONTROL_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, bool complete); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_destroy_control_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_destroy_control_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_destroy_control_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + bool complete = std::get<2>(t); + enum WEB_ADDON_ERROR auto_gen_ret = + kodi_addon_web_destroy_control_v1(this, auto_gen_hdl, handle, complete); + + msgpack::pack(out, msgChild_OUT_kodi_addon_web_destroy_control_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_web_control_render_init_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_RENDER_INIT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_render_init_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_render_init_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_render_init_v1 t = in.get().as(); + PtrKodiOffscreen kodiOffsetHdl = std::get<0>(t); + uint64_t renderId = std::get<1>(t); + int x = std::get<2>(t); + int y = std::get<3>(t); + int width = std::get<4>(t); + int height = std::get<5>(t); + ADDON_HARDWARE_CONTEXT context = reinterpret_cast(std::get<6>(t)); + IAddonOffscreenRenderControl* auto_gen_render_control = + GenerateOffscreenControl(kodiOffsetHdl, renderId, x, y, width, height, context); + bool auto_gen_render_ret = auto_gen_render_control && auto_gen_render_control->Start(); + + const KODI_ADDON_WEB_HDL hdl = reinterpret_cast(std::get<7>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<8>(t)); + bool auto_gen_ret = kodi_addon_web_control_render_init_v1(this, hdl, handle); + + msgpack::pack( + out, msgChild_OUT_kodi_addon_web_control_render_init_v1( + auto_gen_ret, PtrAddonOffscreen(auto_gen_render_control), auto_gen_render_ret)); + return true; + } + case funcChild_kodi_addon_web_control_render_deinit_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_RENDER_DEINIT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_render_deinit_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_render_deinit_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_render_deinit_v1 t = in.get().as(); + IAddonOffscreenRenderControl* auto_gen_render_control = + reinterpret_cast(std::get<0>(t)); + const KODI_ADDON_WEB_HDL hdl = reinterpret_cast(std::get<1>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<2>(t)); + kodi_addon_web_control_render_deinit_v1(this, hdl, handle); + + if (auto_gen_render_control) + { + { + auto_gen_render_control->Stop(); + delete auto_gen_render_control; + } + } + return true; + } + case funcChild_kodi_addon_web_control_render_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_RENDER_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_render_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_render_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_render_v1 t = in.get().as(); + IAddonOffscreenRenderControl* auto_gen_render_control = + reinterpret_cast(std::get<0>(t)); + if (auto_gen_render_control) + auto_gen_render_control->RenderBegin(); + + const KODI_ADDON_WEB_HDL hdl = reinterpret_cast(std::get<1>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<2>(t)); + kodi_addon_web_control_render_v1(this, hdl, handle); + + if (auto_gen_render_control) + auto_gen_render_control->RenderEnd(); + return true; + } + case funcChild_kodi_addon_web_control_dirty_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_DIRTY_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_dirty_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_dirty_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_dirty_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + bool auto_gen_ret = kodi_addon_web_control_dirty_v1(this, auto_gen_hdl, handle); + + msgpack::pack(out, msgChild_OUT_kodi_addon_web_control_dirty_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_web_control_on_init_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_ON_INIT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_on_init_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_on_init_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_on_init_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + bool auto_gen_ret = kodi_addon_web_control_on_init_v1(this, auto_gen_hdl, handle); + + msgpack::pack(out, msgChild_OUT_kodi_addon_web_control_on_init_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_web_control_on_action_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_ON_ACTION_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, const struct KODI_ADDON_ACTION_DATA* action, int* nextItem); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_on_action_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_on_action_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_on_action_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_ACTION_DATA action; + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + std::get<2>(t).SetCStructure(&action); + int nextItem = std::get<3>(t); + bool auto_gen_ret = + kodi_addon_web_control_on_action_v1(this, auto_gen_hdl, handle, &action, &nextItem); + + msgpack::pack(out, msgChild_OUT_kodi_addon_web_control_on_action_v1(auto_gen_ret, nextItem)); + return true; + } + case funcChild_kodi_addon_web_control_on_mouse_event_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_ON_MOUSE_EVENT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, int id, double x, double y, double offsetX, double offsetY, int state); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_on_mouse_event_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_on_mouse_event_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_on_mouse_event_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + int id = std::get<2>(t); + double x = std::get<3>(t); + double y = std::get<4>(t); + double offsetX = std::get<5>(t); + double offsetY = std::get<6>(t); + int state = std::get<7>(t); + bool auto_gen_ret = kodi_addon_web_control_on_mouse_event_v1(this, auto_gen_hdl, handle, id, + x, y, offsetX, offsetY, state); + + msgpack::pack(out, msgChild_OUT_kodi_addon_web_control_on_mouse_event_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_web_control_open_website_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_OPEN_WEBSITE_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, const char* url); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_open_website_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_open_website_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_open_website_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + const std::string& url = std::get<2>(t); + bool auto_gen_ret = + kodi_addon_web_control_open_website_v1(this, auto_gen_hdl, handle, url.c_str()); + + msgpack::pack(out, msgChild_OUT_kodi_addon_web_control_open_website_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_web_control_get_history_v1: + { + // Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_GET_HISTORY_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, char*** list, size_t* entries, bool behind_current); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_get_history_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple, size_t> msgChild_OUT_kodi_addon_web_control_get_history_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_get_history_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + char** list = nullptr; + size_t entries = std::get<2>(t); + bool behind_current = std::get<3>(t); + bool auto_gen_ret = kodi_addon_web_control_get_history_v1(this, auto_gen_hdl, handle, &list, + &entries, behind_current); + + std::vector cpp_list; + cpp_list.reserve(entries); + if (list) + { + for (size_t i = 0; i < entries; ++i) + { + if (list[i]) + { + cpp_list.emplace_back(list[i]); + free(list[i]); + } + else + { + cpp_list.emplace_back(""); + } + } + free(list); + } + msgpack::pack( + out, msgChild_OUT_kodi_addon_web_control_get_history_v1(auto_gen_ret, cpp_list, entries)); + return true; + } + case funcChild_kodi_addon_web_control_search_text_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SEARCH_TEXT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, const char* text, bool forward, bool matchCase, bool findNext); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_search_text_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_search_text_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_search_text_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + const std::string& text = std::get<2>(t); + bool forward = std::get<3>(t); + bool matchCase = std::get<4>(t); + bool findNext = std::get<5>(t); + kodi_addon_web_control_search_text_v1(this, auto_gen_hdl, handle, text.c_str(), forward, + matchCase, findNext); + + return true; + } + case funcChild_kodi_addon_web_control_stop_search_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_STOP_SEARCH_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, bool clearSelection); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_stop_search_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_stop_search_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_stop_search_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + bool clearSelection = std::get<2>(t); + kodi_addon_web_control_stop_search_v1(this, auto_gen_hdl, handle, clearSelection); + + return true; + } + case funcChild_kodi_addon_web_control_web_cmd_reload_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_RELOAD_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_web_cmd_reload_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_cmd_reload_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_web_cmd_reload_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + kodi_addon_web_control_web_cmd_reload_v1(this, auto_gen_hdl, handle); + + return true; + } + case funcChild_kodi_addon_web_control_web_cmd_stop_load_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_STOP_LOAD_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_web_cmd_stop_load_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_cmd_stop_load_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_web_cmd_stop_load_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + kodi_addon_web_control_web_cmd_stop_load_v1(this, auto_gen_hdl, handle); + + return true; + } + case funcChild_kodi_addon_web_control_web_cmd_nav_back_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_BACK_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_web_cmd_nav_back_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_cmd_nav_back_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_web_cmd_nav_back_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + kodi_addon_web_control_web_cmd_nav_back_v1(this, auto_gen_hdl, handle); + + return true; + } + case funcChild_kodi_addon_web_control_web_cmd_nav_forward_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_FORWARD_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_web_cmd_nav_forward_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_cmd_nav_forward_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_web_cmd_nav_forward_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + kodi_addon_web_control_web_cmd_nav_forward_v1(this, auto_gen_hdl, handle); + + return true; + } + case funcChild_kodi_addon_web_control_web_open_own_context_menu_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_OPEN_OWN_CONTEXT_MENU_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_web_open_own_context_menu_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_open_own_context_menu_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_web_open_own_context_menu_v1 t = + in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + kodi_addon_web_control_web_open_own_context_menu_v1(this, auto_gen_hdl, handle); + + return true; + } + case funcChild_kodi_addon_web_control_screen_size_change_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SCREEN_SIZE_CHANGE_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, float x, float y, float width, float height, bool fullscreen); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_web_control_screen_size_change_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_web_control_screen_size_change_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_web_control_screen_size_change_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + const WEB_KODI_CONTROL handle = reinterpret_cast(std::get<1>(t)); + float x = std::get<2>(t); + float y = std::get<3>(t); + float width = std::get<4>(t); + float height = std::get<5>(t); + bool fullscreen = std::get<6>(t); + kodi_addon_web_control_screen_size_change_v1(this, auto_gen_hdl, handle, x, y, width, height, + fullscreen); + + 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 WEB_ADDON_ERROR CHdl_kodi_addoninstance_web_h::kodi_addon_web_start_instance_v1( + void* thisClassHdl, const KODI_ADDON_WEB_HDL hdl) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return WEB_ADDON_ERROR_PERMANENT_FAILED; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum WEB_ADDON_ERROR auto_gen_ret = WEB_ADDON_ERROR_PERMANENT_FAILED; + if (union_data->types.kodi_addon_web.v1.start_instance) + { + auto_gen_ret = union_data->types.kodi_addon_web.v1.start_instance(union_data->hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_stop_instance_v1( + void* thisClassHdl, const KODI_ADDON_WEB_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_web.v1.stop_instance) + { + union_data->types.kodi_addon_web.v1.stop_instance(union_data->hdl); + } +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_main_initialize_v1( + void* thisClassHdl, const KODI_ADDON_WEB_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_web.v1.main_initialize) + { + auto_gen_ret = union_data->types.kodi_addon_web.v1.main_initialize(union_data->hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_main_loop_v1( + void* thisClassHdl, const KODI_ADDON_WEB_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_web.v1.main_loop) + { + union_data->types.kodi_addon_web.v1.main_loop(union_data->hdl); + } +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_main_shutdown_v1( + void* thisClassHdl, const KODI_ADDON_WEB_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_web.v1.main_shutdown) + { + union_data->types.kodi_addon_web.v1.main_shutdown(union_data->hdl); + } +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_set_mute_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + bool mute) // 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_web.v1.set_mute) + { + union_data->types.kodi_addon_web.v1.set_mute(union_data->hdl, mute); + } +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_set_language_v1( + void* thisClassHdl, const KODI_ADDON_WEB_HDL hdl, const char* language) // 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_web.v1.set_language) + { + auto_gen_ret = union_data->types.kodi_addon_web.v1.set_language(union_data->hdl, language); + } + return auto_gen_ret; +} + +enum WEB_ADDON_ERROR CHdl_kodi_addoninstance_web_h::kodi_addon_web_create_control_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const struct WEB_ADDON_GUI_PROPS* props, + const char* start_url, + WEB_KODI_CONTROL* handle) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return WEB_ADDON_ERROR_PERMANENT_FAILED; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum WEB_ADDON_ERROR auto_gen_ret = WEB_ADDON_ERROR_PERMANENT_FAILED; + if (union_data->types.kodi_addon_web.v1.create_control) + { + auto_gen_ret = union_data->types.kodi_addon_web.v1.create_control(union_data->hdl, props, + start_url, handle); + } + return auto_gen_ret; +} + +enum WEB_ADDON_ERROR CHdl_kodi_addoninstance_web_h::kodi_addon_web_destroy_control_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + bool complete) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return WEB_ADDON_ERROR_PERMANENT_FAILED; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + enum WEB_ADDON_ERROR auto_gen_ret = WEB_ADDON_ERROR_PERMANENT_FAILED; + if (union_data->types.kodi_addon_web.v1.destroy_control) + { + auto_gen_ret = + union_data->types.kodi_addon_web.v1.destroy_control(union_data->hdl, handle, complete); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_render_init_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) // 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_web.v1.control_render_init) + { + auto_gen_ret = union_data->types.kodi_addon_web.v1.control_render_init(union_data->hdl, handle); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_render_deinit_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) // 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_web.v1.control_render_deinit) + { + union_data->types.kodi_addon_web.v1.control_render_deinit(union_data->hdl, handle); + } +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_render_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) // 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_web.v1.control_render) + { + union_data->types.kodi_addon_web.v1.control_render(union_data->hdl, handle); + } +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_dirty_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) // 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_web.v1.control_dirty) + { + auto_gen_ret = union_data->types.kodi_addon_web.v1.control_dirty(union_data->hdl, handle); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_on_init_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) // 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_web.v1.control_on_init) + { + auto_gen_ret = union_data->types.kodi_addon_web.v1.control_on_init(union_data->hdl, handle); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_on_action_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const struct KODI_ADDON_ACTION_DATA* action, + int* nextItem) // 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_web.v1.control_on_action) + { + auto_gen_ret = union_data->types.kodi_addon_web.v1.control_on_action(union_data->hdl, handle, + action, nextItem); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_on_mouse_event_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + int id, + double x, + double y, + double offsetX, + double offsetY, + int state) // 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_web.v1.control_on_mouse_event) + { + auto_gen_ret = union_data->types.kodi_addon_web.v1.control_on_mouse_event( + union_data->hdl, handle, id, x, y, offsetX, offsetY, state); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_open_website_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const char* 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_web.v1.control_open_website) + { + auto_gen_ret = + union_data->types.kodi_addon_web.v1.control_open_website(union_data->hdl, handle, url); + } + return auto_gen_ret; +} + +bool CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_get_history_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + char*** list, + size_t* entries, + bool behind_current) // 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_web.v1.control_get_history) + { + auto_gen_ret = union_data->types.kodi_addon_web.v1.control_get_history( + union_data->hdl, handle, list, entries, behind_current); + } + return auto_gen_ret; +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_search_text_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const char* text, + bool forward, + bool matchCase, + bool findNext) // 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_web.v1.control_search_text) + { + union_data->types.kodi_addon_web.v1.control_search_text(union_data->hdl, handle, text, forward, + matchCase, findNext); + } +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_stop_search_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + bool clearSelection) // 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_web.v1.control_stop_search) + { + union_data->types.kodi_addon_web.v1.control_stop_search(union_data->hdl, handle, + clearSelection); + } +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_web_cmd_reload_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) // 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_web.v1.control_web_cmd_reload) + { + union_data->types.kodi_addon_web.v1.control_web_cmd_reload(union_data->hdl, handle); + } +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_web_cmd_stop_load_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) // 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_web.v1.control_web_cmd_stop_load) + { + union_data->types.kodi_addon_web.v1.control_web_cmd_stop_load(union_data->hdl, handle); + } +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_web_cmd_nav_back_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) // 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_web.v1.control_web_cmd_nav_back) + { + union_data->types.kodi_addon_web.v1.control_web_cmd_nav_back(union_data->hdl, handle); + } +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_web_cmd_nav_forward_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) // 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_web.v1.control_web_cmd_nav_forward) + { + union_data->types.kodi_addon_web.v1.control_web_cmd_nav_forward(union_data->hdl, handle); + } +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_web_open_own_context_menu_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle) // 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_web.v1.control_web_open_own_context_menu) + { + union_data->types.kodi_addon_web.v1.control_web_open_own_context_menu(union_data->hdl, handle); + } +} + +void CHdl_kodi_addoninstance_web_h::kodi_addon_web_control_screen_size_change_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + float x, + float y, + float width, + float height, + bool fullscreen) // 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_web.v1.control_screen_size_change) + { + union_data->types.kodi_addon_web.v1.control_screen_size_change(union_data->hdl, handle, x, y, + width, height, fullscreen); + } +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + +ATTR_DLL_EXPORT void kodi_addon_web_inhibit_shutdown(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + bool inhibit) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_inhibit_shutdown(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, bool inhibit); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_inhibit_shutdown_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_inhibit_shutdown_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_web_inhibit_shutdown_v1(PtrValue(hdl), inhibit)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_web_h, funcParent_kodi_addon_web_inhibit_shutdown_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_web_h; + auto_gen_group.kodi_addon_web_inhibit_shutdown_v1(auto_gen_group.thisClassHdl, hdl, inhibit); +} + +ATTR_DLL_EXPORT void kodi_addon_web_inhibit_screensaver(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + bool inhibit) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_inhibit_screensaver(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, bool inhibit); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_inhibit_screensaver_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_inhibit_screensaver_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_web_inhibit_screensaver_v1(PtrValue(hdl), inhibit)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_web_h, funcParent_kodi_addon_web_inhibit_screensaver_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_web_h; + auto_gen_group.kodi_addon_web_inhibit_screensaver_v1(auto_gen_group.thisClassHdl, hdl, inhibit); +} + +ATTR_DLL_EXPORT bool kodi_addon_web_is_muted(KODI_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_web_is_muted(KODI_ADDON_INSTANCE_BACKEND_HDL hdl); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_is_muted_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_is_muted_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_addon_web_is_muted_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_web_h, funcParent_kodi_addon_web_is_muted_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_web_is_muted_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_web_h; + return auto_gen_group.kodi_addon_web_is_muted_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT void kodi_addon_web_control_set_control_ready(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + bool ready) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_control_ready(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, bool ready); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_control_ready_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_control_ready_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_web_control_set_control_ready_v1( + PtrValue(hdl), PtrValue(handle), ready)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_web_h, funcParent_kodi_addon_web_control_set_control_ready_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_web_h; + auto_gen_group.kodi_addon_web_control_set_control_ready_v1(auto_gen_group.thisClassHdl, hdl, + handle, ready); +} + +ATTR_DLL_EXPORT void kodi_addon_web_control_set_opened_address(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* title) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_opened_address(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* title); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_opened_address_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_opened_address_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr || title == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_web_control_set_opened_address_v1( + PtrValue(hdl), PtrValue(handle), title)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_web_h, funcParent_kodi_addon_web_control_set_opened_address_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_web_h; + auto_gen_group.kodi_addon_web_control_set_opened_address_v1(auto_gen_group.thisClassHdl, hdl, + handle, title); +} + +ATTR_DLL_EXPORT void kodi_addon_web_control_set_opened_title(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* title) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_opened_title(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* title); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_opened_title_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_opened_title_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr || title == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_web_control_set_opened_title_v1( + PtrValue(hdl), PtrValue(handle), title)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_web_h, funcParent_kodi_addon_web_control_set_opened_title_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_web_h; + auto_gen_group.kodi_addon_web_control_set_opened_title_v1(auto_gen_group.thisClassHdl, hdl, + handle, title); +} + +ATTR_DLL_EXPORT void kodi_addon_web_control_set_icon_url(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* icon) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_icon_url(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* icon); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_icon_url_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_icon_url_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr || icon == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_web_control_set_icon_url_v1(PtrValue(hdl), + PtrValue(handle), icon)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_web_h, funcParent_kodi_addon_web_control_set_icon_url_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_web_h; + auto_gen_group.kodi_addon_web_control_set_icon_url_v1(auto_gen_group.thisClassHdl, hdl, handle, + icon); +} + +ATTR_DLL_EXPORT void kodi_addon_web_control_set_fullscreen(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + bool fullscreen) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_fullscreen(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, bool fullscreen); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_fullscreen_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_fullscreen_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_web_control_set_fullscreen_v1( + PtrValue(hdl), PtrValue(handle), fullscreen)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_web_h, funcParent_kodi_addon_web_control_set_fullscreen_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_web_h; + auto_gen_group.kodi_addon_web_control_set_fullscreen_v1(auto_gen_group.thisClassHdl, hdl, handle, + fullscreen); +} + +ATTR_DLL_EXPORT void kodi_addon_web_control_set_loading_state(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + bool isLoading, + bool canGoBack, + bool canGoForward) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_loading_state(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, bool isLoading, bool canGoBack, bool canGoForward); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_loading_state_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_loading_state_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_web_control_set_loading_state_v1( + PtrValue(hdl), PtrValue(handle), isLoading, canGoBack, canGoForward)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_web_h, funcParent_kodi_addon_web_control_set_loading_state_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_web_h; + auto_gen_group.kodi_addon_web_control_set_loading_state_v1( + auto_gen_group.thisClassHdl, hdl, handle, isLoading, canGoBack, canGoForward); +} + +ATTR_DLL_EXPORT void kodi_addon_web_control_set_tooltip(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* tooltip) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_tooltip(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* tooltip); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_tooltip_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_tooltip_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr || tooltip == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_web_control_set_tooltip_v1( + PtrValue(hdl), PtrValue(handle), tooltip)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_web_h, funcParent_kodi_addon_web_control_set_tooltip_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_web_h; + auto_gen_group.kodi_addon_web_control_set_tooltip_v1(auto_gen_group.thisClassHdl, hdl, handle, + tooltip); +} + +ATTR_DLL_EXPORT void kodi_addon_web_control_set_status_message(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + WEB_KODI_CONTROL handle, + const char* status) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_status_message(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* status); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_set_status_message_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_status_message_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr || status == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_web_control_set_status_message_v1( + PtrValue(hdl), PtrValue(handle), status)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_web_h, funcParent_kodi_addon_web_control_set_status_message_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_web_h; + auto_gen_group.kodi_addon_web_control_set_status_message_v1(auto_gen_group.thisClassHdl, hdl, + handle, status); +} + +ATTR_DLL_EXPORT void kodi_addon_web_control_request_open_site_in_new_tab( + KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* url) +{ + // Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_request_open_site_in_new_tab(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* url); __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_web_control_request_open_site_in_new_tab_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_web_control_request_open_site_in_new_tab_v1; /* Autogenerated */ + + if (hdl == nullptr || handle == nullptr || url == nullptr) + return; + +#ifndef KODI_INHIBIT_SHARED + if (!AddonIfc::g_ifc->direct_used) + { + msgpack::sbuffer in; + msgpack::pack(in, msgParent__IN_kodi_addon_web_control_request_open_site_in_new_tab_v1( + PtrValue(hdl), PtrValue(handle), url)); + AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addoninstance_web_h, + funcParent_kodi_addon_web_control_request_open_site_in_new_tab_v1, in); + return; + } +#endif /* !KODI_INHIBIT_SHARED */ + + const auto& auto_gen_group = AddonIfc::g_ifc->direct->to_kodi.addoninstance_web_h; + auto_gen_group.kodi_addon_web_control_request_open_site_in_new_tab_v1(auto_gen_group.thisClassHdl, + hdl, handle, 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/web.h b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/web.h new file mode 100644 index 0000000000000..9b81d52095a6f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon-instance/web.h @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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/web.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_web_h; +struct directFuncToKodi_addoninstance_web_h; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class ATTR_DLL_LOCAL CHdl_kodi_addoninstance_web_h : public IMsgHdl +{ +public: + CHdl_kodi_addoninstance_web_h(AddonIfc* ifc) : IMsgHdl(ifc) {} + + void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_addoninstance_web_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 WEB_ADDON_ERROR kodi_addon_web_start_instance_v1( + void* thisClassHdl, const KODI_ADDON_WEB_HDL hdl); // Added with API 1 + + static void kodi_addon_web_stop_instance_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl); // Added with API 1 + + static bool kodi_addon_web_main_initialize_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl); // Added with API 1 + + static void kodi_addon_web_main_loop_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl); // Added with API 1 + + static void kodi_addon_web_main_shutdown_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl); // Added with API 1 + + static void kodi_addon_web_set_mute_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + bool mute); // Added with API 1 + + static bool kodi_addon_web_set_language_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const char* language); // Added with API 1 + + static enum WEB_ADDON_ERROR kodi_addon_web_create_control_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const struct WEB_ADDON_GUI_PROPS* props, + const char* start_url, + WEB_KODI_CONTROL* handle); // Added with API 1 + + static enum WEB_ADDON_ERROR kodi_addon_web_destroy_control_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + bool complete); // Added with API 1 + + static bool kodi_addon_web_control_render_init_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + static void kodi_addon_web_control_render_deinit_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + static void kodi_addon_web_control_render_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + static bool kodi_addon_web_control_dirty_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + static bool kodi_addon_web_control_on_init_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + static bool kodi_addon_web_control_on_action_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const struct KODI_ADDON_ACTION_DATA* action, + int* nextItem); // Added with API 1 + + static bool kodi_addon_web_control_on_mouse_event_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + int id, + double x, + double y, + double offsetX, + double offsetY, + int state); // Added with API 1 + + static bool kodi_addon_web_control_open_website_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const char* url); // Added with API 1 + + static bool kodi_addon_web_control_get_history_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + char*** list, + size_t* entries, + bool behind_current); // Added with API 1 + + static void kodi_addon_web_control_search_text_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + const char* text, + bool forward, + bool matchCase, + bool findNext); // Added with API 1 + + static void kodi_addon_web_control_stop_search_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + bool clearSelection); // Added with API 1 + + static void kodi_addon_web_control_web_cmd_reload_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + static void kodi_addon_web_control_web_cmd_stop_load_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + static void kodi_addon_web_control_web_cmd_nav_back_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + static void kodi_addon_web_control_web_cmd_nav_forward_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + static void kodi_addon_web_control_web_open_own_context_menu_v1( + void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle); // Added with API 1 + + static void kodi_addon_web_control_screen_size_change_v1(void* thisClassHdl, + const KODI_ADDON_WEB_HDL hdl, + const WEB_KODI_CONTROL handle, + float x, + float y, + float width, + float height, + bool fullscreen); // 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..daee7668e6856 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon_base.cpp @@ -0,0 +1,1787 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_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; + 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_instance_setting_change_string_v1 = + kodi_addon_instance_setting_change_string_v1; + ifcToAddon->kodi_addon_instance_setting_change_boolean_v1 = + kodi_addon_instance_setting_change_boolean_v1; + ifcToAddon->kodi_addon_instance_setting_change_integer_v1 = + kodi_addon_instance_setting_change_integer_v1; + ifcToAddon->kodi_addon_instance_setting_change_float_v1 = + kodi_addon_instance_setting_change_float_v1; + ifcToAddon->kodi_addon_instance_create_v1 = kodi_addon_instance_create_v1; + ifcToAddon->kodi_addon_instance_destroy_v1 = kodi_addon_instance_destroy_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)(const struct KODI_ADDON_INSTANCE_INFO* first_instance, KODI_ADDON_HDL* hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_create_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_create_v1 t = in.get().as(); + KODI_ADDON_INSTANCE_INFO first_instance; + std::get<0>(t).SetCStructure(&first_instance); + KODI_ADDON_HDL hdl = nullptr; + enum ADDON_STATUS auto_gen_ret = kodi_addon_create_v1(this, &first_instance, &hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_create_v1(auto_gen_ret, PtrValue(hdl))); + 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_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, double 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); + double 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; + } + 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, const struct KODI_ADDON_INSTANCE_INFO* info, struct KODI_ADDON_INSTANCE_STRUCT* instance); + // 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 auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_HANDLE addonInstance = nullptr; + KODI_ADDON_INSTANCE_INFO info; /* CheckAPIUse_WAY_16 (0004) */ + std::get<1>(t).SetCStructure(&info); /* CheckAPIUse_WAY_16 (0004) */ + ADDON_STATUS status = + kodi_addon_create_instance_v1(this, auto_gen_hdl, &info, &addonInstance); + msgpack::pack(out, + msgChild_OUT_kodi_addon_create_instance_v1(status, 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, const struct KODI_ADDON_INSTANCE_INFO* info, const KODI_ADDON_INSTANCE_HDL instance_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_destroy_instance_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_destroy_instance_v1; /* Autogenerated */ + + /*---AUTO_GEN_PARSE---*/ + msgChild__IN_kodi_addon_destroy_instance_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_HANDLE instance = reinterpret_cast(std::get<2>(t)); + if (instance) + { + KODI_ADDON_INSTANCE_INFO info; /* CheckAPIUse_WAY_16 (0004) */ + std::get<1>(t).SetCStructure(&info); /* CheckAPIUse_WAY_16 (0004) */ + kodi_addon_destroy_instance_v1(this, auto_gen_hdl, &info /* CheckAPIUse_WAY_16 (0004) */, + instance + /* CheckAPIUse_WAY_12 (0004) */); + } + + /*---AUTO_GEN_PARSE---*/ + return true; + } + case funcChild_kodi_addon_instance_setting_change_string_v1: + { + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_STRING_V1)(const KODI_ADDON_HDL hdl, const KODI_ADDON_INSTANCE_HDL instance_hdl, const char* name, const char* value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_instance_setting_change_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_instance_setting_change_string_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_instance_setting_change_string_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_INSTANCE_STRUCT* instance_hdl = + reinterpret_cast(std::get<1>(t)); + const std::string& name = std::get<2>(t); + const std::string& value = std::get<3>(t); + enum ADDON_STATUS auto_gen_ret = kodi_addon_instance_setting_change_string_v1( + this, auto_gen_hdl, instance_hdl->hdl, name.c_str(), value.c_str()); + + msgpack::pack(out, msgChild_OUT_kodi_addon_instance_setting_change_string_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_instance_setting_change_boolean_v1: + { + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_BOOLEAN_V1)(const KODI_ADDON_HDL hdl, const KODI_ADDON_INSTANCE_HDL instance_hdl, const char* name, bool value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_instance_setting_change_boolean_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_instance_setting_change_boolean_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_instance_setting_change_boolean_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_INSTANCE_STRUCT* instance_hdl = + reinterpret_cast(std::get<1>(t)); + const std::string& name = std::get<2>(t); + bool value = std::get<3>(t); + enum ADDON_STATUS auto_gen_ret = kodi_addon_instance_setting_change_boolean_v1( + this, auto_gen_hdl, instance_hdl->hdl, name.c_str(), value); + + msgpack::pack(out, msgChild_OUT_kodi_addon_instance_setting_change_boolean_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_instance_setting_change_integer_v1: + { + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_INTEGER_V1)(const KODI_ADDON_HDL hdl, const KODI_ADDON_INSTANCE_HDL instance_hdl, const char* name, int value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_instance_setting_change_integer_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_instance_setting_change_integer_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_instance_setting_change_integer_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_INSTANCE_STRUCT* instance_hdl = + reinterpret_cast(std::get<1>(t)); + const std::string& name = std::get<2>(t); + int value = std::get<3>(t); + enum ADDON_STATUS auto_gen_ret = kodi_addon_instance_setting_change_integer_v1( + this, auto_gen_hdl, instance_hdl->hdl, name.c_str(), value); + + msgpack::pack(out, msgChild_OUT_kodi_addon_instance_setting_change_integer_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_instance_setting_change_float_v1: + { + // Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_FLOAT_V1)(const KODI_ADDON_HDL hdl, const KODI_ADDON_INSTANCE_HDL instance_hdl, const char* name, double value); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_instance_setting_change_float_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_instance_setting_change_float_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_instance_setting_change_float_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_INSTANCE_STRUCT* instance_hdl = + reinterpret_cast(std::get<1>(t)); + const std::string& name = std::get<2>(t); + double value = std::get<3>(t); + enum ADDON_STATUS auto_gen_ret = kodi_addon_instance_setting_change_float_v1( + this, auto_gen_hdl, instance_hdl->hdl, name.c_str(), value); + + msgpack::pack(out, msgChild_OUT_kodi_addon_instance_setting_change_float_v1(auto_gen_ret)); + return true; + } + case funcChild_kodi_addon_instance_create_v1: + { + // Original API call: typedef KODI_ADDON_INSTANCE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_CREATE_V1)(KODI_ADDON_INSTANCE_BACKEND_HDL kodi_hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_instance_create_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_instance_create_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_instance_create_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + KODI_ADDON_INSTANCE_BACKEND_HDL kodi_hdl = + reinterpret_cast(std::get<0>(t)); + KODI_ADDON_INSTANCE_HDL auto_gen_ret = kodi_addon_instance_create_v1(this, kodi_hdl); + + msgpack::pack(out, msgChild_OUT_kodi_addon_instance_create_v1(PtrValue(auto_gen_ret))); + return true; + } + case funcChild_kodi_addon_instance_destroy_v1: + { + // Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_DESTROY_V1)(KODI_ADDON_INSTANCE_HDL hdl); + // Tuple in: typedef std::tuple msgChild__IN_kodi_addon_instance_destroy_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgChild_OUT_kodi_addon_instance_destroy_v1; /* Autogenerated */ + + msgChild__IN_kodi_addon_instance_destroy_v1 t = in.get().as(); + KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t)); + + kodi_addon_instance_destroy_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---*/ + +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)); +} + +/*---AUTO_GEN_PARSE---*/ + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_create_v1( + void* thisClassHdl, + const struct KODI_ADDON_INSTANCE_INFO* first_instance, + 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(first_instance, 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_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, + double 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; +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_create_instance_v1( + void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const struct KODI_ADDON_INSTANCE_INFO* info, + KODI_HANDLE* instance) // 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 = info->type; + instanceStruct->kodi = info->kodi; + + KODI_ADDON_INSTANCE_STRUCT addonInstance; + addonInstance.dummy = &instanceStruct->types.dummy; + + status = data->types.kodi_addon.v1.create_instance(data->hdl, info, &addonInstance); + if (!addonInstance.dummy && status == ADDON_STATUS_OK) + { + status = ADDON_STATUS_PERMANENT_FAILURE; + } + else if (addonInstance.dummy) + { + if (info->type == ADDON_INSTANCE_AUDIODECODER) + { + if (&instanceStruct->types.kodi_addon_audiodecoder.v1 != + reinterpret_casttypes.kodi_addon_audiodecoder.v1)*>( + addonInstance.audiodecoder)) + instanceStruct->types.kodi_addon_audiodecoder.v1 = + *reinterpret_casttypes.kodi_addon_audiodecoder.v1)*>( + addonInstance.audiodecoder); + if (instanceStruct->types.kodi_addon_audiodecoder.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_audiodecoder.v1.create(instance); + else + instanceStruct->hdl = addonInstance.hdl; + goto done; + } + if (info->type == ADDON_INSTANCE_AUDIOENCODER) + { + if (&instanceStruct->types.kodi_addon_audioencoder.v1 != + reinterpret_casttypes.kodi_addon_audioencoder.v1)*>( + addonInstance.audioencoder)) + instanceStruct->types.kodi_addon_audioencoder.v1 = + *reinterpret_casttypes.kodi_addon_audioencoder.v1)*>( + addonInstance.audioencoder); + if (instanceStruct->types.kodi_addon_audioencoder.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_audioencoder.v1.create(instance); + else + instanceStruct->hdl = addonInstance.hdl; + goto done; + } + if (info->type == ADDON_INSTANCE_GAME) + { + if (&instanceStruct->types.kodi_addon_game.v1 != + reinterpret_casttypes.kodi_addon_game.v1)*>( + addonInstance.game)) + instanceStruct->types.kodi_addon_game.v1 = + *reinterpret_casttypes.kodi_addon_game.v1)*>( + addonInstance.game); + if (instanceStruct->types.kodi_addon_game.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_game.v1.create(instance); + else + instanceStruct->hdl = addonInstance.hdl; + goto done; + } + if (info->type == ADDON_INSTANCE_IMAGEDECODER) + { + if (&instanceStruct->types.kodi_addon_imagedecoder.v1 != + reinterpret_casttypes.kodi_addon_imagedecoder.v1)*>( + addonInstance.imagedecoder)) + instanceStruct->types.kodi_addon_imagedecoder.v1 = + *reinterpret_casttypes.kodi_addon_imagedecoder.v1)*>( + addonInstance.imagedecoder); + if (instanceStruct->types.kodi_addon_imagedecoder.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_imagedecoder.v1.create(instance); + else + instanceStruct->hdl = addonInstance.hdl; + goto done; + } + if (info->type == ADDON_INSTANCE_INPUTSTREAM) + { + if (&instanceStruct->types.kodi_addon_inputstream.v1 != + reinterpret_casttypes.kodi_addon_inputstream.v1)*>( + addonInstance.inputstream)) + instanceStruct->types.kodi_addon_inputstream.v1 = + *reinterpret_casttypes.kodi_addon_inputstream.v1)*>( + addonInstance.inputstream); + if (instanceStruct->types.kodi_addon_inputstream.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_inputstream.v1.create(instance); + else + instanceStruct->hdl = addonInstance.hdl; + goto done; + } + if (info->type == ADDON_INSTANCE_PERIPHERAL) + { + if (&instanceStruct->types.kodi_addon_peripheral.v1 != + reinterpret_casttypes.kodi_addon_peripheral.v1)*>( + addonInstance.peripheral)) + instanceStruct->types.kodi_addon_peripheral.v1 = + *reinterpret_casttypes.kodi_addon_peripheral.v1)*>( + addonInstance.peripheral); + if (instanceStruct->types.kodi_addon_peripheral.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_peripheral.v1.create(instance); + else + instanceStruct->hdl = addonInstance.hdl; + goto done; + } + if (info->type == ADDON_INSTANCE_SCREENSAVER) + { + if (&instanceStruct->types.kodi_addon_screensaver.v1 != + reinterpret_casttypes.kodi_addon_screensaver.v1)*>( + addonInstance.screensaver)) + instanceStruct->types.kodi_addon_screensaver.v1 = + *reinterpret_casttypes.kodi_addon_screensaver.v1)*>( + addonInstance.screensaver); + if (instanceStruct->types.kodi_addon_screensaver.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_screensaver.v1.create(instance); + else + instanceStruct->hdl = addonInstance.hdl; + goto done; + } + if (info->type == ADDON_INSTANCE_VFS) + { + if (&instanceStruct->types.kodi_addon_vfs.v1 != + reinterpret_casttypes.kodi_addon_vfs.v1)*>(addonInstance.vfs)) + instanceStruct->types.kodi_addon_vfs.v1 = + *reinterpret_casttypes.kodi_addon_vfs.v1)*>( + addonInstance.vfs); + if (instanceStruct->types.kodi_addon_vfs.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_vfs.v1.create(instance); + else + instanceStruct->hdl = addonInstance.hdl; + goto done; + } + if (info->type == ADDON_INSTANCE_VIDEOCODEC) + { + if (&instanceStruct->types.kodi_addon_videocodec.v1 != + reinterpret_casttypes.kodi_addon_videocodec.v1)*>( + addonInstance.videocodec)) + instanceStruct->types.kodi_addon_videocodec.v1 = + *reinterpret_casttypes.kodi_addon_videocodec.v1)*>( + addonInstance.videocodec); + if (instanceStruct->types.kodi_addon_videocodec.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_videocodec.v1.create(instance); + else + instanceStruct->hdl = addonInstance.hdl; + goto done; + } + if (info->type == ADDON_INSTANCE_VISUALIZATION) + { + if (&instanceStruct->types.kodi_addon_visualization.v1 != + reinterpret_casttypes.kodi_addon_visualization.v1)*>( + addonInstance.visualization)) + instanceStruct->types.kodi_addon_visualization.v1 = + *reinterpret_casttypes.kodi_addon_visualization.v1)*>( + addonInstance.visualization); + if (instanceStruct->types.kodi_addon_visualization.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_visualization.v1.create(instance); + else + instanceStruct->hdl = addonInstance.hdl; + goto done; + } + if (info->type == ADDON_INSTANCE_WEB) + { + if (&instanceStruct->types.kodi_addon_web.v1 != + reinterpret_casttypes.kodi_addon_web.v1)*>(addonInstance.web)) + instanceStruct->types.kodi_addon_web.v1 = + *reinterpret_casttypes.kodi_addon_web.v1)*>( + addonInstance.web); + if (instanceStruct->types.kodi_addon_web.v1.create) + instanceStruct->hdl = instanceStruct->types.kodi_addon_web.v1.create(instance); + else + instanceStruct->hdl = addonInstance.hdl; + goto done; + } + done: + *instance = 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, + const struct KODI_ADDON_INSTANCE_INFO* info, + const 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 (info->type == ADDON_INSTANCE_AUDIODECODER) + { + if (instanceStruct->types.kodi_addon_audiodecoder.v1.destroy) + instanceStruct->types.kodi_addon_audiodecoder.v1.destroy(instanceStruct->hdl); + goto done; + } + if (info->type == ADDON_INSTANCE_AUDIOENCODER) + { + if (instanceStruct->types.kodi_addon_audioencoder.v1.destroy) + instanceStruct->types.kodi_addon_audioencoder.v1.destroy(instanceStruct->hdl); + goto done; + } + if (info->type == ADDON_INSTANCE_GAME) + { + if (instanceStruct->types.kodi_addon_game.v1.destroy) + instanceStruct->types.kodi_addon_game.v1.destroy(instanceStruct->hdl); + goto done; + } + if (info->type == ADDON_INSTANCE_IMAGEDECODER) + { + if (instanceStruct->types.kodi_addon_imagedecoder.v1.destroy) + instanceStruct->types.kodi_addon_imagedecoder.v1.destroy(instanceStruct->hdl); + goto done; + } + if (info->type == ADDON_INSTANCE_INPUTSTREAM) + { + if (instanceStruct->types.kodi_addon_inputstream.v1.destroy) + instanceStruct->types.kodi_addon_inputstream.v1.destroy(instanceStruct->hdl); + goto done; + } + if (info->type == ADDON_INSTANCE_PERIPHERAL) + { + if (instanceStruct->types.kodi_addon_peripheral.v1.destroy) + instanceStruct->types.kodi_addon_peripheral.v1.destroy(instanceStruct->hdl); + goto done; + } + if (info->type == ADDON_INSTANCE_SCREENSAVER) + { + if (instanceStruct->types.kodi_addon_screensaver.v1.destroy) + instanceStruct->types.kodi_addon_screensaver.v1.destroy(instanceStruct->hdl); + goto done; + } + if (info->type == ADDON_INSTANCE_VFS) + { + if (instanceStruct->types.kodi_addon_vfs.v1.destroy) + instanceStruct->types.kodi_addon_vfs.v1.destroy(instanceStruct->hdl); + goto done; + } + if (info->type == ADDON_INSTANCE_VIDEOCODEC) + { + if (instanceStruct->types.kodi_addon_videocodec.v1.destroy) + instanceStruct->types.kodi_addon_videocodec.v1.destroy(instanceStruct->hdl); + goto done; + } + if (info->type == ADDON_INSTANCE_VISUALIZATION) + { + if (instanceStruct->types.kodi_addon_visualization.v1.destroy) + instanceStruct->types.kodi_addon_visualization.v1.destroy(instanceStruct->hdl); + goto done; + } + if (info->type == ADDON_INSTANCE_WEB) + { + if (instanceStruct->types.kodi_addon_web.v1.destroy) + instanceStruct->types.kodi_addon_web.v1.destroy(instanceStruct->hdl); + goto done; + } + done: + if (data->types.kodi_addon.v1.destroy_instance) + { + data->types.kodi_addon.v1.destroy_instance(data->hdl, info, instanceStruct->hdl); + } + delete instanceStruct; + } + /*---AUTO_GEN_PARSE---*/ +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_instance_setting_change_string_v1( + void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_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); + UnionAddonFunctions* instanceStruct = reinterpret_cast(instance_hdl); + enum ADDON_STATUS auto_gen_ret = ADDON_STATUS_OK; + if (union_data->types.kodi_addon.v1.instance_setting_change_string) + { + auto_gen_ret = union_data->types.kodi_addon.v1.instance_setting_change_string( + union_data->hdl, instanceStruct->hdl, name, value); + } + return auto_gen_ret; +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_instance_setting_change_boolean_v1( + void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_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); + UnionAddonFunctions* instanceStruct = reinterpret_cast(instance_hdl); + enum ADDON_STATUS auto_gen_ret = ADDON_STATUS_OK; + if (union_data->types.kodi_addon.v1.instance_setting_change_boolean) + { + auto_gen_ret = union_data->types.kodi_addon.v1.instance_setting_change_boolean( + union_data->hdl, instanceStruct->hdl, name, value); + } + return auto_gen_ret; +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_instance_setting_change_integer_v1( + void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_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); + UnionAddonFunctions* instanceStruct = reinterpret_cast(instance_hdl); + enum ADDON_STATUS auto_gen_ret = ADDON_STATUS_OK; + if (union_data->types.kodi_addon.v1.instance_setting_change_integer) + { + auto_gen_ret = union_data->types.kodi_addon.v1.instance_setting_change_integer( + union_data->hdl, instanceStruct->hdl, name, value); + } + return auto_gen_ret; +} + +enum ADDON_STATUS CHdl_kodi_addon_base_h::kodi_addon_instance_setting_change_float_v1( + void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + double value) // Added with API 1 +{ + auto thisClass = reinterpret_cast(thisClassHdl); + if (thisClass == nullptr) + return ADDON_STATUS_OK; + + UnionAddonFunctions* union_data = reinterpret_cast(hdl); + UnionAddonFunctions* instanceStruct = reinterpret_cast(instance_hdl); + enum ADDON_STATUS auto_gen_ret = ADDON_STATUS_OK; + if (union_data->types.kodi_addon.v1.instance_setting_change_float) + { + auto_gen_ret = union_data->types.kodi_addon.v1.instance_setting_change_float( + union_data->hdl, instanceStruct->hdl, name, value); + } + return auto_gen_ret; +} + +KODI_ADDON_INSTANCE_HDL CHdl_kodi_addon_base_h::kodi_addon_instance_create_v1( + void* thisClassHdl, KODI_ADDON_INSTANCE_BACKEND_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_INSTANCE_HDL auto_gen_ret = nullptr; + if (union_data->types.kodi_addon_instance.v1.create) + { + auto_gen_ret = union_data->types.kodi_addon_instance.v1.create(kodi_hdl); + } + return auto_gen_ret; +} + +void CHdl_kodi_addon_base_h::kodi_addon_instance_destroy_v1( + void* thisClassHdl, KODI_ADDON_INSTANCE_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_instance.v1.destroy) + { + union_data->types.kodi_addon_instance.v1.destroy(union_data->hdl); + } +} + +} /* 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 = 0; 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_addon_path() +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_get_addon_path() __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_get_addon_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_get_addon_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_addon_path_v1, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_get_addon_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_addon_path_v1(auto_gen_group.thisClassHdl); +} + +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_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_localized_string(long label_id) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_localized_string(long label_id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_localized_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_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_addon_localized_string_v1(label_id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_localized_string_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_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.addon_base_h; + return auto_gen_group.kodi_addon_localized_string_v1(auto_gen_group.thisClassHdl, label_id); +} + +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, double* value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_get_setting_float(const char* id, double* 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, double value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_set_setting_float(const char* id, double 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); +} + +ATTR_DLL_EXPORT char* kodi_addon_instance_get_user_path(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl) +{ + // Original API call: ATTR_DLL_EXPORT char* kodi_addon_instance_get_user_path(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_get_user_path_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_get_user_path_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_instance_get_user_path_v1(PtrValue(hdl))); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_instance_get_user_path_v1, in, out)) + return nullptr; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_instance_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_instance_get_user_path_v1(auto_gen_group.thisClassHdl, hdl); +} + +ATTR_DLL_EXPORT bool kodi_addon_instance_is_setting_using_default( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_is_setting_using_default( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_is_setting_using_default_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_is_setting_using_default_v1; /* Autogenerated */ + + if (hdl == nullptr || 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_instance_is_setting_using_default_v1(PtrValue(hdl), id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_instance_is_setting_using_default_v1, in, + out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_instance_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_instance_is_setting_using_default_v1(auto_gen_group.thisClassHdl, + hdl, id); +} + +ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_bool(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* id, + bool* value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_bool( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, bool* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_get_setting_bool_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_get_setting_bool_v1; /* Autogenerated */ + + if (hdl == nullptr || 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_instance_get_setting_bool_v1(PtrValue(hdl), id, *value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_instance_get_setting_bool_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_instance_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_instance_get_setting_bool_v1(auto_gen_group.thisClassHdl, hdl, + id, value); +} + +ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_int(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* id, + int* value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_int( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, int* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_get_setting_int_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_get_setting_int_v1; /* Autogenerated */ + + if (hdl == nullptr || 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_instance_get_setting_int_v1(PtrValue(hdl), id, *value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_instance_get_setting_int_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_instance_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_instance_get_setting_int_v1(auto_gen_group.thisClassHdl, hdl, id, + value); +} + +ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_float( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, double* value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_float( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, double* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_get_setting_float_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_get_setting_float_v1; /* Autogenerated */ + + if (hdl == nullptr || 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_instance_get_setting_float_v1(PtrValue(hdl), id, *value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_instance_get_setting_float_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_instance_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_instance_get_setting_float_v1(auto_gen_group.thisClassHdl, hdl, + id, value); +} + +ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_string( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, char** value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_string( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, char** value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_get_setting_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_get_setting_string_v1; /* Autogenerated */ + + if (hdl == nullptr || 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_instance_get_setting_string_v1(PtrValue(hdl), id)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_instance_get_setting_string_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_instance_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_instance_get_setting_string_v1(auto_gen_group.thisClassHdl, hdl, + id, value); +} + +ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_bool(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* id, + bool value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_bool( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, bool value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_set_setting_bool_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_set_setting_bool_v1; /* Autogenerated */ + + if (hdl == nullptr || 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_instance_set_setting_bool_v1(PtrValue(hdl), id, value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_instance_set_setting_bool_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_instance_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_instance_set_setting_bool_v1(auto_gen_group.thisClassHdl, hdl, + id, value); +} + +ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_int(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, + const char* id, + int value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_int( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, int value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_set_setting_int_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_set_setting_int_v1; /* Autogenerated */ + + if (hdl == nullptr || 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_instance_set_setting_int_v1(PtrValue(hdl), id, value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_instance_set_setting_int_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_instance_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_instance_set_setting_int_v1(auto_gen_group.thisClassHdl, hdl, id, + value); +} + +ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_float( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, double value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_float( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, double value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_set_setting_float_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_set_setting_float_v1; /* Autogenerated */ + + if (hdl == nullptr || 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_instance_set_setting_float_v1(PtrValue(hdl), id, value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_instance_set_setting_float_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_instance_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_instance_set_setting_float_v1(auto_gen_group.thisClassHdl, hdl, + id, value); +} + +ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_string( + const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, const char* value) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_string( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, const char* value) __INTRODUCED_IN_KODI(1); + // Tuple in: typedef std::tuple msgParent__IN_kodi_addon_instance_set_setting_string_v1; /* Autogenerated */ + // Tuple out: typedef std::tuple msgParent_OUT_kodi_addon_instance_set_setting_string_v1; /* Autogenerated */ + + if (hdl == nullptr || 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_instance_set_setting_string_v1(PtrValue(hdl), id, value)); + if (!AddonIfc::g_ifc->control->GetThreadIfc()->SendMessage( + funcGroup_addon_base_h, funcParent_kodi_addon_instance_set_setting_string_v1, in, out)) + return false; + msgpack::unpacked ident = msgpack::unpack(out.data(), out.size()); + msgParent_OUT_kodi_addon_instance_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_instance_set_setting_string_v1(auto_gen_group.thisClassHdl, hdl, + 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..3453a6e372c22 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/addon_base.h @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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, + const struct KODI_ADDON_INSTANCE_INFO* first_instance, + 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_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, + double value); // Added with API 1 + + static enum ADDON_STATUS kodi_addon_create_instance_v1( + void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const struct KODI_ADDON_INSTANCE_INFO* info, + KODI_HANDLE* instance); // Added with API 1 + + static void kodi_addon_destroy_instance_v1(void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const struct KODI_ADDON_INSTANCE_INFO* info, + const KODI_HANDLE instance); // Added with API 1 + + static enum ADDON_STATUS kodi_addon_instance_setting_change_string_v1( + void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + const char* value); // Added with API 1 + + static enum ADDON_STATUS kodi_addon_instance_setting_change_boolean_v1( + void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + bool value); // Added with API 1 + + static enum ADDON_STATUS kodi_addon_instance_setting_change_integer_v1( + void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + int value); // Added with API 1 + + static enum ADDON_STATUS kodi_addon_instance_setting_change_float_v1( + void* thisClassHdl, + const KODI_ADDON_HDL hdl, + const KODI_ADDON_INSTANCE_HDL instance_hdl, + const char* name, + double value); // Added with API 1 + + static KODI_ADDON_INSTANCE_HDL kodi_addon_instance_create_v1( + void* thisClassHdl, KODI_ADDON_INSTANCE_BACKEND_HDL kodi_hdl); // Added with API 1 + + static void kodi_addon_instance_destroy_v1(void* thisClassHdl, + KODI_ADDON_INSTANCE_HDL hdl); // 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..68e6f0a7539b1 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/audio_engine.cpp @@ -0,0 +1,798 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..cec070a014115 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/audio_engine.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..f0bb4726ce09b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/dl/kodi_api_1.c @@ -0,0 +1,580 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_addon_path = &kodi_addon_get_addon_path; + 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_temp_path = &kodi_addon_get_temp_path; + api->kodi_addon_get_user_path = &kodi_addon_get_user_path; + api->kodi_addon_instance_get_setting_bool = &kodi_addon_instance_get_setting_bool; + api->kodi_addon_instance_get_setting_float = &kodi_addon_instance_get_setting_float; + api->kodi_addon_instance_get_setting_int = &kodi_addon_instance_get_setting_int; + api->kodi_addon_instance_get_setting_string = &kodi_addon_instance_get_setting_string; + api->kodi_addon_instance_get_user_path = &kodi_addon_instance_get_user_path; + api->kodi_addon_instance_is_setting_using_default = &kodi_addon_instance_is_setting_using_default; + api->kodi_addon_instance_set_setting_bool = &kodi_addon_instance_set_setting_bool; + api->kodi_addon_instance_set_setting_float = &kodi_addon_instance_set_setting_float; + api->kodi_addon_instance_set_setting_int = &kodi_addon_instance_set_setting_int; + api->kodi_addon_instance_set_setting_string = &kodi_addon_instance_set_setting_string; + api->kodi_addon_is_setting_using_default = &kodi_addon_is_setting_using_default; + api->kodi_addon_localized_string = &kodi_addon_localized_string; + 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_hw_get_proc_address = &kodi_addon_game_hw_get_proc_address; + 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; + + // 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; + + // addon-instance/web.h + api->kodi_addon_web_control_request_open_site_in_new_tab = + &kodi_addon_web_control_request_open_site_in_new_tab; + api->kodi_addon_web_control_set_control_ready = &kodi_addon_web_control_set_control_ready; + api->kodi_addon_web_control_set_fullscreen = &kodi_addon_web_control_set_fullscreen; + api->kodi_addon_web_control_set_icon_url = &kodi_addon_web_control_set_icon_url; + api->kodi_addon_web_control_set_loading_state = &kodi_addon_web_control_set_loading_state; + api->kodi_addon_web_control_set_opened_address = &kodi_addon_web_control_set_opened_address; + api->kodi_addon_web_control_set_opened_title = &kodi_addon_web_control_set_opened_title; + api->kodi_addon_web_control_set_status_message = &kodi_addon_web_control_set_status_message; + api->kodi_addon_web_control_set_tooltip = &kodi_addon_web_control_set_tooltip; + api->kodi_addon_web_inhibit_screensaver = &kodi_addon_web_inhibit_screensaver; + api->kodi_addon_web_inhibit_shutdown = &kodi_addon_web_inhibit_shutdown; + api->kodi_addon_web_is_muted = &kodi_addon_web_is_muted; + + // 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..d7ef08df80105 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/filesystem.cpp @@ -0,0 +1,1762 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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(calloc(ifc_items.size(), sizeof(VFS_DIR_ENTRY))); + 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, uint32_t rate) +{ + // Original API call: ATTR_DLL_EXPORT bool kodi_vfs_file_io_ctl_set_cache_rate(KODI_FILE_HDL hdl, uint32_t 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..2a7f94e53cf2a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/filesystem.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..921a3f47ec186 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/general.cpp @@ -0,0 +1,478 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..331139752b669 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/general.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..7ba0707fa175b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/button.cpp @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..091d3d11bd71d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/button.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..9e4e3e5785da6 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/edit.cpp @@ -0,0 +1,302 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..b1825ea47d7b7 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/edit.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..86c1b1620d9ec --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/fade_label.cpp @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..252dc537629dd --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/fade_label.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..33123917925bc --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/image.cpp @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..929bd0a38d26d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/image.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..c63ae4bb6407d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/label.cpp @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..3fddde73e8d5b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/label.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..51440b46b7866 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/progress.cpp @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..3069a191db429 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/progress.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..cbd5615586883 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/radio_button.cpp @@ -0,0 +1,227 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..f7ad06474de37 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/radio_button.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..75e285b1fe435 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/rendering.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..658be59115667 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/rendering.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..65c3574146379 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/settings_slider.cpp @@ -0,0 +1,459 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..ca05a66431eb1 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/settings_slider.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..74a527097719a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/slider.cpp @@ -0,0 +1,449 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..c2a1d4355ed8a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/slider.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..29e8398f48a0b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/spin.cpp @@ -0,0 +1,490 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..adc0684444b87 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/spin.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..afde2ce9b4b0c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/text_box.cpp @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..f3c903fce4421 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/controls/text_box.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..55650e9386f31 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/context_menu.cpp @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..31bef254257e9 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/context_menu.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..fbbda969e19a2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/extended_progress.cpp @@ -0,0 +1,381 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..e4c12337d7f4e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/extended_progress.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..b2af6cae61142 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/filebrowser.cpp @@ -0,0 +1,372 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..aa0cc46f670bc --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/filebrowser.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..40dda10f297f3 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/keyboard.cpp @@ -0,0 +1,414 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..e22c5857da5e9 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/keyboard.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..eae4183da7ea2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/numeric.cpp @@ -0,0 +1,329 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..cdf5fe3c258e8 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/numeric.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..48cddc275d4ad --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/ok.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..2044996b59bca --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/ok.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..47bf90f123954 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/progress.cpp @@ -0,0 +1,412 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..d0b5611b3c6e3 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/progress.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..d255d18e1381d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/select.cpp @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..97dcc3f1281db --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/select.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..b241b9a3689ca --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/text_viewer.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..6ea6a1660dde1 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/text_viewer.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..287fa2536bf79 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/yes_no.cpp @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..4bc05a5576718 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/dialogs/yes_no.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..dfebf26f307a2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/general.cpp @@ -0,0 +1,233 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_CONTEXT kodi_gui_get_hw_context() +{ + // Original API call: ATTR_DLL_EXPORT ADDON_HARDWARE_CONTEXT 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..97ae12cc39d60 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/general.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..d14d6333b37d3 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/list_item.cpp @@ -0,0 +1,432 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..c7e6688fd569d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/list_item.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..7f6f821f72011 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/window.cpp @@ -0,0 +1,1340 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..739e0a3e0ad86 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/gui/window.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..657b1cdf6325a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/monitor.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..f7c5519559059 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/monitor.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..0088a17ef3bc2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/network.cpp @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..4d1b30b0f1232 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/api/network.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..7d4e5ff44aace --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/CMakeLists.txt @@ -0,0 +1,24 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + addon_control.cpp + addon_offscreen_render_base_linux.cpp + addon_offscreen_render_control.cpp + addon_offscreen_render_control_linux.cpp + addon_thread_control.cpp +) + +set(HEADERS + IMsgHdl.h + addon_control.h + addon_offscreen_render_base.h + addon_offscreen_render_base_linux.h + addon_offscreen_render_control.h + addon_offscreen_render_control_linux.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..4944f8767f1d5 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/IMsgHdl.h @@ -0,0 +1,40 @@ +/* + * 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..af93215d2345c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_control.cpp @@ -0,0 +1,242 @@ +/* + * 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-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/addon-instance/web.h" +#include "api/addon_base.h" +#include "api/gui/window.h" +/*---AUTO_GEN_PARSE---*/ + +#if defined(TARGET_LINUX) +#include "addon_offscreen_render_base_linux.h" +#else +#error Not supported OS target! +#endif + +using namespace KODI::ADDONS::INTERFACE; +using kodi::tools::StringUtils; +using KODI_ADDON::INTERNAL::AddonIfc; +using KODI_ADDON::INTERNAL::CAddonControl; +using KODI_ADDON::INTERNAL::CAddonThreadIfc; + +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_addoninstance_web_h* addoninstance_web_h = new CHdl_kodi_addoninstance_web_h(m_ifc); + m_handlers[funcGroup_addoninstance_web_h] = addoninstance_web_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); + addoninstance_web_h->InitDirect(&m_ifc->direct->to_addon.addoninstance_web_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() +{ + m_stackTrace.load_here(32); + + 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(); +} + +std::shared_ptr CAddonControl::GetOffscreenRenderBase() +{ +#if defined(TARGET_LINUX) + if (!m_offsceenRenderBase) + { + m_offsceenRenderBase = std::make_shared(); + if (!m_offsceenRenderBase->Create()) + fprintf(stderr, "FATAL: Failed to create offscreen rendering base class!\n"); + } + + return m_offsceenRenderBase; + +#else + return nullptr; +#endif +} 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..d05f35f0d5ab8 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_control.h @@ -0,0 +1,95 @@ +/* + * 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 "../../shared/DirectData.h" +#include "../../shared/Instances.h" +#define BACKWARD_HAS_DW 1 +#include "../third_party/backward-cpp/backward.hpp" +#include "IMsgHdl.h" +#include "addon_thread_control.h" + +#include +#include +#include +#include +#include +#include +#include + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class CAddonControl; +class IOffsceenRenderBase; + +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_ADDON_INSTANCE_INFO* 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; } + + std::shared_ptr GetOffscreenRenderBase(); + +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::shared_ptr m_offsceenRenderBase; + + std::mutex m_mutex; + + static void kodi_kill_child(void* thisClassHdl, const char* uuid); + + backward::StackTrace m_stackTrace; + backward::SignalHandling m_signalHandling; +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_base.h b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_base.h new file mode 100644 index 0000000000000..443fc4c3bdbf8 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_base.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class IOffsceenRenderBase +{ +public: + IOffsceenRenderBase() = default; + virtual ~IOffsceenRenderBase() = default; + + virtual bool Create() = 0; + virtual void Destroy() = 0; +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_base_linux.cpp b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_base_linux.cpp new file mode 100644 index 0000000000000..14f50195ea54f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_base_linux.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_offscreen_render_base_linux.h" +#include + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +bool COffsceenRenderBaseLinux::Create() +{ + if (m_started) + return true; + + m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); + + // initialize the EGL display connection + EGLint major, minor; + eglInitialize(m_eglDisplay, &major, &minor); + + // Set OpenGL rendering API + eglBindAPI(EGL_OPENGL_API); + + EGLint num_config; + const EGLint attribute_list_config[] = { + EGL_SURFACE_TYPE, + EGL_PBUFFER_BIT, + EGL_RENDERABLE_TYPE, + EGL_OPENGL_BIT, + EGL_RED_SIZE, + 1, + EGL_GREEN_SIZE, + 1, + EGL_BLUE_SIZE, + 1, + EGL_ALPHA_SIZE, + 1, + EGL_NONE, + }; + + eglChooseConfig(m_eglDisplay, attribute_list_config, &m_eglConfig, 1, &num_config); + + // create an EGL rendering context + const EGLint attrib_list[] = {EGL_CONTEXT_MAJOR_VERSION_KHR, + 3, + EGL_CONTEXT_MINOR_VERSION_KHR, + 2, + EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR, + EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR, + EGL_NONE}; + m_eglContext = eglCreateContext(m_eglDisplay, m_eglConfig, EGL_NO_CONTEXT, attrib_list); + + m_started = true; + + return true; +} + +void COffsceenRenderBaseLinux::Destroy() +{ + if (!m_started) + return; + + eglDestroyContext(m_eglDisplay, m_eglContext); + eglTerminate(m_eglDisplay); + + m_eglDisplay = EGL_NO_DISPLAY; + m_eglConfig = EGL_NO_CONFIG_KHR; + m_eglContext = EGL_NO_CONTEXT; + m_started = false; +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_base_linux.h b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_base_linux.h new file mode 100644 index 0000000000000..01ba7fe5b7167 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_base_linux.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_offscreen_render_base.h" + +#define EGL_EGLEXT_PROTOTYPES +#include +#include + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class COffsceenRenderBaseLinux : public IOffsceenRenderBase +{ +public: + COffsceenRenderBaseLinux() = default; + + bool Create() override; + void Destroy() override; + + EGLDisplay GetEGLDisplay() { return m_eglDisplay; } + EGLConfig GetEGLConfig() { return m_eglConfig; } + EGLContext GetEGLContext() { return m_eglContext; } + +private: + bool m_started = false; + + EGLDisplay m_eglDisplay = EGL_NO_DISPLAY; + EGLConfig m_eglConfig = EGL_NO_CONFIG_KHR; + EGLContext m_eglContext = EGL_NO_CONTEXT; +}; + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ + + diff --git a/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control.cpp b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control.cpp new file mode 100644 index 0000000000000..50b2963983e7d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_offscreen_render_control.h" +#include "addon_offscreen_render_control_linux.h" + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +IAddonOffscreenRenderControl* GenerateOffscreenControl(KODI::ADDONS::INTERFACE::PtrKodiOffscreen kodiOffsetHdl, + uint64_t renderId, + int x, + int y, + int width, + int height, + ADDON_HARDWARE_CONTEXT context) +{ + CAddonOffscreenRenderControlLinux* control = new CAddonOffscreenRenderControlLinux(kodiOffsetHdl, renderId, x, y, width, height, context); + return control; +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control.h b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control.h new file mode 100644 index 0000000000000..768d0d31903ed --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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 "../../shared/SharedGroups.h" + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class IAddonOffscreenRenderControl +{ +public: + IAddonOffscreenRenderControl(KODI::ADDONS::INTERFACE::PtrKodiOffscreen kodiOffsetHdl, + uint64_t renderId, + int x, + int y, + int width, + int height, + ADDON_HARDWARE_CONTEXT context) + : m_kodiOffsetHdl(kodiOffsetHdl), + m_renderId(renderId), + m_x(x), + m_y(y), + m_width(width), + m_height(height), + m_context(context) + { + + } + virtual ~IAddonOffscreenRenderControl() = default; + + virtual bool Start() = 0; + virtual void Stop() = 0; + virtual void RenderBegin() = 0; + virtual void RenderEnd() = 0; + + const KODI::ADDONS::INTERFACE::PtrKodiOffscreen m_kodiOffsetHdl; + const uint64_t m_renderId; + const int m_x; + const int m_y; + const int m_width; + const int m_height; + const ADDON_HARDWARE_CONTEXT m_context; +}; + +IAddonOffscreenRenderControl* GenerateOffscreenControl(KODI::ADDONS::INTERFACE::PtrKodiOffscreen kodiOffsetHdl, + uint64_t renderId, + int x, + int y, + int width, + int height, + ADDON_HARDWARE_CONTEXT context); + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control_linux.cpp b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control_linux.cpp new file mode 100644 index 0000000000000..eceb435b89a5d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control_linux.cpp @@ -0,0 +1,211 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_offscreen_render_control_linux.h" + +#include "addon_control.h" +#include "addon_offscreen_render_base_linux.h" +#include "../../../src/shared/OpenGLExtensionCheck.h" +#include "../../../src/shared/socket.h" +#include "../../../include/kodi/tools/StringUtils.h" + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +CAddonOffscreenRenderControlLinux::CAddonOffscreenRenderControlLinux(KODI::ADDONS::INTERFACE::PtrKodiOffscreen kodiOffsetHdl, + uint64_t renderId, + int x, + int y, + int width, + int height, + ADDON_HARDWARE_CONTEXT context) + : IAddonOffscreenRenderControl(kodiOffsetHdl, renderId, x, y, width, height, context), + m_socketServerFile(kodi::tools::StringUtils::Format("/tmp/%s-%04i-renderproc", AddonIfc::g_ifc->identifier.c_str(), renderId)), + m_socketClientFile(kodi::tools::StringUtils::Format("/tmp/%s-%04i-renderview", AddonIfc::g_ifc->identifier.c_str(), renderId)), + m_renderBase(std::dynamic_pointer_cast(AddonIfc::g_ifc->control->GetOffscreenRenderBase())) +{ +} + +bool CAddonOffscreenRenderControlLinux::Start() +{ + using namespace KODI::ADDONS::INTERFACE; + + m_eglDisplay = m_renderBase->GetEGLDisplay(); + m_eglContext = m_renderBase->GetEGLContext(); + + static const EGLint pbufferAttribs[] = { + EGL_WIDTH, 9, + EGL_HEIGHT, 9, + EGL_TEXTURE_TARGET, EGL_TEXTURE_2D, + EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA, + EGL_NONE, + }; + + // create an EGL window surface + m_eglSurface = eglCreatePbufferSurface(m_eglDisplay, m_renderBase->GetEGLConfig(), pbufferAttribs); + + // connect the context to the surface + eglMakeCurrent(m_eglDisplay, m_eglSurface, m_eglSurface, m_eglContext); + + glGenVertexArrays(1, &m_vertexVAO); + glBindVertexArray(m_vertexVAO); + + if (!CheckExtensionSupported("EGL_KHR_image_base")) + { + kodi_log(ADDON_LOG_ERROR, "Needed EGL extension \"EGL_KHR_image_base\" not available"); + return false; + } + + if (!CheckExtensionSupported("EGL_MESA_image_dma_buf_export")) + { + kodi_log(ADDON_LOG_ERROR, + "Needed EGL extension \"EGL_MESA_image_dma_buf_export\" not available"); + return false; + } + + eglCreateImageKHR = (decltype(eglCreateImageKHR))GetEGLFunc("eglCreateImageKHR"); + eglDestroyImageKHR = (decltype(eglDestroyImageKHR))GetEGLFunc("eglDestroyImageKHR"); + eglExportDMABUFImageQueryMESA = (decltype(eglExportDMABUFImageQueryMESA))GetEGLFunc( + "eglExportDMABUFImageQueryMESA"); + eglExportDMABUFImageMESA = + (decltype(eglExportDMABUFImageMESA))GetEGLFunc("eglExportDMABUFImageMESA"); + + // GL: Create and populate the texture + glGenTextures(1, &m_texture); + glBindTexture(GL_TEXTURE_2D, m_texture); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glPixelStorei(GL_UNPACK_ROW_LENGTH, m_width); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + static const EGLint attrib[] = {EGL_IMAGE_PRESERVED_KHR, EGL_FALSE, EGL_GL_TEXTURE_LEVEL_KHR, 0, + EGL_NONE}; + + // EGL: Create EGL image from the GL texture + m_eglImage = eglCreateImageKHR(m_eglDisplay, m_eglContext, EGL_GL_TEXTURE_2D_KHR, + reinterpret_cast(m_texture), attrib); + if (m_eglImage == EGL_NO_IMAGE) + { + kodi_log(ADDON_LOG_ERROR, "Failed to get EGL image (ERROR: %i)", eglGetError()); + return false; + } + + // The next line works around an issue in radeonsi driver (fixed in master at the time of writing). If you are + // not having problems with texture rendering until the first texture update you can omit this line + glFinish(); + + EGLBoolean queried = eglExportDMABUFImageQueryMESA( + m_eglDisplay, m_eglImage, &m_textureStorageMetadata.fourcc, + &m_textureStorageMetadata.num_planes, &m_textureStorageMetadata.modifiers); + if (!queried) + { + kodi_log(ADDON_LOG_ERROR, "Failed to export DMABUF image query"); + return false; + } + + EGLBoolean exported = eglExportDMABUFImageMESA(m_eglDisplay, m_eglImage, &m_textureDmaBufFd, + &m_textureStorageMetadata.stride, &m_textureStorageMetadata.offset); + if (!exported) + { + kodi_log(ADDON_LOG_ERROR, "Failed to export DMABUF image"); + return false; + } + + eglDestroyImageKHR(m_eglDisplay, m_eglImage); + + m_textureStorageMetadata.width = m_width; + m_textureStorageMetadata.height = m_height; + + glGenFramebuffers(1, &m_framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); + //Attach 2D texture to this FBO + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_texture, 0); + + glGenRenderbuffers(1, &m_renderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, m_renderbuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, m_width, m_height); + + //Attach depth buffer to FBO + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_renderbuffer); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindTexture(GL_TEXTURE_2D, 0); + + glScissor(0, 0, m_width, m_height); + glViewport(0, 0, m_width, m_height); + + // Unix Domain Socket: Send file descriptor (texture_dmabuf_fd) and texture storage data (texture_storage_metadata) + m_socket = create_socket(m_socketServerFile.c_str()); + std::thread thread = std::thread([&] { + while (m_socket >= 0 && connect_socket(m_socket, m_socketClientFile.c_str()) != 0) + ; + write_fd(m_socket, m_textureDmaBufFd, &m_textureStorageMetadata, + sizeof(m_textureStorageMetadata)); + close(m_socket); + m_socket = -1; + close(m_textureDmaBufFd); + m_textureDmaBufFd = -1; + }); + + thread.detach(); + + return true; +} + +void CAddonOffscreenRenderControlLinux::Stop() +{ + if (m_socket >= 0) + { + int socket = m_socket; + m_socket = -1; + close(socket); + if (m_textureDmaBufFd >= 0) + { + m_textureDmaBufFd = -1; + close(m_textureDmaBufFd); + } + } + + glBindRenderbuffer(GL_RENDERBUFFER, 0); + glDeleteRenderbuffers(1, &m_renderbuffer); + m_renderbuffer = 0; + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glDeleteFramebuffers(1, &m_framebuffer); + m_framebuffer = 0; + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, 0); + glDeleteTextures(1, &m_texture); + m_texture = 0; + + glDeleteVertexArrays(1, &m_vertexVAO); + m_vertexVAO = 0; +} + +void CAddonOffscreenRenderControlLinux::RenderBegin() +{ + eglMakeCurrent(m_eglDisplay, m_eglSurface, m_eglSurface, m_eglContext); + glBindVertexArray(m_vertexVAO); + glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); +} + +void CAddonOffscreenRenderControlLinux::RenderEnd() +{ + glFlush(); +} + +} /* namespace INTERNAL */ +} /* namespace KODI_ADDON */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control_linux.h b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control_linux.h new file mode 100644 index 0000000000000..7e9b3735ace39 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_offscreen_render_control_linux.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_offscreen_render_control.h" +#include "../../../src/shared/SharedGL.h" + +#include +#include + +namespace KODI_ADDON +{ +namespace INTERNAL +{ + +class COffsceenRenderBaseLinux; + +class CAddonOffscreenRenderControlLinux : public IAddonOffscreenRenderControl +{ +public: + CAddonOffscreenRenderControlLinux(KODI::ADDONS::INTERFACE::PtrKodiOffscreen kodiOffsetHdl, + uint64_t renderId, + int x, + int y, + int width, + int height, + ADDON_HARDWARE_CONTEXT context); + virtual ~CAddonOffscreenRenderControlLinux() = default; + + bool Start() override; + void Stop() override; + void RenderBegin() override; + void RenderEnd() override; + +private: + const std::string m_socketServerFile; + const std::string m_socketClientFile; + + PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR = nullptr; + PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR = nullptr; + PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC eglExportDMABUFImageQueryMESA = nullptr; + PFNEGLEXPORTDMABUFIMAGEMESAPROC eglExportDMABUFImageMESA = nullptr; + + EGLSurface m_eglSurface = EGL_NO_SURFACE; + EGLDisplay m_eglDisplay = EGL_NO_DISPLAY; + EGLContext m_eglContext = EGL_NO_CONTEXT; + EGLImageKHR m_eglImage = EGL_NO_IMAGE_KHR; + EGLConfig m_eglConfig = EGL_NO_CONFIG_KHR; + + // EGL (extension: EGL_MESA_image_dma_buf_export): Get file descriptor (texture_dmabuf_fd) for the EGL image and get its + // storage data (texture_storage_metadata - fourcc, stride, offset) + int m_socket = -1; + int m_textureDmaBufFd = -1; + struct texture_storage_metadata_t m_textureStorageMetadata; + + GLuint m_texture = 0; + GLuint m_framebuffer = 0; + GLuint m_renderbuffer = 0; + + GLuint m_vertexVAO = 0; + + std::shared_ptr m_renderBase; +}; + +} /* 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..6e5859259f4dd --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/core/addon_thread_control.cpp @@ -0,0 +1,119 @@ +/* + * 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 "../../../include/kodi/tools/StringUtils.h" +#include "../../shared/ShareProcessReceiver.h" +#include "../../shared/ShareProcessTransmitter.h" +#include "addon_control.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/third_party/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon/third_party/CMakeLists.txt new file mode 100644 index 0000000000000..9f61e09641281 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/CMakeLists.txt @@ -0,0 +1,12 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES +) + +set(HEADERS +) + +if(SOURCES OR HEADERS) + devkit_add_object(devkit_third_party) +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/BackwardConfig.cmake b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/BackwardConfig.cmake new file mode 100644 index 0000000000000..867dab9c7f80c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/BackwardConfig.cmake @@ -0,0 +1,266 @@ +# +# BackwardMacros.cmake +# Copyright 2013 Google Inc. All Rights Reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +############################################################################### +# OPTIONS +############################################################################### + +set(STACK_WALKING_UNWIND TRUE) +set(STACK_WALKING_UNWIND TRUE CACHE BOOL + "Use compiler's unwind API") +set(STACK_WALKING_BACKTRACE FALSE CACHE BOOL + "Use backtrace from (e)glibc for stack walking") +set(STACK_WALKING_LIBUNWIND FALSE CACHE BOOL + "Use libunwind for stack walking") + +set(STACK_DETAILS_AUTO_DETECT TRUE CACHE BOOL + "Auto detect backward's stack details dependencies") + +set(STACK_DETAILS_BACKTRACE_SYMBOL FALSE CACHE BOOL + "Use backtrace from (e)glibc for symbols resolution") +set(STACK_DETAILS_DW FALSE CACHE BOOL + "Use libdw to read debug info") +set(STACK_DETAILS_BFD FALSE CACHE BOOL + "Use libbfd to read debug info") +set(STACK_DETAILS_DWARF FALSE CACHE BOOL + "Use libdwarf/libelf to read debug info") + +if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND NOT DEFINED BACKWARD_TESTS) + # If this is a top level CMake project, we most lixely want the tests + set(BACKWARD_TESTS ON CACHE BOOL "Enable tests") +else() + set(BACKWARD_TESTS OFF CACHE BOOL "Enable tests") +endif() +############################################################################### +# CONFIGS +############################################################################### +include(FindPackageHandleStandardArgs) + +if (STACK_WALKING_LIBUNWIND) + # libunwind works on the macOS without having to add special include + # paths or libraries + if (NOT APPLE) + find_path(LIBUNWIND_INCLUDE_DIR NAMES "libunwind.h") + find_library(LIBUNWIND_LIBRARY unwind) + + if (LIBUNWIND_LIBRARY) + include(CheckSymbolExists) + check_symbol_exists(UNW_INIT_SIGNAL_FRAME libunwind.h HAVE_UNW_INIT_SIGNAL_FRAME) + if (NOT HAVE_UNW_INIT_SIGNAL_FRAME) + message(STATUS "libunwind does not support unwinding from signal handler frames") + endif() + endif() + + set(LIBUNWIND_INCLUDE_DIRS ${LIBUNWIND_INCLUDE_DIR}) + set(LIBDWARF_LIBRARIES ${LIBUNWIND_LIBRARY}) + find_package_handle_standard_args(libunwind DEFAULT_MSG + LIBUNWIND_LIBRARY LIBUNWIND_INCLUDE_DIR) + mark_as_advanced(LIBUNWIND_INCLUDE_DIR LIBUNWIND_LIBRARY) + list(APPEND _BACKWARD_LIBRARIES ${LIBUNWIND_LIBRARY}) + endif() + + # Disable other unwinders if libunwind is found + set(STACK_WALKING_UNWIND FALSE) + set(STACK_WALKING_BACKTRACE FALSE) +endif() + +if (${STACK_DETAILS_AUTO_DETECT}) + if(NOT CMAKE_VERSION VERSION_LESS 3.17) + set(_name_mismatched_arg NAME_MISMATCHED) + endif() + # find libdw + find_path(LIBDW_INCLUDE_DIR NAMES "elfutils/libdw.h" "elfutils/libdwfl.h") + find_library(LIBDW_LIBRARY dw) + # in case it's statically linked, look for all the possible dependencies + find_library(LIBELF_LIBRARY elf) + find_library(LIBPTHREAD_LIBRARY pthread) + find_library(LIBZ_LIBRARY z) + find_library(LIBBZ2_LIBRARY bz2) + find_library(LIBLZMA_LIBRARY lzma) + find_library(LIBZSTD_LIBRARY zstd) + set(LIBDW_INCLUDE_DIRS ${LIBDW_INCLUDE_DIR} ) + set(LIBDW_LIBRARIES ${LIBDW_LIBRARY} + $<$:${LIBELF_LIBRARY}> + $<$:${LIBPTHREAD_LIBRARY}> + $<$:${LIBZ_LIBRARY}> + $<$:${LIBBZ2_LIBRARY}> + $<$:${LIBLZMA_LIBRARY}> + $<$:${LIBZSTD_LIBRARY}>) + find_package_handle_standard_args(libdw ${_name_mismatched_arg} + REQUIRED_VARS LIBDW_LIBRARY LIBDW_INCLUDE_DIR) + mark_as_advanced(LIBDW_INCLUDE_DIR LIBDW_LIBRARY) + + # find libbfd + find_path(LIBBFD_INCLUDE_DIR NAMES "bfd.h") + find_path(LIBDL_INCLUDE_DIR NAMES "dlfcn.h") + find_library(LIBBFD_LIBRARY bfd) + find_library(LIBDL_LIBRARY dl) + set(LIBBFD_INCLUDE_DIRS ${LIBBFD_INCLUDE_DIR} ${LIBDL_INCLUDE_DIR}) + set(LIBBFD_LIBRARIES ${LIBBFD_LIBRARY} ${LIBDL_LIBRARY}) + find_package_handle_standard_args(libbfd ${_name_mismatched_arg} + REQUIRED_VARS LIBBFD_LIBRARY LIBBFD_INCLUDE_DIR + LIBDL_LIBRARY LIBDL_INCLUDE_DIR) + mark_as_advanced(LIBBFD_INCLUDE_DIR LIBBFD_LIBRARY + LIBDL_INCLUDE_DIR LIBDL_LIBRARY) + + # find libdwarf + find_path(LIBDWARF_INCLUDE_DIR NAMES "libdwarf.h" PATH_SUFFIXES libdwarf) + find_path(LIBELF_INCLUDE_DIR NAMES "libelf.h") + find_path(LIBDL_INCLUDE_DIR NAMES "dlfcn.h") + find_library(LIBDWARF_LIBRARY dwarf) + find_library(LIBELF_LIBRARY elf) + find_library(LIBDL_LIBRARY dl) + set(LIBDWARF_INCLUDE_DIRS ${LIBDWARF_INCLUDE_DIR} ${LIBELF_INCLUDE_DIR} ${LIBDL_INCLUDE_DIR}) + set(LIBDWARF_LIBRARIES ${LIBDWARF_LIBRARY} ${LIBELF_LIBRARY} ${LIBDL_LIBRARY}) + find_package_handle_standard_args(libdwarf ${_name_mismatched_arg} + REQUIRED_VARS LIBDWARF_LIBRARY LIBDWARF_INCLUDE_DIR + LIBELF_LIBRARY LIBELF_INCLUDE_DIR + LIBDL_LIBRARY LIBDL_INCLUDE_DIR) + mark_as_advanced(LIBDWARF_INCLUDE_DIR LIBDWARF_LIBRARY + LIBELF_INCLUDE_DIR LIBELF_LIBRARY + LIBDL_INCLUDE_DIR LIBDL_LIBRARY) + + if (LIBDW_FOUND) + LIST(APPEND _BACKWARD_INCLUDE_DIRS ${LIBDW_INCLUDE_DIRS}) + LIST(APPEND _BACKWARD_LIBRARIES ${LIBDW_LIBRARIES}) + set(STACK_DETAILS_DW TRUE) + set(STACK_DETAILS_BFD FALSE) + set(STACK_DETAILS_DWARF FALSE) + set(STACK_DETAILS_BACKTRACE_SYMBOL FALSE) + elseif(LIBBFD_FOUND) + LIST(APPEND _BACKWARD_INCLUDE_DIRS ${LIBBFD_INCLUDE_DIRS}) + LIST(APPEND _BACKWARD_LIBRARIES ${LIBBFD_LIBRARIES}) + + # If we attempt to link against static bfd, make sure to link its dependencies, too + get_filename_component(bfd_lib_ext "${LIBBFD_LIBRARY}" EXT) + if (bfd_lib_ext STREQUAL "${CMAKE_STATIC_LIBRARY_SUFFIX}") + list(APPEND _BACKWARD_LIBRARIES iberty z) + endif() + + set(STACK_DETAILS_DW FALSE) + set(STACK_DETAILS_BFD TRUE) + set(STACK_DETAILS_DWARF FALSE) + set(STACK_DETAILS_BACKTRACE_SYMBOL FALSE) + elseif(LIBDWARF_FOUND) + LIST(APPEND _BACKWARD_INCLUDE_DIRS ${LIBDWARF_INCLUDE_DIRS}) + LIST(APPEND _BACKWARD_LIBRARIES ${LIBDWARF_LIBRARIES}) + + set(STACK_DETAILS_DW FALSE) + set(STACK_DETAILS_BFD FALSE) + set(STACK_DETAILS_DWARF TRUE) + set(STACK_DETAILS_BACKTRACE_SYMBOL FALSE) + else() + set(STACK_DETAILS_DW FALSE) + set(STACK_DETAILS_BFD FALSE) + set(STACK_DETAILS_DWARF FALSE) + set(STACK_DETAILS_BACKTRACE_SYMBOL TRUE) + endif() +else() + if (STACK_DETAILS_DW) + LIST(APPEND _BACKWARD_LIBRARIES dw) + endif() + + if (STACK_DETAILS_BFD) + LIST(APPEND _BACKWARD_LIBRARIES bfd dl) + endif() + + if (STACK_DETAILS_DWARF) + LIST(APPEND _BACKWARD_LIBRARIES dwarf elf) + endif() +endif() + +macro(map_definitions var_prefix define_prefix) + foreach(def ${ARGN}) + if (${${var_prefix}${def}}) + LIST(APPEND _BACKWARD_DEFINITIONS "${define_prefix}${def}=1") + else() + LIST(APPEND _BACKWARD_DEFINITIONS "${define_prefix}${def}=0") + endif() + endforeach() +endmacro() + +if (NOT _BACKWARD_DEFINITIONS) + map_definitions("STACK_WALKING_" "BACKWARD_HAS_" UNWIND LIBUNWIND BACKTRACE) + map_definitions("STACK_DETAILS_" "BACKWARD_HAS_" BACKTRACE_SYMBOL DW BFD DWARF) +endif() + +if(WIN32) + list(APPEND _BACKWARD_LIBRARIES dbghelp psapi) + if(MINGW) + set(MINGW_MSVCR_LIBRARY "msvcr90$<$:d>" CACHE STRING "Mingw MSVC runtime import library") + list(APPEND _BACKWARD_LIBRARIES ${MINGW_MSVCR_LIBRARY}) + endif() +endif() + +set(BACKWARD_INCLUDE_DIR "${CMAKE_CURRENT_LIST_DIR}") + +set(BACKWARD_HAS_EXTERNAL_LIBRARIES FALSE) +set(FIND_PACKAGE_REQUIRED_VARS BACKWARD_INCLUDE_DIR) +if(DEFINED _BACKWARD_LIBRARIES) + set(BACKWARD_HAS_EXTERNAL_LIBRARIES TRUE) + list(APPEND FIND_PACKAGE_REQUIRED_VARS _BACKWARD_LIBRARIES) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Backward + REQUIRED_VARS ${FIND_PACKAGE_REQUIRED_VARS} +) +list(APPEND _BACKWARD_INCLUDE_DIRS ${BACKWARD_INCLUDE_DIR}) + +# add_backward, optional bool argument; if passed and true, backward will be included as a system header +macro(add_backward target) + if ("${ARGN}") + target_include_directories(${target} SYSTEM PRIVATE ${BACKWARD_INCLUDE_DIRS}) + else() + target_include_directories(${target} PRIVATE ${BACKWARD_INCLUDE_DIRS}) + endif() + set_property(TARGET ${target} APPEND PROPERTY COMPILE_DEFINITIONS ${BACKWARD_DEFINITIONS}) + set_property(TARGET ${target} APPEND PROPERTY LINK_LIBRARIES ${BACKWARD_LIBRARIES}) +endmacro() + +set(BACKWARD_INCLUDE_DIRS ${_BACKWARD_INCLUDE_DIRS} CACHE INTERNAL "_BACKWARD_INCLUDE_DIRS") +set(BACKWARD_DEFINITIONS ${_BACKWARD_DEFINITIONS} CACHE INTERNAL "BACKWARD_DEFINITIONS") +set(BACKWARD_LIBRARIES ${_BACKWARD_LIBRARIES} CACHE INTERNAL "BACKWARD_LIBRARIES") +mark_as_advanced(BACKWARD_INCLUDE_DIRS BACKWARD_DEFINITIONS BACKWARD_LIBRARIES) + +# Expand each definition in BACKWARD_DEFINITIONS to its own cmake var and export +# to outer scope +foreach(var ${BACKWARD_DEFINITIONS}) + string(REPLACE "=" ";" var_as_list ${var}) + list(GET var_as_list 0 var_name) + list(GET var_as_list 1 var_value) + set(${var_name} ${var_value}) + mark_as_advanced(${var_name}) +endforeach() + +if (NOT TARGET Backward::Backward) + add_library(Backward::Backward INTERFACE IMPORTED) + set_target_properties(Backward::Backward PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${BACKWARD_INCLUDE_DIRS}" + INTERFACE_COMPILE_DEFINITIONS "${BACKWARD_DEFINITIONS}" + ) + if(BACKWARD_HAS_EXTERNAL_LIBRARIES) + set_target_properties(Backward::Backward PROPERTIES + INTERFACE_LINK_LIBRARIES "${BACKWARD_LIBRARIES}" + ) + endif() +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/CMakeLists.txt new file mode 100644 index 0000000000000..84dd2af077016 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/CMakeLists.txt @@ -0,0 +1,140 @@ +# +# CMakeLists.txt +# Copyright 2013 Google Inc. All Rights Reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +cmake_minimum_required(VERSION 3.0) +project(backward CXX) + +# Introduce variables: +# * CMAKE_INSTALL_LIBDIR +# * CMAKE_INSTALL_BINDIR +# * CMAKE_INSTALL_INCLUDEDIR +include(GNUInstallDirs) + +include(BackwardConfig.cmake) + +# check if compiler is nvcc or nvcc_wrapper +set(COMPILER_IS_NVCC false) +get_filename_component(COMPILER_NAME ${CMAKE_CXX_COMPILER} NAME) +if (COMPILER_NAME MATCHES "^nvcc") + set(COMPILER_IS_NVCC true) +endif() + +if (DEFINED ENV{OMPI_CXX} OR DEFINED ENV{MPICH_CXX}) + if ( ($ENV{OMPI_CXX} MATCHES "nvcc") OR ($ENV{MPICH_CXX} MATCHES "nvcc") ) + set(COMPILER_IS_NVCC true) + endif() +endif() + +# set CXX standard +set(CMAKE_CXX_STANDARD_REQUIRED True) +set(CMAKE_CXX_STANDARD 17) # Kodi Note: Changed from 11 to 17 +if (${COMPILER_IS_NVCC}) + # GNU CXX extensions are not supported by nvcc + set(CMAKE_CXX_EXTENSIONS OFF) +endif() + +############################################################################### +# COMPILER FLAGS +############################################################################### + +if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCXX) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") + if (NOT ${COMPILER_IS_NVCC}) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic-errors") + endif() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") +endif() + +############################################################################### +# BACKWARD OBJECT +############################################################################### + +add_library(backward_object OBJECT backward.cpp) +target_compile_definitions(backward_object PRIVATE ${BACKWARD_DEFINITIONS}) +target_include_directories(backward_object PRIVATE ${BACKWARD_INCLUDE_DIRS}) +set_target_properties(backward_object PROPERTIES POSITION_INDEPENDENT_CODE ON) +set(BACKWARD_ENABLE $ CACHE STRING + "Link with this object to setup backward automatically") + + +############################################################################### +# BACKWARD LIBRARY (Includes backward.cpp) +############################################################################### +option(BACKWARD_SHARED "Build dynamic backward-cpp shared lib" OFF) + +if(BACKWARD_SHARED) + set(libtype SHARED) +endif() +add_library(backward ${libtype} backward.cpp) +target_compile_definitions(backward PUBLIC ${BACKWARD_DEFINITIONS}) +target_include_directories(backward PUBLIC ${BACKWARD_INCLUDE_DIRS}) + +############################################################################### +# TESTS +############################################################################### + +if(BACKWARD_TESTS) + enable_testing() + + add_library(test_main OBJECT test/_test_main.cpp) + + macro(backward_add_test src) + get_filename_component(name ${src} NAME_WE) + set(test_name "test_${name}") + + add_executable(${test_name} ${src} ${ARGN} $) + + target_link_libraries(${test_name} PRIVATE Backward::Backward) + + add_test(NAME ${name} COMMAND ${test_name}) + endmacro() + + # Tests without backward.cpp + set(TESTS + test + stacktrace + rectrace + select_signals + ) + + foreach(test ${TESTS}) + backward_add_test(test/${test}.cpp) + endforeach() + + # Tests with backward.cpp + set(TESTS + suicide + ) + + foreach(test ${TESTS}) + backward_add_test(test/${test}.cpp ${BACKWARD_ENABLE}) + endforeach() +endif() + +install( + FILES "backward.hpp" + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +) +install( + FILES "BackwardConfig.cmake" + DESTINATION ${CMAKE_INSTALL_LIBDIR}/backward +) diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/LICENSE.txt b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/LICENSE.txt new file mode 100644 index 0000000000000..269e8abbc0ffc --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/LICENSE.txt @@ -0,0 +1,21 @@ +Copyright 2013 Google Inc. All Rights Reserved. + +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/README.md b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/README.md new file mode 100644 index 0000000000000..031716f3da9fe --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/README.md @@ -0,0 +1,442 @@ +Backward-cpp [![badge](https://img.shields.io/badge/conan.io-backward%2F1.3.0-green.svg?logo=data:image/png;base64%2CiVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAAA1VBMVEUAAABhlctjlstkl8tlmMtlmMxlmcxmmcxnmsxpnMxpnM1qnc1sn85voM91oM11oc1xotB2oc56pNF6pNJ2ptJ8ptJ8ptN9ptN8p9N5qNJ9p9N9p9R8qtOBqdSAqtOAqtR%2BrNSCrNJ/rdWDrNWCsNWCsNaJs9eLs9iRvNuVvdyVv9yXwd2Zwt6axN6dxt%2Bfx%2BChyeGiyuGjyuCjyuGly%2BGlzOKmzOGozuKoz%2BKqz%2BOq0OOv1OWw1OWw1eWx1eWy1uay1%2Baz1%2Baz1%2Bez2Oe02Oe12ee22ujUGwH3AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfgBQkREyOxFIh/AAAAiklEQVQI12NgAAMbOwY4sLZ2NtQ1coVKWNvoc/Eq8XDr2wB5Ig62ekza9vaOqpK2TpoMzOxaFtwqZua2Bm4makIM7OzMAjoaCqYuxooSUqJALjs7o4yVpbowvzSUy87KqSwmxQfnsrPISyFzWeWAXCkpMaBVIC4bmCsOdgiUKwh3JojLgAQ4ZCE0AMm2D29tZwe6AAAAAElFTkSuQmCC)](http://www.conan.io/source/backward/1.3.0/Manu343726/testing) +============ + +Backward is a beautiful stack trace pretty printer for C++. + +If you are bored to see this: + +![default trace](doc/rude.png) + +Backward will spice it up for you: + +![pretty stackstrace](doc/pretty.png) + +There is not much to say. Of course it will be able to display the code +snippets only if the source files are accessible (else see trace #4 in the +example). + +All "Source" lines and code snippet prefixed by a pipe "|" are frames inline +the next frame. +You can see that for the trace #1 in the example, the function +`you_shall_not_pass()` was inlined in the function `...read2::do_test()` by the +compiler. + +## Installation + +#### Install backward.hpp + +Backward is a header only library. So installing Backward is easy, simply drop +a copy of `backward.hpp` along with your other source files in your C++ project. +You can also use a git submodule or really any other way that best fits your +environment, as long as you can include `backward.hpp`. + +#### Install backward.cpp + +If you want Backward to automatically print a stack trace on most common fatal +errors (segfault, abort, un-handled exception...), simply add a copy of +`backward.cpp` to your project, and don't forget to tell your build system. + +The code in `backward.cpp` is trivial anyway, you can simply copy what it's +doing at your convenience. + +Note for [folly](https://github.com/facebook/folly) library users: must define `backward::SignalHandling sh;` after `folly::init(&argc, &argv);`. + +## Configuration & Dependencies + +### Integration with CMake + +If you are using CMake and want to use its configuration abilities to save +you the trouble, you can easily integrate Backward, depending on how you obtained +the library. + +#### As a subdirectory: + +In this case you have a subdirectory containing the whole repository of Backward +(eg.: using git-submodules), in this case you can do: + +``` +add_subdirectory(/path/to/backward-cpp) + +# This will add backward.cpp to your target +add_executable(mytarget mysource.cpp ${BACKWARD_ENABLE}) + +# This will add libraries, definitions and include directories needed by backward +# by setting each property on the target. +add_backward(mytarget) +``` + +#### Modifying CMAKE_MODULE_PATH + +In this case you can have Backward installed as a subdirectory: + +``` +list(APPEND CMAKE_MODULE_PATH /path/to/backward-cpp) +find_package(Backward) + +# This will add libraries, definitions and include directories needed by backward +# through an IMPORTED target. +target_link_libraries(mytarget PUBLIC Backward::Backward) +``` + +Notice that this is equivalent to using the the approach that uses `add_subdirectory()`, +however it uses cmake's [imported target](https://cmake.org/Wiki/CMake/Tutorials/Exporting_and_Importing_Targets) mechanism. + +#### Installation through a regular package manager + +In this case you have obtained Backward through a package manager. + +Packages currently available: +- [conda-forge](https://anaconda.org/conda-forge/backward-cpp) + +``` +find_package(Backward) + +# This will add libraries, definitions and include directories needed by backward +# through an IMPORTED target. +target_link_libraries(mytarget PUBLIC Backward::Backward) +``` +### Libraries to unwind the stack + +On Linux and macOS, backtrace can back-trace or "walk" the stack using the +following libraries: + +#### unwind + +Unwind comes from libgcc, but there is an equivalent inside clang itself. With +unwind, the stacktrace is as accurate as it can possibly be, since this is +used by the C++ runtine in gcc/clang for stack unwinding on exception. + +Normally libgcc is already linked to your program by default. + +#### libunwind from the [libunwind project](https://github.com/libunwind/libunwind) + + apt-get install binutils-dev (or equivalent) + +Libunwind provides, in some cases, a more accurate stacktrace as it knows +to decode signal handler frames and lets us edit the context registers when +unwinding, allowing stack traces over bad function references. + +For best results make sure you are using libunwind 1.3 or later, which added +`unw_init_local2` and support for handling signal frames. + +CMake will warn you when configuring if your libunwind version doesn't support +signal frames. + +On macOS clang provides a libunwind API compatible library as part of its +environment, so no third party libraries are necessary. + +### Compile with debug info + +You need to compile your project with generation of debug symbols enabled, +usually `-g` with clang++ and g++. + +Note that you can use `-g` with any level of optimization, with modern debug +information encoding like DWARF, it only takes space in the binary (it's not +loaded in memory until your debugger or Backward makes use of it, don't worry), +and it doesn't impact the code generation (at least on GNU/Linux x86\_64 for +what I know). + +If you are missing debug information, the stack trace will lack details about +your sources. + +### Libraries to read the debug info + +Backward supports pretty printed stack traces on GNU/Linux, macOS and Windows, +it will compile fine under other platforms but will not do anything. **Pull +requests are welcome :)** + +Also, by default you will get a really basic stack trace, based on the +`backtrace_symbols` API: + +![default trace](doc/nice.png) + +You will need to install some dependencies to get the ultimate stack trace. +Three libraries are currently supported, the only difference is which one is the +easiest for you to install, so pick your poison: + +#### libbfd from the [GNU/binutils](http://www.gnu.org/software/binutils/) + + apt-get install binutils-dev (or equivalent) + +And do not forget to link with the lib: `g++/clang++ -lbfd -ldl ...` + +This library requires dynamic loading. Which is provided by the library `dl`. +Hence why we also link with `-ldl`. + +Then define the following before every inclusion of `backward.hpp` (don't +forget to update `backward.cpp` as well): + + #define BACKWARD_HAS_BFD 1 + +#### libdw from the [elfutils](https://fedorahosted.org/elfutils/) + + apt-get install libdw-dev (or equivalent) + +And do not forget to link with the lib and inform Backward to use it: + + #define BACKWARD_HAS_DW 1 + +Of course you can simply add the define (`-DBACKWARD_HAS_...=1`) and the +linkage details in your build system and even auto-detect which library is +installed, it's up to you. + +#### [libdwarf](https://sourceforge.net/projects/libdwarf/) and [libelf](http://www.mr511.de/software/english.html) + + apt-get install libdwarf-dev (or equivalent) + +And do not forget to link with the lib and inform Backward to use it: + + #define BACKWARD_HAS_DWARF 1 + +There are several alternative implementations of libdwarf and libelf that +are API compatible so it's possible, although it hasn't been tested, to +replace the ones used when developing backward (in bold, below): + +* **_libelf_** by [Michael "Tired" Riepe](http://www.mr511.de/software/english.html) +* **_libdwarf_** by [David Anderson](https://www.prevanders.net/dwarf.html) +* libelf from [elfutils](https://fedorahosted.org/elfutils/) +* libelf and libdwarf from FreeBSD's [ELF Tool Chain](https://sourceforge.net/p/elftoolchain/wiki/Home/) project + + +Of course you can simply add the define (`-DBACKWARD_HAS_...=1`) and the +linkage details in your build system and even auto-detect which library is +installed, it's up to you. + +That's it, you are all set, you should be getting nice stack traces like the +one at the beginning of this document. + +## API + +If you don't want to limit yourself to the defaults offered by `backward.cpp`, +and you want to take some random stack traces for whatever reason and pretty +print them the way you love or you decide to send them all to your buddies over +the Internet, you will appreciate the simplicity of Backward's API. + +### Stacktrace + +The StackTrace class lets you take a "snapshot" of the current stack. +You can use it like this: + +```c++ +using namespace backward; +StackTrace st; st.load_here(32); +Printer p; p.print(st); +``` + +The public methods are: + +```c++ +class StackTrace { public: + // Take a snapshot of the current stack, with at most "trace_cnt_max" + // traces in it. The first trace is the most recent (ie the current + // frame). You can also provide a trace address to load_from() assuming + // the address is a valid stack frame (useful for signal handling traces). + // Both function return size(). + size_t load_here(size_t trace_cnt_max) + size_t load_from(void* address, size_t trace_cnt_max) + + // The number of traces loaded. This can be less than "trace_cnt_max". + size_t size() const + + // A unique id for the thread in which the trace was taken. The value + // 0 means the stack trace comes from the main thread. + size_t thread_id() const + + // Retrieve a trace by index. 0 is the most recent trace, size()-1 is + // the oldest one. + Trace operator[](size_t trace_idx) +}; +``` + +### TraceResolver + +The `TraceResolver` does the heavy lifting, and intends to transform a simple +`Trace` from its address into a fully detailed `ResolvedTrace` with the +filename of the source, line numbers, inlined functions and so on. + +You can use it like this: + +```c++ +using namespace backward; +StackTrace st; st.load_here(32); + +TraceResolver tr; tr.load_stacktrace(st); +for (size_t i = 0; i < st.size(); ++i) { + ResolvedTrace trace = tr.resolve(st[i]); + std::cout << "#" << i + << " " << trace.object_filename + << " " << trace.object_function + << " [" << trace.addr << "]" + << std::endl; +} +``` + +The public methods are: + +```c++ +class TraceResolver { public: + // Pre-load whatever is necessary from the stack trace. + template + void load_stacktrace(ST&) + + // Resolve a trace. It takes a ResolvedTrace, because a `Trace` is + // implicitly convertible to it. + ResolvedTrace resolve(ResolvedTrace t) +}; +``` + +### SnippetFactory + +The SnippetFactory is a simple helper class to automatically load and cache +source files in order to extract code snippets. + +```c++ +class SnippetFactory { public: + // A snippet is a list of line numbers and line contents. + typedef std::vector > lines_t; + + // Return a snippet starting at line_start with up to context_size lines. + lines_t get_snippet(const std::string& filename, + size_t line_start, size_t context_size) + + // Return a combined snippet from two different locations and combine them. + // context_size / 2 lines will be extracted from each location. + lines_t get_combined_snippet( + const std::string& filename_a, size_t line_a, + const std::string& filename_b, size_t line_b, + size_t context_size) + + // Tries to return a unified snippet if the two locations from the same + // file are close enough to fit inside one context_size, else returns + // the equivalent of get_combined_snippet(). + lines_t get_coalesced_snippet(const std::string& filename, + size_t line_a, size_t line_b, size_t context_size) +``` + +### Printer + +A simpler way to pretty print a stack trace to the terminal. It will +automatically resolve the traces for you: + +```c++ +using namespace backward; +StackTrace st; st.load_here(32); +Printer p; +p.object = true; +p.color_mode = ColorMode::always; +p.address = true; +p.print(st, stderr); +``` + +You can set a few options: + +```c++ +class Printer { public: + // Print a little snippet of code if possible. + bool snippet = true; + + // Colorize the trace + // - ColorMode::automatic: Activate colors if possible. For example, when using a TTY on linux. + // - ColorMode::always: Always use colors. + // - ColorMode::never: Never use colors. + bool color_mode = ColorMode::automatic; + + // Add the addresses of every source location to the trace. + bool address = false; + + // Even if there is a source location, also prints the object + // from where the trace came from. + bool object = false; + + // Resolve and print a stack trace to the given C FILE* object. + // On linux, if the FILE* object is attached to a TTY, + // color will be used if color_mode is set to automatic. + template + FILE* print(StackTrace& st, FILE* fp = stderr); + + // Resolve and print a stack trace to the given std::ostream object. + // Color will only be used if color_mode is set to always. + template + std::ostream& print(ST& st, std::ostream& os); +``` + + +### SignalHandling + +A simple helper class that registers for you the most common signals and other +callbacks to segfault, hardware exception, un-handled exception etc. + +`backward.cpp` simply uses it like that: + +```c++ +backward::SignalHandling sh; +``` + +Creating the object registers all the different signals and hooks. Destroying +this object doesn't do anything. It exposes only one method: + +```c++ +bool loaded() const // true if loaded with success +``` + +### Trace object + +To keep the memory footprint of a loaded `StackTrace` on the low-side, there a +hierarchy of trace object, from a minimal `Trace `to a `ResolvedTrace`. + +#### Simple trace + +```c++ +struct Trace { + void* addr; // address of the trace + size_t idx; // its index (0 == most recent) +}; +``` + +#### Resolved trace + +A `ResolvedTrace` should contains a maximum of details about the location of +the trace in the source code. Note that not all fields might be set. + +```c++ +struct ResolvedTrace: public Trace { + + struct SourceLoc { + std::string function; + std::string filename; + size_t line; + size_t col; + }; + + // In which binary object this trace is located. + std::string object_filename; + + // The function in the object that contains the trace. This is not the same + // as source.function which can be an function inlined in object_function. + std::string object_function; + + // The source location of this trace. It is possible for filename to be + // empty and for line/col to be invalid (value 0) if this information + // couldn't be deduced, for example if there is no debug information in the + // binary object. + SourceLoc source; + + // An optional list of "inliners". All of these sources locations where + // inlined in the source location of the trace (the attribute right above). + // This is especially useful when you compile with optimizations turned on. + typedef std::vector source_locs_t; + source_locs_t inliners; +}; +``` + +## Contact and copyright + +François-Xavier Bourlet + +Copyright 2013-2017 Google Inc. All Rights Reserved. +MIT License. + +### Disclaimer + +Although this project is owned by Google Inc. this is not a Google supported or +affiliated project. diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/backward.cpp b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/backward.cpp new file mode 100644 index 0000000000000..110441cba92c2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/backward.cpp @@ -0,0 +1,42 @@ +// Pick your poison. +// +// On GNU/Linux, you have few choices to get the most out of your stack trace. +// +// By default you get: +// - object filename +// - function name +// +// In order to add: +// - source filename +// - line and column numbers +// - source code snippet (assuming the file is accessible) + +// Install one of the following libraries then uncomment one of the macro (or +// better, add the detection of the lib and the macro definition in your build +// system) + +// - apt-get install libdw-dev ... +// - g++/clang++ -ldw ... +// #define BACKWARD_HAS_DW 1 + +// - apt-get install binutils-dev ... +// - g++/clang++ -lbfd ... +// #define BACKWARD_HAS_BFD 1 + +// - apt-get install libdwarf-dev ... +// - g++/clang++ -ldwarf ... +// #define BACKWARD_HAS_DWARF 1 + +// Regardless of the library you choose to read the debug information, +// for potentially more detailed stack traces you can use libunwind +// - apt-get install libunwind-dev +// - g++/clang++ -lunwind +// #define BACKWARD_HAS_LIBUNWIND 1 + +#include "backward.hpp" + +namespace backward { + +backward::SignalHandling sh; + +} // namespace backward diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/backward.hpp b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/backward.hpp new file mode 100644 index 0000000000000..19d5ba31c4b36 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/backward.hpp @@ -0,0 +1,4471 @@ +/* + * backward.hpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef H_6B9572DA_A64B_49E6_B234_051480991C89 +#define H_6B9572DA_A64B_49E6_B234_051480991C89 + +#ifndef __cplusplus +#error "It's not going to compile without a C++ compiler..." +#endif + +#if defined(BACKWARD_CXX11) +#elif defined(BACKWARD_CXX98) +#else +#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800) +#define BACKWARD_CXX11 +#define BACKWARD_ATLEAST_CXX11 +#define BACKWARD_ATLEAST_CXX98 +#if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) +#define BACKWARD_ATLEAST_CXX17 +#endif +#else +#define BACKWARD_CXX98 +#define BACKWARD_ATLEAST_CXX98 +#endif +#endif + +// You can define one of the following (or leave it to the auto-detection): +// +// #define BACKWARD_SYSTEM_LINUX +// - specialization for linux +// +// #define BACKWARD_SYSTEM_DARWIN +// - specialization for Mac OS X 10.5 and later. +// +// #define BACKWARD_SYSTEM_WINDOWS +// - specialization for Windows (Clang 9 and MSVC2017) +// +// #define BACKWARD_SYSTEM_UNKNOWN +// - placebo implementation, does nothing. +// +#if defined(BACKWARD_SYSTEM_LINUX) +#elif defined(BACKWARD_SYSTEM_DARWIN) +#elif defined(BACKWARD_SYSTEM_UNKNOWN) +#elif defined(BACKWARD_SYSTEM_WINDOWS) +#else +#if defined(__linux) || defined(__linux__) +#define BACKWARD_SYSTEM_LINUX +#elif defined(__APPLE__) +#define BACKWARD_SYSTEM_DARWIN +#elif defined(_WIN32) +#define BACKWARD_SYSTEM_WINDOWS +#else +#define BACKWARD_SYSTEM_UNKNOWN +#endif +#endif + +#define NOINLINE __attribute__((noinline)) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(BACKWARD_SYSTEM_LINUX) + +// On linux, backtrace can back-trace or "walk" the stack using the following +// libraries: +// +// #define BACKWARD_HAS_UNWIND 1 +// - unwind comes from libgcc, but I saw an equivalent inside clang itself. +// - with unwind, the stacktrace is as accurate as it can possibly be, since +// this is used by the C++ runtine in gcc/clang for stack unwinding on +// exception. +// - normally libgcc is already linked to your program by default. +// +// #define BACKWARD_HAS_LIBUNWIND 1 +// - libunwind provides, in some cases, a more accurate stacktrace as it knows +// to decode signal handler frames and lets us edit the context registers when +// unwinding, allowing stack traces over bad function references. +// +// #define BACKWARD_HAS_BACKTRACE == 1 +// - backtrace seems to be a little bit more portable than libunwind, but on +// linux, it uses unwind anyway, but abstract away a tiny information that is +// sadly really important in order to get perfectly accurate stack traces. +// - backtrace is part of the (e)glib library. +// +// The default is: +// #define BACKWARD_HAS_UNWIND == 1 +// +// Note that only one of the define should be set to 1 at a time. +// +#if BACKWARD_HAS_UNWIND == 1 +#elif BACKWARD_HAS_LIBUNWIND == 1 +#elif BACKWARD_HAS_BACKTRACE == 1 +#else +#undef BACKWARD_HAS_UNWIND +#define BACKWARD_HAS_UNWIND 1 +#undef BACKWARD_HAS_LIBUNWIND +#define BACKWARD_HAS_LIBUNWIND 0 +#undef BACKWARD_HAS_BACKTRACE +#define BACKWARD_HAS_BACKTRACE 0 +#endif + +// On linux, backward can extract detailed information about a stack trace +// using one of the following libraries: +// +// #define BACKWARD_HAS_DW 1 +// - libdw gives you the most juicy details out of your stack traces: +// - object filename +// - function name +// - source filename +// - line and column numbers +// - source code snippet (assuming the file is accessible) +// - variable names (if not optimized out) +// - variable values (not supported by backward-cpp) +// - You need to link with the lib "dw": +// - apt-get install libdw-dev +// - g++/clang++ -ldw ... +// +// #define BACKWARD_HAS_BFD 1 +// - With libbfd, you get a fair amount of details: +// - object filename +// - function name +// - source filename +// - line numbers +// - source code snippet (assuming the file is accessible) +// - You need to link with the lib "bfd": +// - apt-get install binutils-dev +// - g++/clang++ -lbfd ... +// +// #define BACKWARD_HAS_DWARF 1 +// - libdwarf gives you the most juicy details out of your stack traces: +// - object filename +// - function name +// - source filename +// - line and column numbers +// - source code snippet (assuming the file is accessible) +// - variable names (if not optimized out) +// - variable values (not supported by backward-cpp) +// - You need to link with the lib "dwarf": +// - apt-get install libdwarf-dev +// - g++/clang++ -ldwarf ... +// +// #define BACKWARD_HAS_BACKTRACE_SYMBOL 1 +// - backtrace provides minimal details for a stack trace: +// - object filename +// - function name +// - backtrace is part of the (e)glib library. +// +// The default is: +// #define BACKWARD_HAS_BACKTRACE_SYMBOL == 1 +// +// Note that only one of the define should be set to 1 at a time. +// +#if BACKWARD_HAS_DW == 1 +#elif BACKWARD_HAS_BFD == 1 +#elif BACKWARD_HAS_DWARF == 1 +#elif BACKWARD_HAS_BACKTRACE_SYMBOL == 1 +#else +#undef BACKWARD_HAS_DW +#define BACKWARD_HAS_DW 0 +#undef BACKWARD_HAS_BFD +#define BACKWARD_HAS_BFD 0 +#undef BACKWARD_HAS_DWARF +#define BACKWARD_HAS_DWARF 0 +#undef BACKWARD_HAS_BACKTRACE_SYMBOL +#define BACKWARD_HAS_BACKTRACE_SYMBOL 1 +#endif + +#include +#include +#ifdef __ANDROID__ +// Old Android API levels define _Unwind_Ptr in both link.h and +// unwind.h Rename the one in link.h as we are not going to be using +// it +#define _Unwind_Ptr _Unwind_Ptr_Custom +#include +#undef _Unwind_Ptr +#else +#include +#endif +#if defined(__ppc__) || defined(__powerpc) || defined(__powerpc__) || \ + defined(__POWERPC__) +// Linux kernel header required for the struct pt_regs definition +// to access the NIP (Next Instruction Pointer) register value +#include +#endif +#include +#include +#include +#include + +#if BACKWARD_HAS_BFD == 1 +// NOTE: defining PACKAGE{,_VERSION} is required before including +// bfd.h on some platforms, see also: +// https://sourceware.org/bugzilla/show_bug.cgi?id=14243 +#ifndef PACKAGE +#define PACKAGE +#endif +#ifndef PACKAGE_VERSION +#define PACKAGE_VERSION +#endif +#include +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#include +#undef _GNU_SOURCE +#else +#include +#endif +#endif + +#if BACKWARD_HAS_DW == 1 +#include +#include +#include +#endif + +#if BACKWARD_HAS_DWARF == 1 +#include +#include +#include +#include +#include +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#include +#undef _GNU_SOURCE +#else +#include +#endif +#endif + +#if (BACKWARD_HAS_BACKTRACE == 1) || (BACKWARD_HAS_BACKTRACE_SYMBOL == 1) +// then we shall rely on backtrace +#include +#endif + +#endif // defined(BACKWARD_SYSTEM_LINUX) + +#if defined(BACKWARD_SYSTEM_DARWIN) +// On Darwin, backtrace can back-trace or "walk" the stack using the following +// libraries: +// +// #define BACKWARD_HAS_UNWIND 1 +// - unwind comes from libgcc, but I saw an equivalent inside clang itself. +// - with unwind, the stacktrace is as accurate as it can possibly be, since +// this is used by the C++ runtine in gcc/clang for stack unwinding on +// exception. +// - normally libgcc is already linked to your program by default. +// +// #define BACKWARD_HAS_LIBUNWIND 1 +// - libunwind comes from clang, which implements an API compatible version. +// - libunwind provides, in some cases, a more accurate stacktrace as it knows +// to decode signal handler frames and lets us edit the context registers when +// unwinding, allowing stack traces over bad function references. +// +// #define BACKWARD_HAS_BACKTRACE == 1 +// - backtrace is available by default, though it does not produce as much +// information as another library might. +// +// The default is: +// #define BACKWARD_HAS_UNWIND == 1 +// +// Note that only one of the define should be set to 1 at a time. +// +#if BACKWARD_HAS_UNWIND == 1 +#elif BACKWARD_HAS_BACKTRACE == 1 +#elif BACKWARD_HAS_LIBUNWIND == 1 +#else +#undef BACKWARD_HAS_UNWIND +#define BACKWARD_HAS_UNWIND 1 +#undef BACKWARD_HAS_BACKTRACE +#define BACKWARD_HAS_BACKTRACE 0 +#undef BACKWARD_HAS_LIBUNWIND +#define BACKWARD_HAS_LIBUNWIND 0 +#endif + +// On Darwin, backward can extract detailed information about a stack trace +// using one of the following libraries: +// +// #define BACKWARD_HAS_BACKTRACE_SYMBOL 1 +// - backtrace provides minimal details for a stack trace: +// - object filename +// - function name +// +// The default is: +// #define BACKWARD_HAS_BACKTRACE_SYMBOL == 1 +// +#if BACKWARD_HAS_BACKTRACE_SYMBOL == 1 +#else +#undef BACKWARD_HAS_BACKTRACE_SYMBOL +#define BACKWARD_HAS_BACKTRACE_SYMBOL 1 +#endif + +#include +#include +#include +#include +#include +#include + +#if (BACKWARD_HAS_BACKTRACE == 1) || (BACKWARD_HAS_BACKTRACE_SYMBOL == 1) +#include +#endif +#endif // defined(BACKWARD_SYSTEM_DARWIN) + +#if defined(BACKWARD_SYSTEM_WINDOWS) + +#include +#include +#include + +#include +typedef SSIZE_T ssize_t; + +#ifndef NOMINMAX +#define NOMINMAX +#endif +#include +#include + +#include +#include + +#ifndef __clang__ +#undef NOINLINE +#define NOINLINE __declspec(noinline) +#endif + +#ifdef _MSC_VER +#pragma comment(lib, "psapi.lib") +#pragma comment(lib, "dbghelp.lib") +#endif + +// Comment / packing is from stackoverflow: +// https://stackoverflow.com/questions/6205981/windows-c-stack-trace-from-a-running-app/28276227#28276227 +// Some versions of imagehlp.dll lack the proper packing directives themselves +// so we need to do it. +#pragma pack(push, before_imagehlp, 8) +#include +#pragma pack(pop, before_imagehlp) + +// TODO maybe these should be undefined somewhere else? +#undef BACKWARD_HAS_UNWIND +#undef BACKWARD_HAS_BACKTRACE +#if BACKWARD_HAS_PDB_SYMBOL == 1 +#else +#undef BACKWARD_HAS_PDB_SYMBOL +#define BACKWARD_HAS_PDB_SYMBOL 1 +#endif + +#endif + +#if BACKWARD_HAS_UNWIND == 1 + +#include +// while gcc's unwind.h defines something like that: +// extern _Unwind_Ptr _Unwind_GetIP (struct _Unwind_Context *); +// extern _Unwind_Ptr _Unwind_GetIPInfo (struct _Unwind_Context *, int *); +// +// clang's unwind.h defines something like this: +// uintptr_t _Unwind_GetIP(struct _Unwind_Context* __context); +// +// Even if the _Unwind_GetIPInfo can be linked to, it is not declared, worse we +// cannot just redeclare it because clang's unwind.h doesn't define _Unwind_Ptr +// anyway. +// +// Luckily we can play on the fact that the guard macros have a different name: +#ifdef __CLANG_UNWIND_H +// In fact, this function still comes from libgcc (on my different linux boxes, +// clang links against libgcc). +#include +extern "C" uintptr_t _Unwind_GetIPInfo(_Unwind_Context *, int *); +#endif + +#endif // BACKWARD_HAS_UNWIND == 1 + +#if BACKWARD_HAS_LIBUNWIND == 1 +#define UNW_LOCAL_ONLY +#include +#endif // BACKWARD_HAS_LIBUNWIND == 1 + +#ifdef BACKWARD_ATLEAST_CXX11 +#include +#include // for std::swap +namespace backward { +namespace details { +template struct hashtable { + typedef std::unordered_map type; +}; +using std::move; +} // namespace details +} // namespace backward +#else // NOT BACKWARD_ATLEAST_CXX11 +#define nullptr NULL +#define override +#include +namespace backward { +namespace details { +template struct hashtable { + typedef std::map type; +}; +template const T &move(const T &v) { return v; } +template T &move(T &v) { return v; } +} // namespace details +} // namespace backward +#endif // BACKWARD_ATLEAST_CXX11 + +namespace backward { +namespace details { +#if defined(BACKWARD_SYSTEM_WINDOWS) +const char kBackwardPathDelimiter[] = ";"; +#else +const char kBackwardPathDelimiter[] = ":"; +#endif +} // namespace details +} // namespace backward + +namespace backward { + +namespace system_tag { +struct linux_tag; // seems that I cannot call that "linux" because the name +// is already defined... so I am adding _tag everywhere. +struct darwin_tag; +struct windows_tag; +struct unknown_tag; + +#if defined(BACKWARD_SYSTEM_LINUX) +typedef linux_tag current_tag; +#elif defined(BACKWARD_SYSTEM_DARWIN) +typedef darwin_tag current_tag; +#elif defined(BACKWARD_SYSTEM_WINDOWS) +typedef windows_tag current_tag; +#elif defined(BACKWARD_SYSTEM_UNKNOWN) +typedef unknown_tag current_tag; +#else +#error "May I please get my system defines?" +#endif +} // namespace system_tag + +namespace trace_resolver_tag { +#if defined(BACKWARD_SYSTEM_LINUX) +struct libdw; +struct libbfd; +struct libdwarf; +struct backtrace_symbol; + +#if BACKWARD_HAS_DW == 1 +typedef libdw current; +#elif BACKWARD_HAS_BFD == 1 +typedef libbfd current; +#elif BACKWARD_HAS_DWARF == 1 +typedef libdwarf current; +#elif BACKWARD_HAS_BACKTRACE_SYMBOL == 1 +typedef backtrace_symbol current; +#else +#error "You shall not pass, until you know what you want." +#endif +#elif defined(BACKWARD_SYSTEM_DARWIN) +struct backtrace_symbol; + +#if BACKWARD_HAS_BACKTRACE_SYMBOL == 1 +typedef backtrace_symbol current; +#else +#error "You shall not pass, until you know what you want." +#endif +#elif defined(BACKWARD_SYSTEM_WINDOWS) +struct pdb_symbol; +#if BACKWARD_HAS_PDB_SYMBOL == 1 +typedef pdb_symbol current; +#else +#error "You shall not pass, until you know what you want." +#endif +#endif +} // namespace trace_resolver_tag + +namespace details { + +template struct rm_ptr { typedef T type; }; + +template struct rm_ptr { typedef T type; }; + +template struct rm_ptr { typedef const T type; }; + +template struct deleter { + template void operator()(U &ptr) const { (*F)(ptr); } +}; + +template struct default_delete { + void operator()(T &ptr) const { delete ptr; } +}; + +template > +class handle { + struct dummy; + T _val; + bool _empty; + +#ifdef BACKWARD_ATLEAST_CXX11 + handle(const handle &) = delete; + handle &operator=(const handle &) = delete; +#endif + +public: + ~handle() { + if (!_empty) { + Deleter()(_val); + } + } + + explicit handle() : _val(), _empty(true) {} + explicit handle(T val) : _val(val), _empty(false) { + if (!_val) + _empty = true; + } + +#ifdef BACKWARD_ATLEAST_CXX11 + handle(handle &&from) : _empty(true) { swap(from); } + handle &operator=(handle &&from) { + swap(from); + return *this; + } +#else + explicit handle(const handle &from) : _empty(true) { + // some sort of poor man's move semantic. + swap(const_cast(from)); + } + handle &operator=(const handle &from) { + // some sort of poor man's move semantic. + swap(const_cast(from)); + return *this; + } +#endif + + void reset(T new_val) { + handle tmp(new_val); + swap(tmp); + } + + void update(T new_val) { + _val = new_val; + _empty = !static_cast(new_val); + } + + operator const dummy *() const { + if (_empty) { + return nullptr; + } + return reinterpret_cast(_val); + } + T get() { return _val; } + T release() { + _empty = true; + return _val; + } + void swap(handle &b) { + using std::swap; + swap(b._val, _val); // can throw, we are safe here. + swap(b._empty, _empty); // should not throw: if you cannot swap two + // bools without throwing... It's a lost cause anyway! + } + + T &operator->() { return _val; } + const T &operator->() const { return _val; } + + typedef typename rm_ptr::type &ref_t; + typedef const typename rm_ptr::type &const_ref_t; + ref_t operator*() { return *_val; } + const_ref_t operator*() const { return *_val; } + ref_t operator[](size_t idx) { return _val[idx]; } + + // Watch out, we've got a badass over here + T *operator&() { + _empty = false; + return &_val; + } +}; + +// Default demangler implementation (do nothing). +template struct demangler_impl { + static std::string demangle(const char *funcname) { return funcname; } +}; + +#if defined(BACKWARD_SYSTEM_LINUX) || defined(BACKWARD_SYSTEM_DARWIN) + +template <> struct demangler_impl { + demangler_impl() : _demangle_buffer_length(0) {} + + std::string demangle(const char *funcname) { + using namespace details; + char *result = abi::__cxa_demangle(funcname, _demangle_buffer.get(), + &_demangle_buffer_length, nullptr); + if (result) { + _demangle_buffer.update(result); + return result; + } + return funcname; + } + +private: + details::handle _demangle_buffer; + size_t _demangle_buffer_length; +}; + +#endif // BACKWARD_SYSTEM_LINUX || BACKWARD_SYSTEM_DARWIN + +struct demangler : public demangler_impl {}; + +// Split a string on the platform's PATH delimiter. Example: if delimiter +// is ":" then: +// "" --> [] +// ":" --> ["",""] +// "::" --> ["","",""] +// "/a/b/c" --> ["/a/b/c"] +// "/a/b/c:/d/e/f" --> ["/a/b/c","/d/e/f"] +// etc. +inline std::vector split_source_prefixes(const std::string &s) { + std::vector out; + size_t last = 0; + size_t next = 0; + size_t delimiter_size = sizeof(kBackwardPathDelimiter) - 1; + while ((next = s.find(kBackwardPathDelimiter, last)) != std::string::npos) { + out.push_back(s.substr(last, next - last)); + last = next + delimiter_size; + } + if (last <= s.length()) { + out.push_back(s.substr(last)); + } + return out; +} + +} // namespace details + +/*************** A TRACE ***************/ + +struct Trace { + void *addr; + size_t idx; + + Trace() : addr(nullptr), idx(0) {} + + explicit Trace(void *_addr, size_t _idx) : addr(_addr), idx(_idx) {} +}; + +struct ResolvedTrace : public Trace { + + struct SourceLoc { + std::string function; + std::string filename; + unsigned line; + unsigned col; + + SourceLoc() : line(0), col(0) {} + + bool operator==(const SourceLoc &b) const { + return function == b.function && filename == b.filename && + line == b.line && col == b.col; + } + + bool operator!=(const SourceLoc &b) const { return !(*this == b); } + }; + + // In which binary object this trace is located. + std::string object_filename; + + // The function in the object that contain the trace. This is not the same + // as source.function which can be an function inlined in object_function. + std::string object_function; + + // The source location of this trace. It is possible for filename to be + // empty and for line/col to be invalid (value 0) if this information + // couldn't be deduced, for example if there is no debug information in the + // binary object. + SourceLoc source; + + // An optionals list of "inliners". All the successive sources location + // from where the source location of the trace (the attribute right above) + // is inlined. It is especially useful when you compiled with optimization. + typedef std::vector source_locs_t; + source_locs_t inliners; + + ResolvedTrace() : Trace() {} + ResolvedTrace(const Trace &mini_trace) : Trace(mini_trace) {} +}; + +/*************** STACK TRACE ***************/ + +// default implemention. +template class StackTraceImpl { +public: + size_t size() const { return 0; } + Trace operator[](size_t) const { return Trace(); } + size_t load_here(size_t = 0) { return 0; } + size_t load_from(void *, size_t = 0, void * = nullptr, void * = nullptr) { + return 0; + } + size_t thread_id() const { return 0; } + void skip_n_firsts(size_t) {} +}; + +class StackTraceImplBase { +public: + StackTraceImplBase() + : _thread_id(0), _skip(0), _context(nullptr), _error_addr(nullptr) {} + + size_t thread_id() const { return _thread_id; } + + void skip_n_firsts(size_t n) { _skip = n; } + +protected: + void load_thread_info() { +#ifdef BACKWARD_SYSTEM_LINUX +#ifndef __ANDROID__ + _thread_id = static_cast(syscall(SYS_gettid)); +#else + _thread_id = static_cast(gettid()); +#endif + if (_thread_id == static_cast(getpid())) { + // If the thread is the main one, let's hide that. + // I like to keep little secret sometimes. + _thread_id = 0; + } +#elif defined(BACKWARD_SYSTEM_DARWIN) + _thread_id = reinterpret_cast(pthread_self()); + if (pthread_main_np() == 1) { + // If the thread is the main one, let's hide that. + _thread_id = 0; + } +#endif + } + + void set_context(void *context) { _context = context; } + void *context() const { return _context; } + + void set_error_addr(void *error_addr) { _error_addr = error_addr; } + void *error_addr() const { return _error_addr; } + + size_t skip_n_firsts() const { return _skip; } + +private: + size_t _thread_id; + size_t _skip; + void *_context; + void *_error_addr; +}; + +class StackTraceImplHolder : public StackTraceImplBase { +public: + size_t size() const { + return (_stacktrace.size() >= skip_n_firsts()) + ? _stacktrace.size() - skip_n_firsts() + : 0; + } + Trace operator[](size_t idx) const { + if (idx >= size()) { + return Trace(); + } + return Trace(_stacktrace[idx + skip_n_firsts()], idx); + } + void *const *begin() const { + if (size()) { + return &_stacktrace[skip_n_firsts()]; + } + return nullptr; + } + +protected: + std::vector _stacktrace; +}; + +#if BACKWARD_HAS_UNWIND == 1 + +namespace details { + +template class Unwinder { +public: + size_t operator()(F &f, size_t depth) { + _f = &f; + _index = -1; + _depth = depth; + _Unwind_Backtrace(&this->backtrace_trampoline, this); + return static_cast(_index); + } + +private: + F *_f; + ssize_t _index; + size_t _depth; + + static _Unwind_Reason_Code backtrace_trampoline(_Unwind_Context *ctx, + void *self) { + return (static_cast(self))->backtrace(ctx); + } + + _Unwind_Reason_Code backtrace(_Unwind_Context *ctx) { + if (_index >= 0 && static_cast(_index) >= _depth) + return _URC_END_OF_STACK; + + int ip_before_instruction = 0; + uintptr_t ip = _Unwind_GetIPInfo(ctx, &ip_before_instruction); + + if (!ip_before_instruction) { + // calculating 0-1 for unsigned, looks like a possible bug to sanitiziers, + // so let's do it explicitly: + if (ip == 0) { + ip = std::numeric_limits::max(); // set it to 0xffff... (as + // from casting 0-1) + } else { + ip -= 1; // else just normally decrement it (no overflow/underflow will + // happen) + } + } + + if (_index >= 0) { // ignore first frame. + (*_f)(static_cast(_index), reinterpret_cast(ip)); + } + _index += 1; + return _URC_NO_REASON; + } +}; + +template size_t unwind(F f, size_t depth) { + Unwinder unwinder; + return unwinder(f, depth); +} + +} // namespace details + +template <> +class StackTraceImpl : public StackTraceImplHolder { +public: + NOINLINE + size_t load_here(size_t depth = 32, void *context = nullptr, + void *error_addr = nullptr) { + load_thread_info(); + set_context(context); + set_error_addr(error_addr); + if (depth == 0) { + return 0; + } + _stacktrace.resize(depth); + size_t trace_cnt = details::unwind(callback(*this), depth); + _stacktrace.resize(trace_cnt); + skip_n_firsts(0); + return size(); + } + size_t load_from(void *addr, size_t depth = 32, void *context = nullptr, + void *error_addr = nullptr) { + load_here(depth + 8, context, error_addr); + + for (size_t i = 0; i < _stacktrace.size(); ++i) { + if (_stacktrace[i] == addr) { + skip_n_firsts(i); + break; + } + } + + _stacktrace.resize(std::min(_stacktrace.size(), skip_n_firsts() + depth)); + return size(); + } + +private: + struct callback { + StackTraceImpl &self; + callback(StackTraceImpl &_self) : self(_self) {} + + void operator()(size_t idx, void *addr) { self._stacktrace[idx] = addr; } + }; +}; + +#elif BACKWARD_HAS_LIBUNWIND == 1 + +template <> +class StackTraceImpl : public StackTraceImplHolder { +public: + __attribute__((noinline)) size_t load_here(size_t depth = 32, + void *_context = nullptr, + void *_error_addr = nullptr) { + set_context(_context); + set_error_addr(_error_addr); + load_thread_info(); + if (depth == 0) { + return 0; + } + _stacktrace.resize(depth + 1); + + int result = 0; + + unw_context_t ctx; + size_t index = 0; + + // Add the tail call. If the Instruction Pointer is the crash address it + // means we got a bad function pointer dereference, so we "unwind" the + // bad pointer manually by using the return address pointed to by the + // Stack Pointer as the Instruction Pointer and letting libunwind do + // the rest + + if (context()) { + ucontext_t *uctx = reinterpret_cast(context()); +#ifdef REG_RIP // x86_64 + if (uctx->uc_mcontext.gregs[REG_RIP] == + reinterpret_cast(error_addr())) { + uctx->uc_mcontext.gregs[REG_RIP] = + *reinterpret_cast(uctx->uc_mcontext.gregs[REG_RSP]); + } + _stacktrace[index] = + reinterpret_cast(uctx->uc_mcontext.gregs[REG_RIP]); + ++index; + ctx = *reinterpret_cast(uctx); +#elif defined(REG_EIP) // x86_32 + if (uctx->uc_mcontext.gregs[REG_EIP] == + reinterpret_cast(error_addr())) { + uctx->uc_mcontext.gregs[REG_EIP] = + *reinterpret_cast(uctx->uc_mcontext.gregs[REG_ESP]); + } + _stacktrace[index] = + reinterpret_cast(uctx->uc_mcontext.gregs[REG_EIP]); + ++index; + ctx = *reinterpret_cast(uctx); +#elif defined(__arm__) + // libunwind uses its own context type for ARM unwinding. + // Copy the registers from the signal handler's context so we can + // unwind + unw_getcontext(&ctx); + ctx.regs[UNW_ARM_R0] = uctx->uc_mcontext.arm_r0; + ctx.regs[UNW_ARM_R1] = uctx->uc_mcontext.arm_r1; + ctx.regs[UNW_ARM_R2] = uctx->uc_mcontext.arm_r2; + ctx.regs[UNW_ARM_R3] = uctx->uc_mcontext.arm_r3; + ctx.regs[UNW_ARM_R4] = uctx->uc_mcontext.arm_r4; + ctx.regs[UNW_ARM_R5] = uctx->uc_mcontext.arm_r5; + ctx.regs[UNW_ARM_R6] = uctx->uc_mcontext.arm_r6; + ctx.regs[UNW_ARM_R7] = uctx->uc_mcontext.arm_r7; + ctx.regs[UNW_ARM_R8] = uctx->uc_mcontext.arm_r8; + ctx.regs[UNW_ARM_R9] = uctx->uc_mcontext.arm_r9; + ctx.regs[UNW_ARM_R10] = uctx->uc_mcontext.arm_r10; + ctx.regs[UNW_ARM_R11] = uctx->uc_mcontext.arm_fp; + ctx.regs[UNW_ARM_R12] = uctx->uc_mcontext.arm_ip; + ctx.regs[UNW_ARM_R13] = uctx->uc_mcontext.arm_sp; + ctx.regs[UNW_ARM_R14] = uctx->uc_mcontext.arm_lr; + ctx.regs[UNW_ARM_R15] = uctx->uc_mcontext.arm_pc; + + // If we have crashed in the PC use the LR instead, as this was + // a bad function dereference + if (reinterpret_cast(error_addr()) == + uctx->uc_mcontext.arm_pc) { + ctx.regs[UNW_ARM_R15] = + uctx->uc_mcontext.arm_lr - sizeof(unsigned long); + } + _stacktrace[index] = reinterpret_cast(ctx.regs[UNW_ARM_R15]); + ++index; +#elif defined(__APPLE__) && defined(__x86_64__) + unw_getcontext(&ctx); + // OS X's implementation of libunwind uses its own context object + // so we need to convert the passed context to libunwind's format + // (information about the data layout taken from unw_getcontext.s + // in Apple's libunwind source + ctx.data[0] = uctx->uc_mcontext->__ss.__rax; + ctx.data[1] = uctx->uc_mcontext->__ss.__rbx; + ctx.data[2] = uctx->uc_mcontext->__ss.__rcx; + ctx.data[3] = uctx->uc_mcontext->__ss.__rdx; + ctx.data[4] = uctx->uc_mcontext->__ss.__rdi; + ctx.data[5] = uctx->uc_mcontext->__ss.__rsi; + ctx.data[6] = uctx->uc_mcontext->__ss.__rbp; + ctx.data[7] = uctx->uc_mcontext->__ss.__rsp; + ctx.data[8] = uctx->uc_mcontext->__ss.__r8; + ctx.data[9] = uctx->uc_mcontext->__ss.__r9; + ctx.data[10] = uctx->uc_mcontext->__ss.__r10; + ctx.data[11] = uctx->uc_mcontext->__ss.__r11; + ctx.data[12] = uctx->uc_mcontext->__ss.__r12; + ctx.data[13] = uctx->uc_mcontext->__ss.__r13; + ctx.data[14] = uctx->uc_mcontext->__ss.__r14; + ctx.data[15] = uctx->uc_mcontext->__ss.__r15; + ctx.data[16] = uctx->uc_mcontext->__ss.__rip; + + // If the IP is the same as the crash address we have a bad function + // dereference The caller's address is pointed to by %rsp, so we + // dereference that value and set it to be the next frame's IP. + if (uctx->uc_mcontext->__ss.__rip == + reinterpret_cast<__uint64_t>(error_addr())) { + ctx.data[16] = + *reinterpret_cast<__uint64_t *>(uctx->uc_mcontext->__ss.__rsp); + } + _stacktrace[index] = reinterpret_cast(ctx.data[16]); + ++index; +#elif defined(__APPLE__) + unw_getcontext(&ctx) + // TODO: Convert the ucontext_t to libunwind's unw_context_t like + // we do in 64 bits + if (ctx.uc_mcontext->__ss.__eip == + reinterpret_cast(error_addr())) { + ctx.uc_mcontext->__ss.__eip = ctx.uc_mcontext->__ss.__esp; + } + _stacktrace[index] = + reinterpret_cast(ctx.uc_mcontext->__ss.__eip); + ++index; +#endif + } + + unw_cursor_t cursor; + if (context()) { +#if defined(UNW_INIT_SIGNAL_FRAME) + result = unw_init_local2(&cursor, &ctx, UNW_INIT_SIGNAL_FRAME); +#else + result = unw_init_local(&cursor, &ctx); +#endif + } else { + unw_getcontext(&ctx); + ; + result = unw_init_local(&cursor, &ctx); + } + + if (result != 0) + return 1; + + unw_word_t ip = 0; + + while (index <= depth && unw_step(&cursor) > 0) { + result = unw_get_reg(&cursor, UNW_REG_IP, &ip); + if (result == 0) { + _stacktrace[index] = reinterpret_cast(--ip); + ++index; + } + } + --index; + + _stacktrace.resize(index + 1); + skip_n_firsts(0); + return size(); + } + + size_t load_from(void *addr, size_t depth = 32, void *context = nullptr, + void *error_addr = nullptr) { + load_here(depth + 8, context, error_addr); + + for (size_t i = 0; i < _stacktrace.size(); ++i) { + if (_stacktrace[i] == addr) { + skip_n_firsts(i); + _stacktrace[i] = (void *)((uintptr_t)_stacktrace[i]); + break; + } + } + + _stacktrace.resize(std::min(_stacktrace.size(), skip_n_firsts() + depth)); + return size(); + } +}; + +#elif defined(BACKWARD_HAS_BACKTRACE) + +template <> +class StackTraceImpl : public StackTraceImplHolder { +public: + NOINLINE + size_t load_here(size_t depth = 32, void *context = nullptr, + void *error_addr = nullptr) { + set_context(context); + set_error_addr(error_addr); + load_thread_info(); + if (depth == 0) { + return 0; + } + _stacktrace.resize(depth + 1); + size_t trace_cnt = backtrace(&_stacktrace[0], _stacktrace.size()); + _stacktrace.resize(trace_cnt); + skip_n_firsts(1); + return size(); + } + + size_t load_from(void *addr, size_t depth = 32, void *context = nullptr, + void *error_addr = nullptr) { + load_here(depth + 8, context, error_addr); + + for (size_t i = 0; i < _stacktrace.size(); ++i) { + if (_stacktrace[i] == addr) { + skip_n_firsts(i); + _stacktrace[i] = (void *)((uintptr_t)_stacktrace[i] + 1); + break; + } + } + + _stacktrace.resize(std::min(_stacktrace.size(), skip_n_firsts() + depth)); + return size(); + } +}; + +#elif defined(BACKWARD_SYSTEM_WINDOWS) + +template <> +class StackTraceImpl : public StackTraceImplHolder { +public: + // We have to load the machine type from the image info + // So we first initialize the resolver, and it tells us this info + void set_machine_type(DWORD machine_type) { machine_type_ = machine_type; } + void set_context(CONTEXT *ctx) { ctx_ = ctx; } + void set_thread_handle(HANDLE handle) { thd_ = handle; } + + NOINLINE + size_t load_here(size_t depth = 32, void *context = nullptr, + void *error_addr = nullptr) { + set_context(static_cast(context)); + set_error_addr(error_addr); + CONTEXT localCtx; // used when no context is provided + + if (depth == 0) { + return 0; + } + + if (!ctx_) { + ctx_ = &localCtx; + RtlCaptureContext(ctx_); + } + + if (!thd_) { + thd_ = GetCurrentThread(); + } + + HANDLE process = GetCurrentProcess(); + + STACKFRAME64 s; + memset(&s, 0, sizeof(STACKFRAME64)); + + // TODO: 32 bit context capture + s.AddrStack.Mode = AddrModeFlat; + s.AddrFrame.Mode = AddrModeFlat; + s.AddrPC.Mode = AddrModeFlat; +#ifdef _M_X64 + s.AddrPC.Offset = ctx_->Rip; + s.AddrStack.Offset = ctx_->Rsp; + s.AddrFrame.Offset = ctx_->Rbp; +#else + s.AddrPC.Offset = ctx_->Eip; + s.AddrStack.Offset = ctx_->Esp; + s.AddrFrame.Offset = ctx_->Ebp; +#endif + + if (!machine_type_) { +#ifdef _M_X64 + machine_type_ = IMAGE_FILE_MACHINE_AMD64; +#else + machine_type_ = IMAGE_FILE_MACHINE_I386; +#endif + } + + for (;;) { + // NOTE: this only works if PDBs are already loaded! + SetLastError(0); + if (!StackWalk64(machine_type_, process, thd_, &s, ctx_, NULL, + SymFunctionTableAccess64, SymGetModuleBase64, NULL)) + break; + + if (s.AddrReturn.Offset == 0) + break; + + _stacktrace.push_back(reinterpret_cast(s.AddrPC.Offset)); + + if (size() >= depth) + break; + } + + return size(); + } + + size_t load_from(void *addr, size_t depth = 32, void *context = nullptr, + void *error_addr = nullptr) { + load_here(depth + 8, context, error_addr); + + for (size_t i = 0; i < _stacktrace.size(); ++i) { + if (_stacktrace[i] == addr) { + skip_n_firsts(i); + break; + } + } + + _stacktrace.resize(std::min(_stacktrace.size(), skip_n_firsts() + depth)); + return size(); + } + +private: + DWORD machine_type_ = 0; + HANDLE thd_ = 0; + CONTEXT *ctx_ = nullptr; +}; + +#endif + +class StackTrace : public StackTraceImpl {}; + +/*************** TRACE RESOLVER ***************/ + +class TraceResolverImplBase { +public: + virtual ~TraceResolverImplBase() {} + + virtual void load_addresses(void *const*addresses, int address_count) { + (void)addresses; + (void)address_count; + } + + template void load_stacktrace(ST &st) { + load_addresses(st.begin(), static_cast(st.size())); + } + + virtual ResolvedTrace resolve(ResolvedTrace t) { return t; } + +protected: + std::string demangle(const char *funcname) { + return _demangler.demangle(funcname); + } + +private: + details::demangler _demangler; +}; + +template class TraceResolverImpl; + +#ifdef BACKWARD_SYSTEM_UNKNOWN + +template <> class TraceResolverImpl + : public TraceResolverImplBase {}; + +#endif + +#ifdef BACKWARD_SYSTEM_LINUX + +class TraceResolverLinuxBase : public TraceResolverImplBase { +public: + TraceResolverLinuxBase() + : argv0_(get_argv0()), exec_path_(read_symlink("/proc/self/exe")) {} + std::string resolve_exec_path(Dl_info &symbol_info) const { + // mutates symbol_info.dli_fname to be filename to open and returns filename + // to display + if (symbol_info.dli_fname == argv0_) { + // dladdr returns argv[0] in dli_fname for symbols contained in + // the main executable, which is not a valid path if the + // executable was found by a search of the PATH environment + // variable; In that case, we actually open /proc/self/exe, which + // is always the actual executable (even if it was deleted/replaced!) + // but display the path that /proc/self/exe links to. + // However, this right away reduces probability of successful symbol + // resolution, because libbfd may try to find *.debug files in the + // same dir, in case symbols are stripped. As a result, it may try + // to find a file /proc/self/.debug, which obviously does + // not exist. /proc/self/exe is a last resort. First load attempt + // should go for the original executable file path. + symbol_info.dli_fname = "/proc/self/exe"; + return exec_path_; + } else { + return symbol_info.dli_fname; + } + } + +private: + std::string argv0_; + std::string exec_path_; + + static std::string get_argv0() { + std::string argv0; + std::ifstream ifs("/proc/self/cmdline"); + std::getline(ifs, argv0, '\0'); + return argv0; + } + + static std::string read_symlink(std::string const &symlink_path) { + std::string path; + path.resize(100); + + while (true) { + ssize_t len = + ::readlink(symlink_path.c_str(), &*path.begin(), path.size()); + if (len < 0) { + return ""; + } + if (static_cast(len) == path.size()) { + path.resize(path.size() * 2); + } else { + path.resize(static_cast(len)); + break; + } + } + + return path; + } +}; + +template class TraceResolverLinuxImpl; + +#if BACKWARD_HAS_BACKTRACE_SYMBOL == 1 + +template <> +class TraceResolverLinuxImpl + : public TraceResolverLinuxBase { +public: + void load_addresses(void *const*addresses, int address_count) override { + if (address_count == 0) { + return; + } + _symbols.reset(backtrace_symbols(addresses, address_count)); + } + + ResolvedTrace resolve(ResolvedTrace trace) override { + char *filename = _symbols[trace.idx]; + char *funcname = filename; + while (*funcname && *funcname != '(') { + funcname += 1; + } + trace.object_filename.assign(filename, + funcname); // ok even if funcname is the ending + // \0 (then we assign entire string) + + if (*funcname) { // if it's not end of string (e.g. from last frame ip==0) + funcname += 1; + char *funcname_end = funcname; + while (*funcname_end && *funcname_end != ')' && *funcname_end != '+') { + funcname_end += 1; + } + *funcname_end = '\0'; + trace.object_function = this->demangle(funcname); + trace.source.function = trace.object_function; // we cannot do better. + } + return trace; + } + +private: + details::handle _symbols; +}; + +#endif // BACKWARD_HAS_BACKTRACE_SYMBOL == 1 + +#if BACKWARD_HAS_BFD == 1 + +template <> +class TraceResolverLinuxImpl + : public TraceResolverLinuxBase { +public: + TraceResolverLinuxImpl() : _bfd_loaded(false) {} + + ResolvedTrace resolve(ResolvedTrace trace) override { + Dl_info symbol_info; + + // trace.addr is a virtual address in memory pointing to some code. + // Let's try to find from which loaded object it comes from. + // The loaded object can be yourself btw. + if (!dladdr(trace.addr, &symbol_info)) { + return trace; // dat broken trace... + } + + // Now we get in symbol_info: + // .dli_fname: + // pathname of the shared object that contains the address. + // .dli_fbase: + // where the object is loaded in memory. + // .dli_sname: + // the name of the nearest symbol to trace.addr, we expect a + // function name. + // .dli_saddr: + // the exact address corresponding to .dli_sname. + + if (symbol_info.dli_sname) { + trace.object_function = demangle(symbol_info.dli_sname); + } + + if (!symbol_info.dli_fname) { + return trace; + } + + trace.object_filename = resolve_exec_path(symbol_info); + bfd_fileobject *fobj; + // Before rushing to resolution need to ensure the executable + // file still can be used. For that compare inode numbers of + // what is stored by the executable's file path, and in the + // dli_fname, which not necessarily equals to the executable. + // It can be a shared library, or /proc/self/exe, and in the + // latter case has drawbacks. See the exec path resolution for + // details. In short - the dli object should be used only as + // the last resort. + // If inode numbers are equal, it is known dli_fname and the + // executable file are the same. This is guaranteed by Linux, + // because if the executable file is changed/deleted, it will + // be done in a new inode. The old file will be preserved in + // /proc/self/exe, and may even have inode 0. The latter can + // happen if the inode was actually reused, and the file was + // kept only in the main memory. + // + struct stat obj_stat; + struct stat dli_stat; + if (stat(trace.object_filename.c_str(), &obj_stat) == 0 && + stat(symbol_info.dli_fname, &dli_stat) == 0 && + obj_stat.st_ino == dli_stat.st_ino) { + // The executable file, and the shared object containing the + // address are the same file. Safe to use the original path. + // this is preferable. Libbfd will search for stripped debug + // symbols in the same directory. + fobj = load_object_with_bfd(trace.object_filename); + } else{ + // The original object file was *deleted*! The only hope is + // that the debug symbols are either inside the shared + // object file, or are in the same directory, and this is + // not /proc/self/exe. + fobj = nullptr; + } + if (fobj == nullptr || !fobj->handle) { + fobj = load_object_with_bfd(symbol_info.dli_fname); + if (!fobj->handle) { + return trace; + } + } + + find_sym_result *details_selected; // to be filled. + + // trace.addr is the next instruction to be executed after returning + // from the nested stack frame. In C++ this usually relate to the next + // statement right after the function call that leaded to a new stack + // frame. This is not usually what you want to see when printing out a + // stacktrace... + find_sym_result details_call_site = + find_symbol_details(fobj, trace.addr, symbol_info.dli_fbase); + details_selected = &details_call_site; + +#if BACKWARD_HAS_UNWIND == 0 + // ...this is why we also try to resolve the symbol that is right + // before the return address. If we are lucky enough, we will get the + // line of the function that was called. But if the code is optimized, + // we might get something absolutely not related since the compiler + // can reschedule the return address with inline functions and + // tail-call optimisation (among other things that I don't even know + // or cannot even dream about with my tiny limited brain). + find_sym_result details_adjusted_call_site = find_symbol_details( + fobj, (void *)(uintptr_t(trace.addr) - 1), symbol_info.dli_fbase); + + // In debug mode, we should always get the right thing(TM). + if (details_call_site.found && details_adjusted_call_site.found) { + // Ok, we assume that details_adjusted_call_site is a better estimation. + details_selected = &details_adjusted_call_site; + trace.addr = (void *)(uintptr_t(trace.addr) - 1); + } + + if (details_selected == &details_call_site && details_call_site.found) { + // we have to re-resolve the symbol in order to reset some + // internal state in BFD... so we can call backtrace_inliners + // thereafter... + details_call_site = + find_symbol_details(fobj, trace.addr, symbol_info.dli_fbase); + } +#endif // BACKWARD_HAS_UNWIND + + if (details_selected->found) { + if (details_selected->filename) { + trace.source.filename = details_selected->filename; + } + trace.source.line = details_selected->line; + + if (details_selected->funcname) { + // this time we get the name of the function where the code is + // located, instead of the function were the address is + // located. In short, if the code was inlined, we get the + // function correspoding to the code. Else we already got in + // trace.function. + trace.source.function = demangle(details_selected->funcname); + + if (!symbol_info.dli_sname) { + // for the case dladdr failed to find the symbol name of + // the function, we might as well try to put something + // here. + trace.object_function = trace.source.function; + } + } + + // Maybe the source of the trace got inlined inside the function + // (trace.source.function). Let's see if we can get all the inlined + // calls along the way up to the initial call site. + trace.inliners = backtrace_inliners(fobj, *details_selected); + +#if 0 + if (trace.inliners.size() == 0) { + // Maybe the trace was not inlined... or maybe it was and we + // are lacking the debug information. Let's try to make the + // world better and see if we can get the line number of the + // function (trace.source.function) now. + // + // We will get the location of where the function start (to be + // exact: the first instruction that really start the + // function), not where the name of the function is defined. + // This can be quite far away from the name of the function + // btw. + // + // If the source of the function is the same as the source of + // the trace, we cannot say if the trace was really inlined or + // not. However, if the filename of the source is different + // between the function and the trace... we can declare it as + // an inliner. This is not 100% accurate, but better than + // nothing. + + if (symbol_info.dli_saddr) { + find_sym_result details = find_symbol_details(fobj, + symbol_info.dli_saddr, + symbol_info.dli_fbase); + + if (details.found) { + ResolvedTrace::SourceLoc diy_inliner; + diy_inliner.line = details.line; + if (details.filename) { + diy_inliner.filename = details.filename; + } + if (details.funcname) { + diy_inliner.function = demangle(details.funcname); + } else { + diy_inliner.function = trace.source.function; + } + if (diy_inliner != trace.source) { + trace.inliners.push_back(diy_inliner); + } + } + } + } +#endif + } + + return trace; + } + +private: + bool _bfd_loaded; + + typedef details::handle > + bfd_handle_t; + + typedef details::handle bfd_symtab_t; + + struct bfd_fileobject { + bfd_handle_t handle; + bfd_vma base_addr; + bfd_symtab_t symtab; + bfd_symtab_t dynamic_symtab; + }; + + typedef details::hashtable::type fobj_bfd_map_t; + fobj_bfd_map_t _fobj_bfd_map; + + bfd_fileobject *load_object_with_bfd(const std::string &filename_object) { + using namespace details; + + if (!_bfd_loaded) { + using namespace details; + bfd_init(); + _bfd_loaded = true; + } + + fobj_bfd_map_t::iterator it = _fobj_bfd_map.find(filename_object); + if (it != _fobj_bfd_map.end()) { + return &it->second; + } + + // this new object is empty for now. + bfd_fileobject *r = &_fobj_bfd_map[filename_object]; + + // we do the work temporary in this one; + bfd_handle_t bfd_handle; + + int fd = open(filename_object.c_str(), O_RDONLY); + bfd_handle.reset(bfd_fdopenr(filename_object.c_str(), "default", fd)); + if (!bfd_handle) { + close(fd); + return r; + } + + if (!bfd_check_format(bfd_handle.get(), bfd_object)) { + return r; // not an object? You lose. + } + + if ((bfd_get_file_flags(bfd_handle.get()) & HAS_SYMS) == 0) { + return r; // that's what happen when you forget to compile in debug. + } + + ssize_t symtab_storage_size = bfd_get_symtab_upper_bound(bfd_handle.get()); + + ssize_t dyn_symtab_storage_size = + bfd_get_dynamic_symtab_upper_bound(bfd_handle.get()); + + if (symtab_storage_size <= 0 && dyn_symtab_storage_size <= 0) { + return r; // weird, is the file is corrupted? + } + + bfd_symtab_t symtab, dynamic_symtab; + ssize_t symcount = 0, dyn_symcount = 0; + + if (symtab_storage_size > 0) { + symtab.reset(static_cast( + malloc(static_cast(symtab_storage_size)))); + symcount = bfd_canonicalize_symtab(bfd_handle.get(), symtab.get()); + } + + if (dyn_symtab_storage_size > 0) { + dynamic_symtab.reset(static_cast( + malloc(static_cast(dyn_symtab_storage_size)))); + dyn_symcount = bfd_canonicalize_dynamic_symtab(bfd_handle.get(), + dynamic_symtab.get()); + } + + if (symcount <= 0 && dyn_symcount <= 0) { + return r; // damned, that's a stripped file that you got there! + } + + r->handle = move(bfd_handle); + r->symtab = move(symtab); + r->dynamic_symtab = move(dynamic_symtab); + return r; + } + + struct find_sym_result { + bool found; + const char *filename; + const char *funcname; + unsigned int line; + }; + + struct find_sym_context { + TraceResolverLinuxImpl *self; + bfd_fileobject *fobj; + void *addr; + void *base_addr; + find_sym_result result; + }; + + find_sym_result find_symbol_details(bfd_fileobject *fobj, void *addr, + void *base_addr) { + find_sym_context context; + context.self = this; + context.fobj = fobj; + context.addr = addr; + context.base_addr = base_addr; + context.result.found = false; + bfd_map_over_sections(fobj->handle.get(), &find_in_section_trampoline, + static_cast(&context)); + return context.result; + } + + static void find_in_section_trampoline(bfd *, asection *section, void *data) { + find_sym_context *context = static_cast(data); + context->self->find_in_section( + reinterpret_cast(context->addr), + reinterpret_cast(context->base_addr), context->fobj, section, + context->result); + } + + void find_in_section(bfd_vma addr, bfd_vma base_addr, bfd_fileobject *fobj, + asection *section, find_sym_result &result) { + if (result.found) + return; + +#ifdef bfd_get_section_flags + if ((bfd_get_section_flags(fobj->handle.get(), section) & SEC_ALLOC) == 0) +#else + if ((bfd_section_flags(section) & SEC_ALLOC) == 0) +#endif + return; // a debug section is never loaded automatically. + +#ifdef bfd_get_section_vma + bfd_vma sec_addr = bfd_get_section_vma(fobj->handle.get(), section); +#else + bfd_vma sec_addr = bfd_section_vma(section); +#endif +#ifdef bfd_get_section_size + bfd_size_type size = bfd_get_section_size(section); +#else + bfd_size_type size = bfd_section_size(section); +#endif + + // are we in the boundaries of the section? + if (addr < sec_addr || addr >= sec_addr + size) { + addr -= base_addr; // oups, a relocated object, lets try again... + if (addr < sec_addr || addr >= sec_addr + size) { + return; + } + } + +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#endif + if (!result.found && fobj->symtab) { + result.found = bfd_find_nearest_line( + fobj->handle.get(), section, fobj->symtab.get(), addr - sec_addr, + &result.filename, &result.funcname, &result.line); + } + + if (!result.found && fobj->dynamic_symtab) { + result.found = bfd_find_nearest_line( + fobj->handle.get(), section, fobj->dynamic_symtab.get(), + addr - sec_addr, &result.filename, &result.funcname, &result.line); + } +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + } + + ResolvedTrace::source_locs_t + backtrace_inliners(bfd_fileobject *fobj, find_sym_result previous_result) { + // This function can be called ONLY after a SUCCESSFUL call to + // find_symbol_details. The state is global to the bfd_handle. + ResolvedTrace::source_locs_t results; + while (previous_result.found) { + find_sym_result result; + result.found = bfd_find_inliner_info(fobj->handle.get(), &result.filename, + &result.funcname, &result.line); + + if (result + .found) /* and not ( + cstrings_eq(previous_result.filename, + result.filename) and + cstrings_eq(previous_result.funcname, result.funcname) + and result.line == previous_result.line + )) */ + { + ResolvedTrace::SourceLoc src_loc; + src_loc.line = result.line; + if (result.filename) { + src_loc.filename = result.filename; + } + if (result.funcname) { + src_loc.function = demangle(result.funcname); + } + results.push_back(src_loc); + } + previous_result = result; + } + return results; + } + + bool cstrings_eq(const char *a, const char *b) { + if (!a || !b) { + return false; + } + return strcmp(a, b) == 0; + } +}; +#endif // BACKWARD_HAS_BFD == 1 + +#if BACKWARD_HAS_DW == 1 + +template <> +class TraceResolverLinuxImpl + : public TraceResolverLinuxBase { +public: + TraceResolverLinuxImpl() : _dwfl_handle_initialized(false) {} + + ResolvedTrace resolve(ResolvedTrace trace) override { + using namespace details; + + Dwarf_Addr trace_addr = (Dwarf_Addr)trace.addr; + + if (!_dwfl_handle_initialized) { + // initialize dwfl... + _dwfl_cb.reset(new Dwfl_Callbacks); + _dwfl_cb->find_elf = &dwfl_linux_proc_find_elf; + _dwfl_cb->find_debuginfo = &dwfl_standard_find_debuginfo; + _dwfl_cb->debuginfo_path = 0; + + _dwfl_handle.reset(dwfl_begin(_dwfl_cb.get())); + _dwfl_handle_initialized = true; + + if (!_dwfl_handle) { + return trace; + } + + // ...from the current process. + dwfl_report_begin(_dwfl_handle.get()); + int r = dwfl_linux_proc_report(_dwfl_handle.get(), getpid()); + dwfl_report_end(_dwfl_handle.get(), NULL, NULL); + if (r < 0) { + return trace; + } + } + + if (!_dwfl_handle) { + return trace; + } + + // find the module (binary object) that contains the trace's address. + // This is not using any debug information, but the addresses ranges of + // all the currently loaded binary object. + Dwfl_Module *mod = dwfl_addrmodule(_dwfl_handle.get(), trace_addr); + if (mod) { + // now that we found it, lets get the name of it, this will be the + // full path to the running binary or one of the loaded library. + const char *module_name = dwfl_module_info(mod, 0, 0, 0, 0, 0, 0, 0); + if (module_name) { + trace.object_filename = module_name; + } + // We also look after the name of the symbol, equal or before this + // address. This is found by walking the symtab. We should get the + // symbol corresponding to the function (mangled) containing the + // address. If the code corresponding to the address was inlined, + // this is the name of the out-most inliner function. + const char *sym_name = dwfl_module_addrname(mod, trace_addr); + if (sym_name) { + trace.object_function = demangle(sym_name); + } + } + + // now let's get serious, and find out the source location (file and + // line number) of the address. + + // This function will look in .debug_aranges for the address and map it + // to the location of the compilation unit DIE in .debug_info and + // return it. + Dwarf_Addr mod_bias = 0; + Dwarf_Die *cudie = dwfl_module_addrdie(mod, trace_addr, &mod_bias); + +#if 1 + if (!cudie) { + // Sadly clang does not generate the section .debug_aranges, thus + // dwfl_module_addrdie will fail early. Clang doesn't either set + // the lowpc/highpc/range info for every compilation unit. + // + // So in order to save the world: + // for every compilation unit, we will iterate over every single + // DIEs. Normally functions should have a lowpc/highpc/range, which + // we will use to infer the compilation unit. + + // note that this is probably badly inefficient. + while ((cudie = dwfl_module_nextcu(mod, cudie, &mod_bias))) { + Dwarf_Die die_mem; + Dwarf_Die *fundie = + find_fundie_by_pc(cudie, trace_addr - mod_bias, &die_mem); + if (fundie) { + break; + } + } + } +#endif + +//#define BACKWARD_I_DO_NOT_RECOMMEND_TO_ENABLE_THIS_HORRIBLE_PIECE_OF_CODE +#ifdef BACKWARD_I_DO_NOT_RECOMMEND_TO_ENABLE_THIS_HORRIBLE_PIECE_OF_CODE + if (!cudie) { + // If it's still not enough, lets dive deeper in the shit, and try + // to save the world again: for every compilation unit, we will + // load the corresponding .debug_line section, and see if we can + // find our address in it. + + Dwarf_Addr cfi_bias; + Dwarf_CFI *cfi_cache = dwfl_module_eh_cfi(mod, &cfi_bias); + + Dwarf_Addr bias; + while ((cudie = dwfl_module_nextcu(mod, cudie, &bias))) { + if (dwarf_getsrc_die(cudie, trace_addr - bias)) { + + // ...but if we get a match, it might be a false positive + // because our (address - bias) might as well be valid in a + // different compilation unit. So we throw our last card on + // the table and lookup for the address into the .eh_frame + // section. + + handle frame; + dwarf_cfi_addrframe(cfi_cache, trace_addr - cfi_bias, &frame); + if (frame) { + break; + } + } + } + } +#endif + + if (!cudie) { + return trace; // this time we lost the game :/ + } + + // Now that we have a compilation unit DIE, this function will be able + // to load the corresponding section in .debug_line (if not already + // loaded) and hopefully find the source location mapped to our + // address. + Dwarf_Line *srcloc = dwarf_getsrc_die(cudie, trace_addr - mod_bias); + + if (srcloc) { + const char *srcfile = dwarf_linesrc(srcloc, 0, 0); + if (srcfile) { + trace.source.filename = srcfile; + } + int line = 0, col = 0; + dwarf_lineno(srcloc, &line); + dwarf_linecol(srcloc, &col); + trace.source.line = line; + trace.source.col = col; + } + + deep_first_search_by_pc(cudie, trace_addr - mod_bias, + inliners_search_cb(trace)); + if (trace.source.function.size() == 0) { + // fallback. + trace.source.function = trace.object_function; + } + + return trace; + } + +private: + typedef details::handle > + dwfl_handle_t; + details::handle > + _dwfl_cb; + dwfl_handle_t _dwfl_handle; + bool _dwfl_handle_initialized; + + // defined here because in C++98, template function cannot take locally + // defined types... grrr. + struct inliners_search_cb { + void operator()(Dwarf_Die *die) { + switch (dwarf_tag(die)) { + const char *name; + case DW_TAG_subprogram: + if ((name = dwarf_diename(die))) { + trace.source.function = name; + } + break; + + case DW_TAG_inlined_subroutine: + ResolvedTrace::SourceLoc sloc; + Dwarf_Attribute attr_mem; + + if ((name = dwarf_diename(die))) { + sloc.function = name; + } + if ((name = die_call_file(die))) { + sloc.filename = name; + } + + Dwarf_Word line = 0, col = 0; + dwarf_formudata(dwarf_attr(die, DW_AT_call_line, &attr_mem), &line); + dwarf_formudata(dwarf_attr(die, DW_AT_call_column, &attr_mem), &col); + sloc.line = (unsigned)line; + sloc.col = (unsigned)col; + + trace.inliners.push_back(sloc); + break; + }; + } + ResolvedTrace &trace; + inliners_search_cb(ResolvedTrace &t) : trace(t) {} + }; + + static bool die_has_pc(Dwarf_Die *die, Dwarf_Addr pc) { + Dwarf_Addr low, high; + + // continuous range + if (dwarf_hasattr(die, DW_AT_low_pc) && dwarf_hasattr(die, DW_AT_high_pc)) { + if (dwarf_lowpc(die, &low) != 0) { + return false; + } + if (dwarf_highpc(die, &high) != 0) { + Dwarf_Attribute attr_mem; + Dwarf_Attribute *attr = dwarf_attr(die, DW_AT_high_pc, &attr_mem); + Dwarf_Word value; + if (dwarf_formudata(attr, &value) != 0) { + return false; + } + high = low + value; + } + return pc >= low && pc < high; + } + + // non-continuous range. + Dwarf_Addr base; + ptrdiff_t offset = 0; + while ((offset = dwarf_ranges(die, offset, &base, &low, &high)) > 0) { + if (pc >= low && pc < high) { + return true; + } + } + return false; + } + + static Dwarf_Die *find_fundie_by_pc(Dwarf_Die *parent_die, Dwarf_Addr pc, + Dwarf_Die *result) { + if (dwarf_child(parent_die, result) != 0) { + return 0; + } + + Dwarf_Die *die = result; + do { + switch (dwarf_tag(die)) { + case DW_TAG_subprogram: + case DW_TAG_inlined_subroutine: + if (die_has_pc(die, pc)) { + return result; + } + }; + bool declaration = false; + Dwarf_Attribute attr_mem; + dwarf_formflag(dwarf_attr(die, DW_AT_declaration, &attr_mem), + &declaration); + if (!declaration) { + // let's be curious and look deeper in the tree, + // function are not necessarily at the first level, but + // might be nested inside a namespace, structure etc. + Dwarf_Die die_mem; + Dwarf_Die *indie = find_fundie_by_pc(die, pc, &die_mem); + if (indie) { + *result = die_mem; + return result; + } + } + } while (dwarf_siblingof(die, result) == 0); + return 0; + } + + template + static bool deep_first_search_by_pc(Dwarf_Die *parent_die, Dwarf_Addr pc, + CB cb) { + Dwarf_Die die_mem; + if (dwarf_child(parent_die, &die_mem) != 0) { + return false; + } + + bool branch_has_pc = false; + Dwarf_Die *die = &die_mem; + do { + bool declaration = false; + Dwarf_Attribute attr_mem; + dwarf_formflag(dwarf_attr(die, DW_AT_declaration, &attr_mem), + &declaration); + if (!declaration) { + // let's be curious and look deeper in the tree, function are + // not necessarily at the first level, but might be nested + // inside a namespace, structure, a function, an inlined + // function etc. + branch_has_pc = deep_first_search_by_pc(die, pc, cb); + } + if (!branch_has_pc) { + branch_has_pc = die_has_pc(die, pc); + } + if (branch_has_pc) { + cb(die); + } + } while (dwarf_siblingof(die, &die_mem) == 0); + return branch_has_pc; + } + + static const char *die_call_file(Dwarf_Die *die) { + Dwarf_Attribute attr_mem; + Dwarf_Word file_idx = 0; + + dwarf_formudata(dwarf_attr(die, DW_AT_call_file, &attr_mem), &file_idx); + + if (file_idx == 0) { + return 0; + } + + Dwarf_Die die_mem; + Dwarf_Die *cudie = dwarf_diecu(die, &die_mem, 0, 0); + if (!cudie) { + return 0; + } + + Dwarf_Files *files = 0; + size_t nfiles; + dwarf_getsrcfiles(cudie, &files, &nfiles); + if (!files) { + return 0; + } + + return dwarf_filesrc(files, file_idx, 0, 0); + } +}; +#endif // BACKWARD_HAS_DW == 1 + +#if BACKWARD_HAS_DWARF == 1 + +template <> +class TraceResolverLinuxImpl + : public TraceResolverLinuxBase { +public: + TraceResolverLinuxImpl() : _dwarf_loaded(false) {} + + ResolvedTrace resolve(ResolvedTrace trace) override { + // trace.addr is a virtual address in memory pointing to some code. + // Let's try to find from which loaded object it comes from. + // The loaded object can be yourself btw. + + Dl_info symbol_info; + int dladdr_result = 0; +#if defined(__GLIBC__) + link_map *link_map; + // We request the link map so we can get information about offsets + dladdr_result = + dladdr1(trace.addr, &symbol_info, reinterpret_cast(&link_map), + RTLD_DL_LINKMAP); +#else + // Android doesn't have dladdr1. Don't use the linker map. + dladdr_result = dladdr(trace.addr, &symbol_info); +#endif + if (!dladdr_result) { + return trace; // dat broken trace... + } + + // Now we get in symbol_info: + // .dli_fname: + // pathname of the shared object that contains the address. + // .dli_fbase: + // where the object is loaded in memory. + // .dli_sname: + // the name of the nearest symbol to trace.addr, we expect a + // function name. + // .dli_saddr: + // the exact address corresponding to .dli_sname. + // + // And in link_map: + // .l_addr: + // difference between the address in the ELF file and the address + // in memory + // l_name: + // absolute pathname where the object was found + + if (symbol_info.dli_sname) { + trace.object_function = demangle(symbol_info.dli_sname); + } + + if (!symbol_info.dli_fname) { + return trace; + } + + trace.object_filename = resolve_exec_path(symbol_info); + dwarf_fileobject &fobj = load_object_with_dwarf(symbol_info.dli_fname); + if (!fobj.dwarf_handle) { + return trace; // sad, we couldn't load the object :( + } + +#if defined(__GLIBC__) + // Convert the address to a module relative one by looking at + // the module's loading address in the link map + Dwarf_Addr address = reinterpret_cast(trace.addr) - + reinterpret_cast(link_map->l_addr); +#else + Dwarf_Addr address = reinterpret_cast(trace.addr); +#endif + + if (trace.object_function.empty()) { + symbol_cache_t::iterator it = fobj.symbol_cache.lower_bound(address); + + if (it != fobj.symbol_cache.end()) { + if (it->first != address) { + if (it != fobj.symbol_cache.begin()) { + --it; + } + } + trace.object_function = demangle(it->second.c_str()); + } + } + + // Get the Compilation Unit DIE for the address + Dwarf_Die die = find_die(fobj, address); + + if (!die) { + return trace; // this time we lost the game :/ + } + + // libdwarf doesn't give us direct access to its objects, it always + // allocates a copy for the caller. We keep that copy alive in a cache + // and we deallocate it later when it's no longer required. + die_cache_entry &die_object = get_die_cache(fobj, die); + if (die_object.isEmpty()) + return trace; // We have no line section for this DIE + + die_linemap_t::iterator it = die_object.line_section.lower_bound(address); + + if (it != die_object.line_section.end()) { + if (it->first != address) { + if (it == die_object.line_section.begin()) { + // If we are on the first item of the line section + // but the address does not match it means that + // the address is below the range of the DIE. Give up. + return trace; + } else { + --it; + } + } + } else { + return trace; // We didn't find the address. + } + + // Get the Dwarf_Line that the address points to and call libdwarf + // to get source file, line and column info. + Dwarf_Line line = die_object.line_buffer[it->second]; + Dwarf_Error error = DW_DLE_NE; + + char *filename; + if (dwarf_linesrc(line, &filename, &error) == DW_DLV_OK) { + trace.source.filename = std::string(filename); + dwarf_dealloc(fobj.dwarf_handle.get(), filename, DW_DLA_STRING); + } + + Dwarf_Unsigned number = 0; + if (dwarf_lineno(line, &number, &error) == DW_DLV_OK) { + trace.source.line = number; + } else { + trace.source.line = 0; + } + + if (dwarf_lineoff_b(line, &number, &error) == DW_DLV_OK) { + trace.source.col = number; + } else { + trace.source.col = 0; + } + + std::vector namespace_stack; + deep_first_search_by_pc(fobj, die, address, namespace_stack, + inliners_search_cb(trace, fobj, die)); + + dwarf_dealloc(fobj.dwarf_handle.get(), die, DW_DLA_DIE); + + return trace; + } + +public: + static int close_dwarf(Dwarf_Debug dwarf) { + return dwarf_finish(dwarf, NULL); + } + +private: + bool _dwarf_loaded; + + typedef details::handle > + dwarf_file_t; + + typedef details::handle > + dwarf_elf_t; + + typedef details::handle > + dwarf_handle_t; + + typedef std::map die_linemap_t; + + typedef std::map die_specmap_t; + + struct die_cache_entry { + die_specmap_t spec_section; + die_linemap_t line_section; + Dwarf_Line *line_buffer; + Dwarf_Signed line_count; + Dwarf_Line_Context line_context; + + inline bool isEmpty() { + return line_buffer == NULL || line_count == 0 || line_context == NULL || + line_section.empty(); + } + + die_cache_entry() : line_buffer(0), line_count(0), line_context(0) {} + + ~die_cache_entry() { + if (line_context) { + dwarf_srclines_dealloc_b(line_context); + } + } + }; + + typedef std::map die_cache_t; + + typedef std::map symbol_cache_t; + + struct dwarf_fileobject { + dwarf_file_t file_handle; + dwarf_elf_t elf_handle; + dwarf_handle_t dwarf_handle; + symbol_cache_t symbol_cache; + + // Die cache + die_cache_t die_cache; + die_cache_entry *current_cu; + }; + + typedef details::hashtable::type + fobj_dwarf_map_t; + fobj_dwarf_map_t _fobj_dwarf_map; + + static bool cstrings_eq(const char *a, const char *b) { + if (!a || !b) { + return false; + } + return strcmp(a, b) == 0; + } + + dwarf_fileobject &load_object_with_dwarf(const std::string &filename_object) { + + if (!_dwarf_loaded) { + // Set the ELF library operating version + // If that fails there's nothing we can do + _dwarf_loaded = elf_version(EV_CURRENT) != EV_NONE; + } + + fobj_dwarf_map_t::iterator it = _fobj_dwarf_map.find(filename_object); + if (it != _fobj_dwarf_map.end()) { + return it->second; + } + + // this new object is empty for now + dwarf_fileobject &r = _fobj_dwarf_map[filename_object]; + + dwarf_file_t file_handle; + file_handle.reset(open(filename_object.c_str(), O_RDONLY)); + if (file_handle.get() < 0) { + return r; + } + + // Try to get an ELF handle. We need to read the ELF sections + // because we want to see if there is a .gnu_debuglink section + // that points to a split debug file + dwarf_elf_t elf_handle; + elf_handle.reset(elf_begin(file_handle.get(), ELF_C_READ, NULL)); + if (!elf_handle) { + return r; + } + + const char *e_ident = elf_getident(elf_handle.get(), 0); + if (!e_ident) { + return r; + } + + // Get the number of sections + // We use the new APIs as elf_getshnum is deprecated + size_t shdrnum = 0; + if (elf_getshdrnum(elf_handle.get(), &shdrnum) == -1) { + return r; + } + + // Get the index to the string section + size_t shdrstrndx = 0; + if (elf_getshdrstrndx(elf_handle.get(), &shdrstrndx) == -1) { + return r; + } + + std::string debuglink; + // Iterate through the ELF sections to try to get a gnu_debuglink + // note and also to cache the symbol table. + // We go the preprocessor way to avoid having to create templated + // classes or using gelf (which might throw a compiler error if 64 bit + // is not supported +#define ELF_GET_DATA(ARCH) \ + Elf_Scn *elf_section = 0; \ + Elf_Data *elf_data = 0; \ + Elf##ARCH##_Shdr *section_header = 0; \ + Elf_Scn *symbol_section = 0; \ + size_t symbol_count = 0; \ + size_t symbol_strings = 0; \ + Elf##ARCH##_Sym *symbol = 0; \ + const char *section_name = 0; \ + \ + while ((elf_section = elf_nextscn(elf_handle.get(), elf_section)) != NULL) { \ + section_header = elf##ARCH##_getshdr(elf_section); \ + if (section_header == NULL) { \ + return r; \ + } \ + \ + if ((section_name = elf_strptr(elf_handle.get(), shdrstrndx, \ + section_header->sh_name)) == NULL) { \ + return r; \ + } \ + \ + if (cstrings_eq(section_name, ".gnu_debuglink")) { \ + elf_data = elf_getdata(elf_section, NULL); \ + if (elf_data && elf_data->d_size > 0) { \ + debuglink = \ + std::string(reinterpret_cast(elf_data->d_buf)); \ + } \ + } \ + \ + switch (section_header->sh_type) { \ + case SHT_SYMTAB: \ + symbol_section = elf_section; \ + symbol_count = section_header->sh_size / section_header->sh_entsize; \ + symbol_strings = section_header->sh_link; \ + break; \ + \ + /* We use .dynsyms as a last resort, we prefer .symtab */ \ + case SHT_DYNSYM: \ + if (!symbol_section) { \ + symbol_section = elf_section; \ + symbol_count = section_header->sh_size / section_header->sh_entsize; \ + symbol_strings = section_header->sh_link; \ + } \ + break; \ + } \ + } \ + \ + if (symbol_section && symbol_count && symbol_strings) { \ + elf_data = elf_getdata(symbol_section, NULL); \ + symbol = reinterpret_cast(elf_data->d_buf); \ + for (size_t i = 0; i < symbol_count; ++i) { \ + int type = ELF##ARCH##_ST_TYPE(symbol->st_info); \ + if (type == STT_FUNC && symbol->st_value > 0) { \ + r.symbol_cache[symbol->st_value] = std::string( \ + elf_strptr(elf_handle.get(), symbol_strings, symbol->st_name)); \ + } \ + ++symbol; \ + } \ + } + + if (e_ident[EI_CLASS] == ELFCLASS32) { + ELF_GET_DATA(32) + } else if (e_ident[EI_CLASS] == ELFCLASS64) { + // libelf might have been built without 64 bit support +#if __LIBELF64 + ELF_GET_DATA(64) +#endif + } + + if (!debuglink.empty()) { + // We have a debuglink section! Open an elf instance on that + // file instead. If we can't open the file, then return + // the elf handle we had already opened. + dwarf_file_t debuglink_file; + debuglink_file.reset(open(debuglink.c_str(), O_RDONLY)); + if (debuglink_file.get() > 0) { + dwarf_elf_t debuglink_elf; + debuglink_elf.reset(elf_begin(debuglink_file.get(), ELF_C_READ, NULL)); + + // If we have a valid elf handle, return the new elf handle + // and file handle and discard the original ones + if (debuglink_elf) { + elf_handle = move(debuglink_elf); + file_handle = move(debuglink_file); + } + } + } + + // Ok, we have a valid ELF handle, let's try to get debug symbols + Dwarf_Debug dwarf_debug; + Dwarf_Error error = DW_DLE_NE; + dwarf_handle_t dwarf_handle; + + int dwarf_result = dwarf_elf_init(elf_handle.get(), DW_DLC_READ, NULL, NULL, + &dwarf_debug, &error); + + // We don't do any special handling for DW_DLV_NO_ENTRY specially. + // If we get an error, or the file doesn't have debug information + // we just return. + if (dwarf_result != DW_DLV_OK) { + return r; + } + + dwarf_handle.reset(dwarf_debug); + + r.file_handle = move(file_handle); + r.elf_handle = move(elf_handle); + r.dwarf_handle = move(dwarf_handle); + + return r; + } + + die_cache_entry &get_die_cache(dwarf_fileobject &fobj, Dwarf_Die die) { + Dwarf_Error error = DW_DLE_NE; + + // Get the die offset, we use it as the cache key + Dwarf_Off die_offset; + if (dwarf_dieoffset(die, &die_offset, &error) != DW_DLV_OK) { + die_offset = 0; + } + + die_cache_t::iterator it = fobj.die_cache.find(die_offset); + + if (it != fobj.die_cache.end()) { + fobj.current_cu = &it->second; + return it->second; + } + + die_cache_entry &de = fobj.die_cache[die_offset]; + fobj.current_cu = &de; + + Dwarf_Addr line_addr; + Dwarf_Small table_count; + + // The addresses in the line section are not fully sorted (they might + // be sorted by block of code belonging to the same file), which makes + // it necessary to do so before searching is possible. + // + // As libdwarf allocates a copy of everything, let's get the contents + // of the line section and keep it around. We also create a map of + // program counter to line table indices so we can search by address + // and get the line buffer index. + // + // To make things more difficult, the same address can span more than + // one line, so we need to keep the index pointing to the first line + // by using insert instead of the map's [ operator. + + // Get the line context for the DIE + if (dwarf_srclines_b(die, 0, &table_count, &de.line_context, &error) == + DW_DLV_OK) { + // Get the source lines for this line context, to be deallocated + // later + if (dwarf_srclines_from_linecontext(de.line_context, &de.line_buffer, + &de.line_count, + &error) == DW_DLV_OK) { + + // Add all the addresses to our map + for (int i = 0; i < de.line_count; i++) { + if (dwarf_lineaddr(de.line_buffer[i], &line_addr, &error) != + DW_DLV_OK) { + line_addr = 0; + } + de.line_section.insert(std::pair(line_addr, i)); + } + } + } + + // For each CU, cache the function DIEs that contain the + // DW_AT_specification attribute. When building with -g3 the function + // DIEs are separated in declaration and specification, with the + // declaration containing only the name and parameters and the + // specification the low/high pc and other compiler attributes. + // + // We cache those specifications so we don't skip over the declarations, + // because they have no pc, and we can do namespace resolution for + // DWARF function names. + Dwarf_Debug dwarf = fobj.dwarf_handle.get(); + Dwarf_Die current_die = 0; + if (dwarf_child(die, ¤t_die, &error) == DW_DLV_OK) { + for (;;) { + Dwarf_Die sibling_die = 0; + + Dwarf_Half tag_value; + dwarf_tag(current_die, &tag_value, &error); + + if (tag_value == DW_TAG_subprogram || + tag_value == DW_TAG_inlined_subroutine) { + + Dwarf_Bool has_attr = 0; + if (dwarf_hasattr(current_die, DW_AT_specification, &has_attr, + &error) == DW_DLV_OK) { + if (has_attr) { + Dwarf_Attribute attr_mem; + if (dwarf_attr(current_die, DW_AT_specification, &attr_mem, + &error) == DW_DLV_OK) { + Dwarf_Off spec_offset = 0; + if (dwarf_formref(attr_mem, &spec_offset, &error) == + DW_DLV_OK) { + Dwarf_Off spec_die_offset; + if (dwarf_dieoffset(current_die, &spec_die_offset, &error) == + DW_DLV_OK) { + de.spec_section[spec_offset] = spec_die_offset; + } + } + } + dwarf_dealloc(dwarf, attr_mem, DW_DLA_ATTR); + } + } + } + + int result = dwarf_siblingof(dwarf, current_die, &sibling_die, &error); + if (result == DW_DLV_ERROR) { + break; + } else if (result == DW_DLV_NO_ENTRY) { + break; + } + + if (current_die != die) { + dwarf_dealloc(dwarf, current_die, DW_DLA_DIE); + current_die = 0; + } + + current_die = sibling_die; + } + } + return de; + } + + static Dwarf_Die get_referenced_die(Dwarf_Debug dwarf, Dwarf_Die die, + Dwarf_Half attr, bool global) { + Dwarf_Error error = DW_DLE_NE; + Dwarf_Attribute attr_mem; + + Dwarf_Die found_die = NULL; + if (dwarf_attr(die, attr, &attr_mem, &error) == DW_DLV_OK) { + Dwarf_Off offset; + int result = 0; + if (global) { + result = dwarf_global_formref(attr_mem, &offset, &error); + } else { + result = dwarf_formref(attr_mem, &offset, &error); + } + + if (result == DW_DLV_OK) { + if (dwarf_offdie(dwarf, offset, &found_die, &error) != DW_DLV_OK) { + found_die = NULL; + } + } + dwarf_dealloc(dwarf, attr_mem, DW_DLA_ATTR); + } + return found_die; + } + + static std::string get_referenced_die_name(Dwarf_Debug dwarf, Dwarf_Die die, + Dwarf_Half attr, bool global) { + Dwarf_Error error = DW_DLE_NE; + std::string value; + + Dwarf_Die found_die = get_referenced_die(dwarf, die, attr, global); + + if (found_die) { + char *name; + if (dwarf_diename(found_die, &name, &error) == DW_DLV_OK) { + if (name) { + value = std::string(name); + } + dwarf_dealloc(dwarf, name, DW_DLA_STRING); + } + dwarf_dealloc(dwarf, found_die, DW_DLA_DIE); + } + + return value; + } + + // Returns a spec DIE linked to the passed one. The caller should + // deallocate the DIE + static Dwarf_Die get_spec_die(dwarf_fileobject &fobj, Dwarf_Die die) { + Dwarf_Debug dwarf = fobj.dwarf_handle.get(); + Dwarf_Error error = DW_DLE_NE; + Dwarf_Off die_offset; + if (fobj.current_cu && + dwarf_die_CU_offset(die, &die_offset, &error) == DW_DLV_OK) { + die_specmap_t::iterator it = + fobj.current_cu->spec_section.find(die_offset); + + // If we have a DIE that completes the current one, check if + // that one has the pc we are looking for + if (it != fobj.current_cu->spec_section.end()) { + Dwarf_Die spec_die = 0; + if (dwarf_offdie(dwarf, it->second, &spec_die, &error) == DW_DLV_OK) { + return spec_die; + } + } + } + + // Maybe we have an abstract origin DIE with the function information? + return get_referenced_die(fobj.dwarf_handle.get(), die, + DW_AT_abstract_origin, true); + } + + static bool die_has_pc(dwarf_fileobject &fobj, Dwarf_Die die, Dwarf_Addr pc) { + Dwarf_Addr low_pc = 0, high_pc = 0; + Dwarf_Half high_pc_form = 0; + Dwarf_Form_Class return_class; + Dwarf_Error error = DW_DLE_NE; + Dwarf_Debug dwarf = fobj.dwarf_handle.get(); + bool has_lowpc = false; + bool has_highpc = false; + bool has_ranges = false; + + if (dwarf_lowpc(die, &low_pc, &error) == DW_DLV_OK) { + // If we have a low_pc check if there is a high pc. + // If we don't have a high pc this might mean we have a base + // address for the ranges list or just an address. + has_lowpc = true; + + if (dwarf_highpc_b(die, &high_pc, &high_pc_form, &return_class, &error) == + DW_DLV_OK) { + // We do have a high pc. In DWARF 4+ this is an offset from the + // low pc, but in earlier versions it's an absolute address. + + has_highpc = true; + // In DWARF 2/3 this would be a DW_FORM_CLASS_ADDRESS + if (return_class == DW_FORM_CLASS_CONSTANT) { + high_pc = low_pc + high_pc; + } + + // We have low and high pc, check if our address + // is in that range + return pc >= low_pc && pc < high_pc; + } + } else { + // Reset the low_pc, in case dwarf_lowpc failing set it to some + // undefined value. + low_pc = 0; + } + + // Check if DW_AT_ranges is present and search for the PC in the + // returned ranges list. We always add the low_pc, as it not set it will + // be 0, in case we had a DW_AT_low_pc and DW_AT_ranges pair + bool result = false; + + Dwarf_Attribute attr; + if (dwarf_attr(die, DW_AT_ranges, &attr, &error) == DW_DLV_OK) { + + Dwarf_Off offset; + if (dwarf_global_formref(attr, &offset, &error) == DW_DLV_OK) { + Dwarf_Ranges *ranges; + Dwarf_Signed ranges_count = 0; + Dwarf_Unsigned byte_count = 0; + + if (dwarf_get_ranges_a(dwarf, offset, die, &ranges, &ranges_count, + &byte_count, &error) == DW_DLV_OK) { + has_ranges = ranges_count != 0; + for (int i = 0; i < ranges_count; i++) { + if (ranges[i].dwr_addr1 != 0 && + pc >= ranges[i].dwr_addr1 + low_pc && + pc < ranges[i].dwr_addr2 + low_pc) { + result = true; + break; + } + } + dwarf_ranges_dealloc(dwarf, ranges, ranges_count); + } + } + } + + // Last attempt. We might have a single address set as low_pc. + if (!result && low_pc != 0 && pc == low_pc) { + result = true; + } + + // If we don't have lowpc, highpc and ranges maybe this DIE is a + // declaration that relies on a DW_AT_specification DIE that happens + // later. Use the specification cache we filled when we loaded this CU. + if (!result && (!has_lowpc && !has_highpc && !has_ranges)) { + Dwarf_Die spec_die = get_spec_die(fobj, die); + if (spec_die) { + result = die_has_pc(fobj, spec_die, pc); + dwarf_dealloc(dwarf, spec_die, DW_DLA_DIE); + } + } + + return result; + } + + static void get_type(Dwarf_Debug dwarf, Dwarf_Die die, std::string &type) { + Dwarf_Error error = DW_DLE_NE; + + Dwarf_Die child = 0; + if (dwarf_child(die, &child, &error) == DW_DLV_OK) { + get_type(dwarf, child, type); + } + + if (child) { + type.insert(0, "::"); + dwarf_dealloc(dwarf, child, DW_DLA_DIE); + } + + char *name; + if (dwarf_diename(die, &name, &error) == DW_DLV_OK) { + type.insert(0, std::string(name)); + dwarf_dealloc(dwarf, name, DW_DLA_STRING); + } else { + type.insert(0, ""); + } + } + + static std::string get_type_by_signature(Dwarf_Debug dwarf, Dwarf_Die die) { + Dwarf_Error error = DW_DLE_NE; + + Dwarf_Sig8 signature; + Dwarf_Bool has_attr = 0; + if (dwarf_hasattr(die, DW_AT_signature, &has_attr, &error) == DW_DLV_OK) { + if (has_attr) { + Dwarf_Attribute attr_mem; + if (dwarf_attr(die, DW_AT_signature, &attr_mem, &error) == DW_DLV_OK) { + if (dwarf_formsig8(attr_mem, &signature, &error) != DW_DLV_OK) { + return std::string(""); + } + } + dwarf_dealloc(dwarf, attr_mem, DW_DLA_ATTR); + } + } + + Dwarf_Unsigned next_cu_header; + Dwarf_Sig8 tu_signature; + std::string result; + bool found = false; + + while (dwarf_next_cu_header_d(dwarf, 0, 0, 0, 0, 0, 0, 0, &tu_signature, 0, + &next_cu_header, 0, &error) == DW_DLV_OK) { + + if (strncmp(signature.signature, tu_signature.signature, 8) == 0) { + Dwarf_Die type_cu_die = 0; + if (dwarf_siblingof_b(dwarf, 0, 0, &type_cu_die, &error) == DW_DLV_OK) { + Dwarf_Die child_die = 0; + if (dwarf_child(type_cu_die, &child_die, &error) == DW_DLV_OK) { + get_type(dwarf, child_die, result); + found = !result.empty(); + dwarf_dealloc(dwarf, child_die, DW_DLA_DIE); + } + dwarf_dealloc(dwarf, type_cu_die, DW_DLA_DIE); + } + } + } + + if (found) { + while (dwarf_next_cu_header_d(dwarf, 0, 0, 0, 0, 0, 0, 0, 0, 0, + &next_cu_header, 0, &error) == DW_DLV_OK) { + // Reset the cu header state. Unfortunately, libdwarf's + // next_cu_header API keeps its own iterator per Dwarf_Debug + // that can't be reset. We need to keep fetching elements until + // the end. + } + } else { + // If we couldn't resolve the type just print out the signature + std::ostringstream string_stream; + string_stream << "<0x" << std::hex << std::setfill('0'); + for (int i = 0; i < 8; ++i) { + string_stream << std::setw(2) << std::hex + << (int)(unsigned char)(signature.signature[i]); + } + string_stream << ">"; + result = string_stream.str(); + } + return result; + } + + struct type_context_t { + bool is_const; + bool is_typedef; + bool has_type; + bool has_name; + std::string text; + + type_context_t() + : is_const(false), is_typedef(false), has_type(false), has_name(false) { + } + }; + + // Types are resolved from right to left: we get the variable name first + // and then all specifiers (like const or pointer) in a chain of DW_AT_type + // DIEs. Call this function recursively until we get a complete type + // string. + static void set_parameter_string(dwarf_fileobject &fobj, Dwarf_Die die, + type_context_t &context) { + char *name; + Dwarf_Error error = DW_DLE_NE; + + // typedefs contain also the base type, so we skip it and only + // print the typedef name + if (!context.is_typedef) { + if (dwarf_diename(die, &name, &error) == DW_DLV_OK) { + if (!context.text.empty()) { + context.text.insert(0, " "); + } + context.text.insert(0, std::string(name)); + dwarf_dealloc(fobj.dwarf_handle.get(), name, DW_DLA_STRING); + } + } else { + context.is_typedef = false; + context.has_type = true; + if (context.is_const) { + context.text.insert(0, "const "); + context.is_const = false; + } + } + + bool next_type_is_const = false; + bool is_keyword = true; + + Dwarf_Half tag = 0; + Dwarf_Bool has_attr = 0; + if (dwarf_tag(die, &tag, &error) == DW_DLV_OK) { + switch (tag) { + case DW_TAG_structure_type: + case DW_TAG_union_type: + case DW_TAG_class_type: + case DW_TAG_enumeration_type: + context.has_type = true; + if (dwarf_hasattr(die, DW_AT_signature, &has_attr, &error) == + DW_DLV_OK) { + // If we have a signature it means the type is defined + // in .debug_types, so we need to load the DIE pointed + // at by the signature and resolve it + if (has_attr) { + std::string type = + get_type_by_signature(fobj.dwarf_handle.get(), die); + if (context.is_const) + type.insert(0, "const "); + + if (!context.text.empty()) + context.text.insert(0, " "); + context.text.insert(0, type); + } + + // Treat enums like typedefs, and skip printing its + // base type + context.is_typedef = (tag == DW_TAG_enumeration_type); + } + break; + case DW_TAG_const_type: + next_type_is_const = true; + break; + case DW_TAG_pointer_type: + context.text.insert(0, "*"); + break; + case DW_TAG_reference_type: + context.text.insert(0, "&"); + break; + case DW_TAG_restrict_type: + context.text.insert(0, "restrict "); + break; + case DW_TAG_rvalue_reference_type: + context.text.insert(0, "&&"); + break; + case DW_TAG_volatile_type: + context.text.insert(0, "volatile "); + break; + case DW_TAG_typedef: + // Propagate the const-ness to the next type + // as typedefs are linked to its base type + next_type_is_const = context.is_const; + context.is_typedef = true; + context.has_type = true; + break; + case DW_TAG_base_type: + context.has_type = true; + break; + case DW_TAG_formal_parameter: + context.has_name = true; + break; + default: + is_keyword = false; + break; + } + } + + if (!is_keyword && context.is_const) { + context.text.insert(0, "const "); + } + + context.is_const = next_type_is_const; + + Dwarf_Die ref = + get_referenced_die(fobj.dwarf_handle.get(), die, DW_AT_type, true); + if (ref) { + set_parameter_string(fobj, ref, context); + dwarf_dealloc(fobj.dwarf_handle.get(), ref, DW_DLA_DIE); + } + + if (!context.has_type && context.has_name) { + context.text.insert(0, "void "); + context.has_type = true; + } + } + + // Resolve the function return type and parameters + static void set_function_parameters(std::string &function_name, + std::vector &ns, + dwarf_fileobject &fobj, Dwarf_Die die) { + Dwarf_Debug dwarf = fobj.dwarf_handle.get(); + Dwarf_Error error = DW_DLE_NE; + Dwarf_Die current_die = 0; + std::string parameters; + bool has_spec = true; + // Check if we have a spec DIE. If we do we use it as it contains + // more information, like parameter names. + Dwarf_Die spec_die = get_spec_die(fobj, die); + if (!spec_die) { + has_spec = false; + spec_die = die; + } + + std::vector::const_iterator it = ns.begin(); + std::string ns_name; + for (it = ns.begin(); it < ns.end(); ++it) { + ns_name.append(*it).append("::"); + } + + if (!ns_name.empty()) { + function_name.insert(0, ns_name); + } + + // See if we have a function return type. It can be either on the + // current die or in its spec one (usually true for inlined functions) + std::string return_type = + get_referenced_die_name(dwarf, die, DW_AT_type, true); + if (return_type.empty()) { + return_type = get_referenced_die_name(dwarf, spec_die, DW_AT_type, true); + } + if (!return_type.empty()) { + return_type.append(" "); + function_name.insert(0, return_type); + } + + if (dwarf_child(spec_die, ¤t_die, &error) == DW_DLV_OK) { + for (;;) { + Dwarf_Die sibling_die = 0; + + Dwarf_Half tag_value; + dwarf_tag(current_die, &tag_value, &error); + + if (tag_value == DW_TAG_formal_parameter) { + // Ignore artificial (ie, compiler generated) parameters + bool is_artificial = false; + Dwarf_Attribute attr_mem; + if (dwarf_attr(current_die, DW_AT_artificial, &attr_mem, &error) == + DW_DLV_OK) { + Dwarf_Bool flag = 0; + if (dwarf_formflag(attr_mem, &flag, &error) == DW_DLV_OK) { + is_artificial = flag != 0; + } + dwarf_dealloc(dwarf, attr_mem, DW_DLA_ATTR); + } + + if (!is_artificial) { + type_context_t context; + set_parameter_string(fobj, current_die, context); + + if (parameters.empty()) { + parameters.append("("); + } else { + parameters.append(", "); + } + parameters.append(context.text); + } + } + + int result = dwarf_siblingof(dwarf, current_die, &sibling_die, &error); + if (result == DW_DLV_ERROR) { + break; + } else if (result == DW_DLV_NO_ENTRY) { + break; + } + + if (current_die != die) { + dwarf_dealloc(dwarf, current_die, DW_DLA_DIE); + current_die = 0; + } + + current_die = sibling_die; + } + } + if (parameters.empty()) + parameters = "("; + parameters.append(")"); + + // If we got a spec DIE we need to deallocate it + if (has_spec) + dwarf_dealloc(dwarf, spec_die, DW_DLA_DIE); + + function_name.append(parameters); + } + + // defined here because in C++98, template function cannot take locally + // defined types... grrr. + struct inliners_search_cb { + void operator()(Dwarf_Die die, std::vector &ns) { + Dwarf_Error error = DW_DLE_NE; + Dwarf_Half tag_value; + Dwarf_Attribute attr_mem; + Dwarf_Debug dwarf = fobj.dwarf_handle.get(); + + dwarf_tag(die, &tag_value, &error); + + switch (tag_value) { + char *name; + case DW_TAG_subprogram: + if (!trace.source.function.empty()) + break; + if (dwarf_diename(die, &name, &error) == DW_DLV_OK) { + trace.source.function = std::string(name); + dwarf_dealloc(dwarf, name, DW_DLA_STRING); + } else { + // We don't have a function name in this DIE. + // Check if there is a referenced non-defining + // declaration. + trace.source.function = + get_referenced_die_name(dwarf, die, DW_AT_abstract_origin, true); + if (trace.source.function.empty()) { + trace.source.function = + get_referenced_die_name(dwarf, die, DW_AT_specification, true); + } + } + + // Append the function parameters, if available + set_function_parameters(trace.source.function, ns, fobj, die); + + // If the object function name is empty, it's possible that + // there is no dynamic symbol table (maybe the executable + // was stripped or not built with -rdynamic). See if we have + // a DWARF linkage name to use instead. We try both + // linkage_name and MIPS_linkage_name because the MIPS tag + // was the unofficial one until it was adopted in DWARF4. + // Old gcc versions generate MIPS_linkage_name + if (trace.object_function.empty()) { + details::demangler demangler; + + if (dwarf_attr(die, DW_AT_linkage_name, &attr_mem, &error) != + DW_DLV_OK) { + if (dwarf_attr(die, DW_AT_MIPS_linkage_name, &attr_mem, &error) != + DW_DLV_OK) { + break; + } + } + + char *linkage; + if (dwarf_formstring(attr_mem, &linkage, &error) == DW_DLV_OK) { + trace.object_function = demangler.demangle(linkage); + dwarf_dealloc(dwarf, linkage, DW_DLA_STRING); + } + dwarf_dealloc(dwarf, attr_mem, DW_DLA_ATTR); + } + break; + + case DW_TAG_inlined_subroutine: + ResolvedTrace::SourceLoc sloc; + + if (dwarf_diename(die, &name, &error) == DW_DLV_OK) { + sloc.function = std::string(name); + dwarf_dealloc(dwarf, name, DW_DLA_STRING); + } else { + // We don't have a name for this inlined DIE, it could + // be that there is an abstract origin instead. + // Get the DW_AT_abstract_origin value, which is a + // reference to the source DIE and try to get its name + sloc.function = + get_referenced_die_name(dwarf, die, DW_AT_abstract_origin, true); + } + + set_function_parameters(sloc.function, ns, fobj, die); + + std::string file = die_call_file(dwarf, die, cu_die); + if (!file.empty()) + sloc.filename = file; + + Dwarf_Unsigned number = 0; + if (dwarf_attr(die, DW_AT_call_line, &attr_mem, &error) == DW_DLV_OK) { + if (dwarf_formudata(attr_mem, &number, &error) == DW_DLV_OK) { + sloc.line = number; + } + dwarf_dealloc(dwarf, attr_mem, DW_DLA_ATTR); + } + + if (dwarf_attr(die, DW_AT_call_column, &attr_mem, &error) == + DW_DLV_OK) { + if (dwarf_formudata(attr_mem, &number, &error) == DW_DLV_OK) { + sloc.col = number; + } + dwarf_dealloc(dwarf, attr_mem, DW_DLA_ATTR); + } + + trace.inliners.push_back(sloc); + break; + }; + } + ResolvedTrace &trace; + dwarf_fileobject &fobj; + Dwarf_Die cu_die; + inliners_search_cb(ResolvedTrace &t, dwarf_fileobject &f, Dwarf_Die c) + : trace(t), fobj(f), cu_die(c) {} + }; + + static Dwarf_Die find_fundie_by_pc(dwarf_fileobject &fobj, + Dwarf_Die parent_die, Dwarf_Addr pc, + Dwarf_Die result) { + Dwarf_Die current_die = 0; + Dwarf_Error error = DW_DLE_NE; + Dwarf_Debug dwarf = fobj.dwarf_handle.get(); + + if (dwarf_child(parent_die, ¤t_die, &error) != DW_DLV_OK) { + return NULL; + } + + for (;;) { + Dwarf_Die sibling_die = 0; + Dwarf_Half tag_value; + dwarf_tag(current_die, &tag_value, &error); + + switch (tag_value) { + case DW_TAG_subprogram: + case DW_TAG_inlined_subroutine: + if (die_has_pc(fobj, current_die, pc)) { + return current_die; + } + }; + bool declaration = false; + Dwarf_Attribute attr_mem; + if (dwarf_attr(current_die, DW_AT_declaration, &attr_mem, &error) == + DW_DLV_OK) { + Dwarf_Bool flag = 0; + if (dwarf_formflag(attr_mem, &flag, &error) == DW_DLV_OK) { + declaration = flag != 0; + } + dwarf_dealloc(dwarf, attr_mem, DW_DLA_ATTR); + } + + if (!declaration) { + // let's be curious and look deeper in the tree, functions are + // not necessarily at the first level, but might be nested + // inside a namespace, structure, a function, an inlined + // function etc. + Dwarf_Die die_mem = 0; + Dwarf_Die indie = find_fundie_by_pc(fobj, current_die, pc, die_mem); + if (indie) { + result = die_mem; + return result; + } + } + + int res = dwarf_siblingof(dwarf, current_die, &sibling_die, &error); + if (res == DW_DLV_ERROR) { + return NULL; + } else if (res == DW_DLV_NO_ENTRY) { + break; + } + + if (current_die != parent_die) { + dwarf_dealloc(dwarf, current_die, DW_DLA_DIE); + current_die = 0; + } + + current_die = sibling_die; + } + return NULL; + } + + template + static bool deep_first_search_by_pc(dwarf_fileobject &fobj, + Dwarf_Die parent_die, Dwarf_Addr pc, + std::vector &ns, CB cb) { + Dwarf_Die current_die = 0; + Dwarf_Debug dwarf = fobj.dwarf_handle.get(); + Dwarf_Error error = DW_DLE_NE; + + if (dwarf_child(parent_die, ¤t_die, &error) != DW_DLV_OK) { + return false; + } + + bool branch_has_pc = false; + bool has_namespace = false; + for (;;) { + Dwarf_Die sibling_die = 0; + + Dwarf_Half tag; + if (dwarf_tag(current_die, &tag, &error) == DW_DLV_OK) { + if (tag == DW_TAG_namespace || tag == DW_TAG_class_type) { + char *ns_name = NULL; + if (dwarf_diename(current_die, &ns_name, &error) == DW_DLV_OK) { + if (ns_name) { + ns.push_back(std::string(ns_name)); + } else { + ns.push_back(""); + } + dwarf_dealloc(dwarf, ns_name, DW_DLA_STRING); + } else { + ns.push_back(""); + } + has_namespace = true; + } + } + + bool declaration = false; + Dwarf_Attribute attr_mem; + if (tag != DW_TAG_class_type && + dwarf_attr(current_die, DW_AT_declaration, &attr_mem, &error) == + DW_DLV_OK) { + Dwarf_Bool flag = 0; + if (dwarf_formflag(attr_mem, &flag, &error) == DW_DLV_OK) { + declaration = flag != 0; + } + dwarf_dealloc(dwarf, attr_mem, DW_DLA_ATTR); + } + + if (!declaration) { + // let's be curious and look deeper in the tree, function are + // not necessarily at the first level, but might be nested + // inside a namespace, structure, a function, an inlined + // function etc. + branch_has_pc = deep_first_search_by_pc(fobj, current_die, pc, ns, cb); + } + + if (!branch_has_pc) { + branch_has_pc = die_has_pc(fobj, current_die, pc); + } + + if (branch_has_pc) { + cb(current_die, ns); + } + + int result = dwarf_siblingof(dwarf, current_die, &sibling_die, &error); + if (result == DW_DLV_ERROR) { + return false; + } else if (result == DW_DLV_NO_ENTRY) { + break; + } + + if (current_die != parent_die) { + dwarf_dealloc(dwarf, current_die, DW_DLA_DIE); + current_die = 0; + } + + if (has_namespace) { + has_namespace = false; + ns.pop_back(); + } + current_die = sibling_die; + } + + if (has_namespace) { + ns.pop_back(); + } + return branch_has_pc; + } + + static std::string die_call_file(Dwarf_Debug dwarf, Dwarf_Die die, + Dwarf_Die cu_die) { + Dwarf_Attribute attr_mem; + Dwarf_Error error = DW_DLE_NE; + Dwarf_Unsigned file_index; + + std::string file; + + if (dwarf_attr(die, DW_AT_call_file, &attr_mem, &error) == DW_DLV_OK) { + if (dwarf_formudata(attr_mem, &file_index, &error) != DW_DLV_OK) { + file_index = 0; + } + dwarf_dealloc(dwarf, attr_mem, DW_DLA_ATTR); + + if (file_index == 0) { + return file; + } + + char **srcfiles = 0; + Dwarf_Signed file_count = 0; + if (dwarf_srcfiles(cu_die, &srcfiles, &file_count, &error) == DW_DLV_OK) { + if (file_count > 0 && file_index <= static_cast(file_count)) { + file = std::string(srcfiles[file_index - 1]); + } + + // Deallocate all strings! + for (int i = 0; i < file_count; ++i) { + dwarf_dealloc(dwarf, srcfiles[i], DW_DLA_STRING); + } + dwarf_dealloc(dwarf, srcfiles, DW_DLA_LIST); + } + } + return file; + } + + Dwarf_Die find_die(dwarf_fileobject &fobj, Dwarf_Addr addr) { + // Let's get to work! First see if we have a debug_aranges section so + // we can speed up the search + + Dwarf_Debug dwarf = fobj.dwarf_handle.get(); + Dwarf_Error error = DW_DLE_NE; + Dwarf_Arange *aranges; + Dwarf_Signed arange_count; + + Dwarf_Die returnDie; + bool found = false; + if (dwarf_get_aranges(dwarf, &aranges, &arange_count, &error) != + DW_DLV_OK) { + aranges = NULL; + } + + if (aranges) { + // We have aranges. Get the one where our address is. + Dwarf_Arange arange; + if (dwarf_get_arange(aranges, arange_count, addr, &arange, &error) == + DW_DLV_OK) { + + // We found our address. Get the compilation-unit DIE offset + // represented by the given address range. + Dwarf_Off cu_die_offset; + if (dwarf_get_cu_die_offset(arange, &cu_die_offset, &error) == + DW_DLV_OK) { + // Get the DIE at the offset returned by the aranges search. + // We set is_info to 1 to specify that the offset is from + // the .debug_info section (and not .debug_types) + int dwarf_result = + dwarf_offdie_b(dwarf, cu_die_offset, 1, &returnDie, &error); + + found = dwarf_result == DW_DLV_OK; + } + dwarf_dealloc(dwarf, arange, DW_DLA_ARANGE); + } + } + + if (found) + return returnDie; // The caller is responsible for freeing the die + + // The search for aranges failed. Try to find our address by scanning + // all compilation units. + Dwarf_Unsigned next_cu_header; + Dwarf_Half tag = 0; + returnDie = 0; + + while (!found && + dwarf_next_cu_header_d(dwarf, 1, 0, 0, 0, 0, 0, 0, 0, 0, + &next_cu_header, 0, &error) == DW_DLV_OK) { + + if (returnDie) + dwarf_dealloc(dwarf, returnDie, DW_DLA_DIE); + + if (dwarf_siblingof(dwarf, 0, &returnDie, &error) == DW_DLV_OK) { + if ((dwarf_tag(returnDie, &tag, &error) == DW_DLV_OK) && + tag == DW_TAG_compile_unit) { + if (die_has_pc(fobj, returnDie, addr)) { + found = true; + } + } + } + } + + if (found) { + while (dwarf_next_cu_header_d(dwarf, 1, 0, 0, 0, 0, 0, 0, 0, 0, + &next_cu_header, 0, &error) == DW_DLV_OK) { + // Reset the cu header state. Libdwarf's next_cu_header API + // keeps its own iterator per Dwarf_Debug that can't be reset. + // We need to keep fetching elements until the end. + } + } + + if (found) + return returnDie; + + // We couldn't find any compilation units with ranges or a high/low pc. + // Try again by looking at all DIEs in all compilation units. + Dwarf_Die cudie; + while (dwarf_next_cu_header_d(dwarf, 1, 0, 0, 0, 0, 0, 0, 0, 0, + &next_cu_header, 0, &error) == DW_DLV_OK) { + if (dwarf_siblingof(dwarf, 0, &cudie, &error) == DW_DLV_OK) { + Dwarf_Die die_mem = 0; + Dwarf_Die resultDie = find_fundie_by_pc(fobj, cudie, addr, die_mem); + + if (resultDie) { + found = true; + break; + } + } + } + + if (found) { + while (dwarf_next_cu_header_d(dwarf, 1, 0, 0, 0, 0, 0, 0, 0, 0, + &next_cu_header, 0, &error) == DW_DLV_OK) { + // Reset the cu header state. Libdwarf's next_cu_header API + // keeps its own iterator per Dwarf_Debug that can't be reset. + // We need to keep fetching elements until the end. + } + } + + if (found) + return cudie; + + // We failed. + return NULL; + } +}; +#endif // BACKWARD_HAS_DWARF == 1 + +template <> +class TraceResolverImpl + : public TraceResolverLinuxImpl {}; + +#endif // BACKWARD_SYSTEM_LINUX + +#ifdef BACKWARD_SYSTEM_DARWIN + +template class TraceResolverDarwinImpl; + +template <> +class TraceResolverDarwinImpl + : public TraceResolverImplBase { +public: + void load_addresses(void *const*addresses, int address_count) override { + if (address_count == 0) { + return; + } + _symbols.reset(backtrace_symbols(addresses, address_count)); + } + + ResolvedTrace resolve(ResolvedTrace trace) override { + // parse: + // + + char *filename = _symbols[trace.idx]; + + // skip " " + while (*filename && *filename != ' ') + filename++; + while (*filename == ' ') + filename++; + + // find start of from end ( may contain a space) + char *p = filename + strlen(filename) - 1; + // skip to start of " + " + while (p > filename && *p != ' ') + p--; + while (p > filename && *p == ' ') + p--; + while (p > filename && *p != ' ') + p--; + while (p > filename && *p == ' ') + p--; + char *funcname_end = p + 1; + + // skip to start of "" + while (p > filename && *p != ' ') + p--; + char *funcname = p + 1; + + // skip to start of " " + while (p > filename && *p == ' ') + p--; + while (p > filename && *p != ' ') + p--; + while (p > filename && *p == ' ') + p--; + + // skip "", handling the case where it contains a + char *filename_end = p + 1; + if (p == filename) { + // something went wrong, give up + filename_end = filename + strlen(filename); + funcname = filename_end; + } + trace.object_filename.assign( + filename, filename_end); // ok even if filename_end is the ending \0 + // (then we assign entire string) + + if (*funcname) { // if it's not end of string + *funcname_end = '\0'; + + trace.object_function = this->demangle(funcname); + trace.object_function += " "; + trace.object_function += (funcname_end + 1); + trace.source.function = trace.object_function; // we cannot do better. + } + return trace; + } + +private: + details::handle _symbols; +}; + +template <> +class TraceResolverImpl + : public TraceResolverDarwinImpl {}; + +#endif // BACKWARD_SYSTEM_DARWIN + +#ifdef BACKWARD_SYSTEM_WINDOWS + +// Load all symbol info +// Based on: +// https://stackoverflow.com/questions/6205981/windows-c-stack-trace-from-a-running-app/28276227#28276227 + +struct module_data { + std::string image_name; + std::string module_name; + void *base_address; + DWORD load_size; +}; + +class get_mod_info { + HANDLE process; + static const int buffer_length = 4096; + +public: + get_mod_info(HANDLE h) : process(h) {} + + module_data operator()(HMODULE module) { + module_data ret; + char temp[buffer_length]; + MODULEINFO mi; + + GetModuleInformation(process, module, &mi, sizeof(mi)); + ret.base_address = mi.lpBaseOfDll; + ret.load_size = mi.SizeOfImage; + + GetModuleFileNameExA(process, module, temp, sizeof(temp)); + ret.image_name = temp; + GetModuleBaseNameA(process, module, temp, sizeof(temp)); + ret.module_name = temp; + std::vector img(ret.image_name.begin(), ret.image_name.end()); + std::vector mod(ret.module_name.begin(), ret.module_name.end()); + SymLoadModule64(process, 0, &img[0], &mod[0], (DWORD64)ret.base_address, + ret.load_size); + return ret; + } +}; + +template <> class TraceResolverImpl + : public TraceResolverImplBase { +public: + TraceResolverImpl() { + + HANDLE process = GetCurrentProcess(); + + std::vector modules; + DWORD cbNeeded; + std::vector module_handles(1); + SymInitialize(process, NULL, false); + DWORD symOptions = SymGetOptions(); + symOptions |= SYMOPT_LOAD_LINES | SYMOPT_UNDNAME; + SymSetOptions(symOptions); + EnumProcessModules(process, &module_handles[0], + module_handles.size() * sizeof(HMODULE), &cbNeeded); + module_handles.resize(cbNeeded / sizeof(HMODULE)); + EnumProcessModules(process, &module_handles[0], + module_handles.size() * sizeof(HMODULE), &cbNeeded); + std::transform(module_handles.begin(), module_handles.end(), + std::back_inserter(modules), get_mod_info(process)); + void *base = modules[0].base_address; + IMAGE_NT_HEADERS *h = ImageNtHeader(base); + image_type = h->FileHeader.Machine; + } + + static const int max_sym_len = 255; + struct symbol_t { + SYMBOL_INFO sym; + char buffer[max_sym_len]; + } sym; + + DWORD64 displacement; + + ResolvedTrace resolve(ResolvedTrace t) override { + HANDLE process = GetCurrentProcess(); + + char name[256]; + + memset(&sym, 0, sizeof(sym)); + sym.sym.SizeOfStruct = sizeof(SYMBOL_INFO); + sym.sym.MaxNameLen = max_sym_len; + + if (!SymFromAddr(process, (ULONG64)t.addr, &displacement, &sym.sym)) { + // TODO: error handling everywhere + char* lpMsgBuf; + DWORD dw = GetLastError(); + + if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (char*)&lpMsgBuf, 0, NULL)) { + std::fprintf(stderr, "%s\n", lpMsgBuf); + LocalFree(lpMsgBuf); + } + + // abort(); + } + UnDecorateSymbolName(sym.sym.Name, (PSTR)name, 256, UNDNAME_COMPLETE); + + DWORD offset = 0; + IMAGEHLP_LINE line; + if (SymGetLineFromAddr(process, (ULONG64)t.addr, &offset, &line)) { + t.object_filename = line.FileName; + t.source.filename = line.FileName; + t.source.line = line.LineNumber; + t.source.col = offset; + } + + t.source.function = name; + t.object_filename = ""; + t.object_function = name; + + return t; + } + + DWORD machine_type() const { return image_type; } + +private: + DWORD image_type; +}; + +#endif + +class TraceResolver : public TraceResolverImpl {}; + +/*************** CODE SNIPPET ***************/ + +class SourceFile { +public: + typedef std::vector > lines_t; + + SourceFile() {} + SourceFile(const std::string &path) { + // 1. If BACKWARD_CXX_SOURCE_PREFIXES is set then assume it contains + // a colon-separated list of path prefixes. Try prepending each + // to the given path until a valid file is found. + const std::vector &prefixes = get_paths_from_env_variable(); + for (size_t i = 0; i < prefixes.size(); ++i) { + // Double slashes (//) should not be a problem. + std::string new_path = prefixes[i] + '/' + path; + _file.reset(new std::ifstream(new_path.c_str())); + if (is_open()) + break; + } + // 2. If no valid file found then fallback to opening the path as-is. + if (!_file || !is_open()) { + _file.reset(new std::ifstream(path.c_str())); + } + } + bool is_open() const { return _file->is_open(); } + + lines_t &get_lines(unsigned line_start, unsigned line_count, lines_t &lines) { + using namespace std; + // This function make uses of the dumbest algo ever: + // 1) seek(0) + // 2) read lines one by one and discard until line_start + // 3) read line one by one until line_start + line_count + // + // If you are getting snippets many time from the same file, it is + // somewhat a waste of CPU, feel free to benchmark and propose a + // better solution ;) + + _file->clear(); + _file->seekg(0); + string line; + unsigned line_idx; + + for (line_idx = 1; line_idx < line_start; ++line_idx) { + std::getline(*_file, line); + if (!*_file) { + return lines; + } + } + + // think of it like a lambda in C++98 ;) + // but look, I will reuse it two times! + // What a good boy am I. + struct isspace { + bool operator()(char c) { return std::isspace(c); } + }; + + bool started = false; + for (; line_idx < line_start + line_count; ++line_idx) { + getline(*_file, line); + if (!*_file) { + return lines; + } + if (!started) { + if (std::find_if(line.begin(), line.end(), not_isspace()) == line.end()) + continue; + started = true; + } + lines.push_back(make_pair(line_idx, line)); + } + + lines.erase( + std::find_if(lines.rbegin(), lines.rend(), not_isempty()).base(), + lines.end()); + return lines; + } + + lines_t get_lines(unsigned line_start, unsigned line_count) { + lines_t lines; + return get_lines(line_start, line_count, lines); + } + + // there is no find_if_not in C++98, lets do something crappy to + // workaround. + struct not_isspace { + bool operator()(char c) { return !std::isspace(c); } + }; + // and define this one here because C++98 is not happy with local defined + // struct passed to template functions, fuuuu. + struct not_isempty { + bool operator()(const lines_t::value_type &p) { + return !(std::find_if(p.second.begin(), p.second.end(), not_isspace()) == + p.second.end()); + } + }; + + void swap(SourceFile &b) { _file.swap(b._file); } + +#ifdef BACKWARD_ATLEAST_CXX11 + SourceFile(SourceFile &&from) : _file(nullptr) { swap(from); } + SourceFile &operator=(SourceFile &&from) { + swap(from); + return *this; + } +#else + explicit SourceFile(const SourceFile &from) { + // some sort of poor man's move semantic. + swap(const_cast(from)); + } + SourceFile &operator=(const SourceFile &from) { + // some sort of poor man's move semantic. + swap(const_cast(from)); + return *this; + } +#endif + +private: + details::handle > + _file; + + std::vector get_paths_from_env_variable_impl() { + std::vector paths; + const char *prefixes_str = std::getenv("BACKWARD_CXX_SOURCE_PREFIXES"); + if (prefixes_str && prefixes_str[0]) { + paths = details::split_source_prefixes(prefixes_str); + } + return paths; + } + + const std::vector &get_paths_from_env_variable() { + static std::vector paths = get_paths_from_env_variable_impl(); + return paths; + } + +#ifdef BACKWARD_ATLEAST_CXX11 + SourceFile(const SourceFile &) = delete; + SourceFile &operator=(const SourceFile &) = delete; +#endif +}; + +class SnippetFactory { +public: + typedef SourceFile::lines_t lines_t; + + lines_t get_snippet(const std::string &filename, unsigned line_start, + unsigned context_size) { + + SourceFile &src_file = get_src_file(filename); + unsigned start = line_start - context_size / 2; + return src_file.get_lines(start, context_size); + } + + lines_t get_combined_snippet(const std::string &filename_a, unsigned line_a, + const std::string &filename_b, unsigned line_b, + unsigned context_size) { + SourceFile &src_file_a = get_src_file(filename_a); + SourceFile &src_file_b = get_src_file(filename_b); + + lines_t lines = + src_file_a.get_lines(line_a - context_size / 4, context_size / 2); + src_file_b.get_lines(line_b - context_size / 4, context_size / 2, lines); + return lines; + } + + lines_t get_coalesced_snippet(const std::string &filename, unsigned line_a, + unsigned line_b, unsigned context_size) { + SourceFile &src_file = get_src_file(filename); + + using std::max; + using std::min; + unsigned a = min(line_a, line_b); + unsigned b = max(line_a, line_b); + + if ((b - a) < (context_size / 3)) { + return src_file.get_lines((a + b - context_size + 1) / 2, context_size); + } + + lines_t lines = src_file.get_lines(a - context_size / 4, context_size / 2); + src_file.get_lines(b - context_size / 4, context_size / 2, lines); + return lines; + } + +private: + typedef details::hashtable::type src_files_t; + src_files_t _src_files; + + SourceFile &get_src_file(const std::string &filename) { + src_files_t::iterator it = _src_files.find(filename); + if (it != _src_files.end()) { + return it->second; + } + SourceFile &new_src_file = _src_files[filename]; + new_src_file = SourceFile(filename); + return new_src_file; + } +}; + +/*************** PRINTER ***************/ + +namespace ColorMode { +enum type { automatic, never, always }; +} + +class cfile_streambuf : public std::streambuf { +public: + cfile_streambuf(FILE *_sink) : sink(_sink) {} + int_type underflow() override { return traits_type::eof(); } + int_type overflow(int_type ch) override { + if (traits_type::not_eof(ch) && fputc(ch, sink) != EOF) { + return ch; + } + return traits_type::eof(); + } + + std::streamsize xsputn(const char_type *s, std::streamsize count) override { + return static_cast( + fwrite(s, sizeof *s, static_cast(count), sink)); + } + +#ifdef BACKWARD_ATLEAST_CXX11 +public: + cfile_streambuf(const cfile_streambuf &) = delete; + cfile_streambuf &operator=(const cfile_streambuf &) = delete; +#else +private: + cfile_streambuf(const cfile_streambuf &); + cfile_streambuf &operator=(const cfile_streambuf &); +#endif + +private: + FILE *sink; + std::vector buffer; +}; + +#ifdef BACKWARD_SYSTEM_LINUX + +namespace Color { +enum type { yellow = 33, purple = 35, reset = 39 }; +} // namespace Color + +class Colorize { +public: + Colorize(std::ostream &os) : _os(os), _reset(false), _enabled(false) {} + + void activate(ColorMode::type mode) { _enabled = mode == ColorMode::always; } + + void activate(ColorMode::type mode, FILE *fp) { activate(mode, fileno(fp)); } + + void set_color(Color::type ccode) { + if (!_enabled) + return; + + // I assume that the terminal can handle basic colors. Seriously I + // don't want to deal with all the termcap shit. + _os << "\033[" << static_cast(ccode) << "m"; + _reset = (ccode != Color::reset); + } + + ~Colorize() { + if (_reset) { + set_color(Color::reset); + } + } + +private: + void activate(ColorMode::type mode, int fd) { + activate(mode == ColorMode::automatic && isatty(fd) ? ColorMode::always + : mode); + } + + std::ostream &_os; + bool _reset; + bool _enabled; +}; + +#else // ndef BACKWARD_SYSTEM_LINUX + +namespace Color { +enum type { yellow = 0, purple = 0, reset = 0 }; +} // namespace Color + +class Colorize { +public: + Colorize(std::ostream &) {} + void activate(ColorMode::type) {} + void activate(ColorMode::type, FILE *) {} + void set_color(Color::type) {} +}; + +#endif // BACKWARD_SYSTEM_LINUX + +class Printer { +public: + bool snippet; + ColorMode::type color_mode; + bool address; + bool object; + int inliner_context_size; + int trace_context_size; + + Printer() + : snippet(true), color_mode(ColorMode::automatic), address(false), + object(false), inliner_context_size(5), trace_context_size(7) {} + + template FILE *print(ST &st, FILE *fp = stderr) { + cfile_streambuf obuf(fp); + std::ostream os(&obuf); + Colorize colorize(os); + colorize.activate(color_mode, fp); + print_stacktrace(st, os, colorize); + return fp; + } + + template std::ostream &print(ST &st, std::ostream &os) { + Colorize colorize(os); + colorize.activate(color_mode); + print_stacktrace(st, os, colorize); + return os; + } + + template + FILE *print(IT begin, IT end, FILE *fp = stderr, size_t thread_id = 0) { + cfile_streambuf obuf(fp); + std::ostream os(&obuf); + Colorize colorize(os); + colorize.activate(color_mode, fp); + print_stacktrace(begin, end, os, thread_id, colorize); + return fp; + } + + template + std::ostream &print(IT begin, IT end, std::ostream &os, + size_t thread_id = 0) { + Colorize colorize(os); + colorize.activate(color_mode); + print_stacktrace(begin, end, os, thread_id, colorize); + return os; + } + + TraceResolver const &resolver() const { return _resolver; } + +private: + TraceResolver _resolver; + SnippetFactory _snippets; + + template + void print_stacktrace(ST &st, std::ostream &os, Colorize &colorize) { + print_header(os, st.thread_id()); + _resolver.load_stacktrace(st); + for (size_t trace_idx = st.size(); trace_idx > 0; --trace_idx) { + print_trace(os, _resolver.resolve(st[trace_idx - 1]), colorize); + } + } + + template + void print_stacktrace(IT begin, IT end, std::ostream &os, size_t thread_id, + Colorize &colorize) { + print_header(os, thread_id); + for (; begin != end; ++begin) { + print_trace(os, *begin, colorize); + } + } + + void print_header(std::ostream &os, size_t thread_id) { + os << "Stack trace (most recent call last)"; + if (thread_id) { + os << " in thread " << thread_id; + } + os << ":\n"; + } + + void print_trace(std::ostream &os, const ResolvedTrace &trace, + Colorize &colorize) { + os << "#" << std::left << std::setw(2) << trace.idx << std::right; + bool already_indented = true; + + if (!trace.source.filename.size() || object) { + os << " Object \"" << trace.object_filename << "\", at " << trace.addr + << ", in " << trace.object_function << "\n"; + already_indented = false; + } + + for (size_t inliner_idx = trace.inliners.size(); inliner_idx > 0; + --inliner_idx) { + if (!already_indented) { + os << " "; + } + const ResolvedTrace::SourceLoc &inliner_loc = + trace.inliners[inliner_idx - 1]; + print_source_loc(os, " | ", inliner_loc); + if (snippet) { + print_snippet(os, " | ", inliner_loc, colorize, Color::purple, + inliner_context_size); + } + already_indented = false; + } + + if (trace.source.filename.size()) { + if (!already_indented) { + os << " "; + } + print_source_loc(os, " ", trace.source, trace.addr); + if (snippet) { + print_snippet(os, " ", trace.source, colorize, Color::yellow, + trace_context_size); + } + } + } + + void print_snippet(std::ostream &os, const char *indent, + const ResolvedTrace::SourceLoc &source_loc, + Colorize &colorize, Color::type color_code, + int context_size) { + using namespace std; + typedef SnippetFactory::lines_t lines_t; + + lines_t lines = _snippets.get_snippet(source_loc.filename, source_loc.line, + static_cast(context_size)); + + for (lines_t::const_iterator it = lines.begin(); it != lines.end(); ++it) { + if (it->first == source_loc.line) { + colorize.set_color(color_code); + os << indent << ">"; + } else { + os << indent << " "; + } + os << std::setw(4) << it->first << ": " << it->second << "\n"; + if (it->first == source_loc.line) { + colorize.set_color(Color::reset); + } + } + } + + void print_source_loc(std::ostream &os, const char *indent, + const ResolvedTrace::SourceLoc &source_loc, + void *addr = nullptr) { + os << indent << "Source \"" << source_loc.filename << "\", line " + << source_loc.line << ", in " << source_loc.function; + + if (address && addr != nullptr) { + os << " [" << addr << "]"; + } + os << "\n"; + } +}; + +/*************** SIGNALS HANDLING ***************/ + +#if defined(BACKWARD_SYSTEM_LINUX) || defined(BACKWARD_SYSTEM_DARWIN) + +class SignalHandling { +public: + static std::vector make_default_signals() { + const int posix_signals[] = { + // Signals for which the default action is "Core". + SIGABRT, // Abort signal from abort(3) + SIGBUS, // Bus error (bad memory access) + SIGFPE, // Floating point exception + SIGILL, // Illegal Instruction + SIGIOT, // IOT trap. A synonym for SIGABRT + SIGQUIT, // Quit from keyboard + SIGSEGV, // Invalid memory reference + SIGSYS, // Bad argument to routine (SVr4) + SIGTRAP, // Trace/breakpoint trap + SIGXCPU, // CPU time limit exceeded (4.2BSD) + SIGXFSZ, // File size limit exceeded (4.2BSD) +#if defined(BACKWARD_SYSTEM_DARWIN) + SIGEMT, // emulation instruction executed +#endif + }; + return std::vector(posix_signals, + posix_signals + + sizeof posix_signals / sizeof posix_signals[0]); + } + + SignalHandling(const std::vector &posix_signals = make_default_signals()) + : _loaded(false) { + bool success = true; + + const size_t stack_size = 1024 * 1024 * 8; + _stack_content.reset(static_cast(malloc(stack_size))); + if (_stack_content) { + stack_t ss; + ss.ss_sp = _stack_content.get(); + ss.ss_size = stack_size; + ss.ss_flags = 0; + if (sigaltstack(&ss, nullptr) < 0) { + success = false; + } + } else { + success = false; + } + + for (size_t i = 0; i < posix_signals.size(); ++i) { + struct sigaction action; + memset(&action, 0, sizeof action); + action.sa_flags = + static_cast(SA_SIGINFO | SA_ONSTACK | SA_NODEFER | SA_RESETHAND); + sigfillset(&action.sa_mask); + sigdelset(&action.sa_mask, posix_signals[i]); +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdisabled-macro-expansion" +#endif + action.sa_sigaction = &sig_handler; +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + + int r = sigaction(posix_signals[i], &action, nullptr); + if (r < 0) + success = false; + } + + _loaded = success; + } + + bool loaded() const { return _loaded; } + + static void handleSignal(int, siginfo_t *info, void *_ctx) { + ucontext_t *uctx = static_cast(_ctx); + + StackTrace st; + void *error_addr = nullptr; +#ifdef REG_RIP // x86_64 + error_addr = reinterpret_cast(uctx->uc_mcontext.gregs[REG_RIP]); +#elif defined(REG_EIP) // x86_32 + error_addr = reinterpret_cast(uctx->uc_mcontext.gregs[REG_EIP]); +#elif defined(__arm__) + error_addr = reinterpret_cast(uctx->uc_mcontext.arm_pc); +#elif defined(__aarch64__) + #if defined(__APPLE__) + error_addr = reinterpret_cast(uctx->uc_mcontext->__ss.__pc); + #else + error_addr = reinterpret_cast(uctx->uc_mcontext.pc); + #endif +#elif defined(__mips__) + error_addr = reinterpret_cast( + reinterpret_cast(&uctx->uc_mcontext)->sc_pc); +#elif defined(__ppc__) || defined(__powerpc) || defined(__powerpc__) || \ + defined(__POWERPC__) + error_addr = reinterpret_cast(uctx->uc_mcontext.regs->nip); +#elif defined(__riscv) + error_addr = reinterpret_cast(uctx->uc_mcontext.__gregs[REG_PC]); +#elif defined(__s390x__) + error_addr = reinterpret_cast(uctx->uc_mcontext.psw.addr); +#elif defined(__APPLE__) && defined(__x86_64__) + error_addr = reinterpret_cast(uctx->uc_mcontext->__ss.__rip); +#elif defined(__APPLE__) + error_addr = reinterpret_cast(uctx->uc_mcontext->__ss.__eip); +#else +#warning ":/ sorry, ain't know no nothing none not of your architecture!" +#endif + if (error_addr) { + st.load_from(error_addr, 32, reinterpret_cast(uctx), + info->si_addr); + } else { + st.load_here(32, reinterpret_cast(uctx), info->si_addr); + } + + Printer printer; + printer.address = true; + printer.print(st, stderr); + +#if (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 700) || \ + (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200809L) + psiginfo(info, nullptr); +#else + (void)info; +#endif + } + +private: + details::handle _stack_content; + bool _loaded; + +#ifdef __GNUC__ + __attribute__((noreturn)) +#endif + static void + sig_handler(int signo, siginfo_t *info, void *_ctx) { + handleSignal(signo, info, _ctx); + + // try to forward the signal. + raise(info->si_signo); + + // terminate the process immediately. + puts("watf? exit"); + _exit(EXIT_FAILURE); + } +}; + +#endif // BACKWARD_SYSTEM_LINUX || BACKWARD_SYSTEM_DARWIN + +#ifdef BACKWARD_SYSTEM_WINDOWS + +class SignalHandling { +public: + SignalHandling(const std::vector & = std::vector()) + : reporter_thread_([]() { + /* We handle crashes in a utility thread: + backward structures and some Windows functions called here + need stack space, which we do not have when we encounter a + stack overflow. + To support reporting stack traces during a stack overflow, + we create a utility thread at startup, which waits until a + crash happens or the program exits normally. */ + + { + std::unique_lock lk(mtx()); + cv().wait(lk, [] { return crashed() != crash_status::running; }); + } + if (crashed() == crash_status::crashed) { + handle_stacktrace(skip_recs()); + } + { + std::unique_lock lk(mtx()); + crashed() = crash_status::ending; + } + cv().notify_one(); + }) { + SetUnhandledExceptionFilter(crash_handler); + + signal(SIGABRT, signal_handler); + _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT); + + std::set_terminate(&terminator); +#ifndef BACKWARD_ATLEAST_CXX17 + std::set_unexpected(&terminator); +#endif + _set_purecall_handler(&terminator); + _set_invalid_parameter_handler(&invalid_parameter_handler); + } + bool loaded() const { return true; } + + ~SignalHandling() { + { + std::unique_lock lk(mtx()); + crashed() = crash_status::normal_exit; + } + + cv().notify_one(); + + reporter_thread_.join(); + } + +private: + static CONTEXT *ctx() { + static CONTEXT data; + return &data; + } + + enum class crash_status { running, crashed, normal_exit, ending }; + + static crash_status &crashed() { + static crash_status data; + return data; + } + + static std::mutex &mtx() { + static std::mutex data; + return data; + } + + static std::condition_variable &cv() { + static std::condition_variable data; + return data; + } + + static HANDLE &thread_handle() { + static HANDLE handle; + return handle; + } + + std::thread reporter_thread_; + + // TODO: how not to hardcode these? + static const constexpr int signal_skip_recs = +#ifdef __clang__ + // With clang, RtlCaptureContext also captures the stack frame of the + // current function Below that, there ar 3 internal Windows functions + 4 +#else + // With MSVC cl, RtlCaptureContext misses the stack frame of the current + // function The first entries during StackWalk are the 3 internal Windows + // functions + 3 +#endif + ; + + static int &skip_recs() { + static int data; + return data; + } + + static inline void terminator() { + crash_handler(signal_skip_recs); + abort(); + } + + static inline void signal_handler(int) { + crash_handler(signal_skip_recs); + abort(); + } + + static inline void __cdecl invalid_parameter_handler(const wchar_t *, + const wchar_t *, + const wchar_t *, + unsigned int, + uintptr_t) { + crash_handler(signal_skip_recs); + abort(); + } + + NOINLINE static LONG WINAPI crash_handler(EXCEPTION_POINTERS *info) { + // The exception info supplies a trace from exactly where the issue was, + // no need to skip records + crash_handler(0, info->ContextRecord); + return EXCEPTION_CONTINUE_SEARCH; + } + + NOINLINE static void crash_handler(int skip, CONTEXT *ct = nullptr) { + + if (ct == nullptr) { + RtlCaptureContext(ctx()); + } else { + memcpy(ctx(), ct, sizeof(CONTEXT)); + } + DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), + GetCurrentProcess(), &thread_handle(), 0, FALSE, + DUPLICATE_SAME_ACCESS); + + skip_recs() = skip; + + { + std::unique_lock lk(mtx()); + crashed() = crash_status::crashed; + } + + cv().notify_one(); + + { + std::unique_lock lk(mtx()); + cv().wait(lk, [] { return crashed() != crash_status::crashed; }); + } + } + + static void handle_stacktrace(int skip_frames = 0) { + // printer creates the TraceResolver, which can supply us a machine type + // for stack walking. Without this, StackTrace can only guess using some + // macros. + // StackTrace also requires that the PDBs are already loaded, which is done + // in the constructor of TraceResolver + Printer printer; + + StackTrace st; + st.set_machine_type(printer.resolver().machine_type()); + st.set_thread_handle(thread_handle()); + st.load_here(32 + skip_frames, ctx()); + st.skip_n_firsts(skip_frames); + + printer.address = true; + printer.print(st, std::cerr); + } +}; + +#endif // BACKWARD_SYSTEM_WINDOWS + +#ifdef BACKWARD_SYSTEM_UNKNOWN + +class SignalHandling { +public: + SignalHandling(const std::vector & = std::vector()) {} + bool init() { return false; } + bool loaded() { return false; } +}; + +#endif // BACKWARD_SYSTEM_UNKNOWN + +} // namespace backward + +#endif /* H_GUARD */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/builds.sh b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/builds.sh new file mode 100755 index 0000000000000..6e1fb2074ed10 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/builds.sh @@ -0,0 +1,77 @@ +#!/bin/bash + +COMPILERS_CXX98=`cat</dev/null + ( + cd "$builddir" + cmake -DCMAKE_BUILD_TYPE=$buildtype -DBACKWARD_TESTS=ON .. + ) +} + +function build() { + local builddir=$1 + shift + make -C "$builddir" $@ +} + +function dotest() { + local builddir=$1 + shift + make -C "$builddir" test $@ + return 0 +} + +function do_action() { + local lang=$1 + local action=$2 + shift 2 + + for compiler in $COMPILERS; do + local builddir="build_${lang}_${compiler}" + + if [[ $action == "cmake" ]]; then + buildtype=$1 + mkbuild $compiler $lang "$buildtype" "$builddir" + [[ $? != 0 ]] && exit + elif [[ $action == "make" ]]; then + build "$builddir" $@ + [[ $? != 0 ]] && exit + elif [[ $action == "test" ]]; then + dotest "$builddir" $@ + [[ $? != 0 ]] && exit + elif [[ $action == "clean" ]]; then + rm -r "$builddir" + else + echo "usage: $0 cmake [debug|release|relwithdbg]|make|test|clean" + exit 255 + fi + done +} + +COMPILERS=$COMPILERS_CXX98 +do_action c++98 $@ +COMPILERS=$COMPILERS_CXX11 +do_action c++11 $@ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/conanfile.py b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/conanfile.py new file mode 100644 index 0000000000000..d174b257b95db --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/conanfile.py @@ -0,0 +1,45 @@ +from conans import ConanFile, CMake +import os + +class BackwardCpp(ConanFile): + settings = 'os', 'compiler', 'build_type', 'arch' + name = 'backward' + url = 'https://github.com/bombela/backward-cpp' + license = 'MIT' + version = '1.3.0' + options = { + 'stack_walking_unwind': [True, False], + 'stack_walking_backtrace': [True, False], + 'stack_details_auto_detect': [True, False], + 'stack_details_backtrace_symbol': [True, False], + 'stack_details_dw': [True, False], + 'stack_details_bfd': [True, False], + 'shared': [True, False] + } + default_options = ( + 'stack_walking_unwind=True', + 'stack_walking_backtrace=False', + 'stack_details_auto_detect=True', + 'stack_details_backtrace_symbol=False', + 'stack_details_dw=False', + 'stack_details_bfd=False', + 'shared=False' + ) + exports = 'backward.cpp', 'backward.hpp', 'test/*', 'CMakeLists.txt', 'BackwardConfig.cmake' + generators = 'cmake' + + def build(self): + cmake = CMake(self) + + cmake.configure(defs={'BACKWARD_' + name.upper(): value for name, value in self.options.values.as_list()}) + cmake.build() + + def package(self): + self.copy('backward.hpp', os.path.join('include', 'backward')) + self.copy('*.a', dst='lib') + self.copy('*.so', dst='lib') + self.copy('*.lib', dst='lib') + self.copy('*.dll', dst='lib') + + def package_info(self): + self.cpp_info.libs = ['backward'] diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/doc/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/doc/CMakeLists.txt new file mode 100644 index 0000000000000..81c5904eedbe6 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/doc/CMakeLists.txt @@ -0,0 +1,12 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES +) + +set(HEADERS +) + +if(SOURCES OR HEADERS) + devkit_add_object(devkit_third_party_backward-cpp_doc) +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/doc/nice.png b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/doc/nice.png new file mode 100644 index 0000000000000000000000000000000000000000..42147e5947b7fcfa852a571f47d9c36d9e31fcd5 GIT binary patch literal 40904 zcmaHz1z20#)~=xxC|+C(#f!UJi&Lz)Lvf0`OAE!_-Q9~j!QI{6o#2w>vUj`Bf9`+J zxepJ7tRyp8bFDSTH{SV;1b>l}KtUuxgo1)Xk&+Zugo1(zd-*@;4cyD$vKnKWmm6pY zMG0Z3iZP(WWOo4QKxQ-{z#V+XA0M`-k@FUW~9BVO}U^z5?qwUyG= z8YWu_1qn2_!}NDE?9+-rl<7ySwH*eh*k#1DZDC%&j`q?!YumqrZ=~BND~h^u%eXR1 z<6}E-y&Ch_6JRqHH=nQ1f8N&%M1S-8)sK(w-~M&8!F#$?FG@M{``+IheLXH;!-WxO zKhl%AI^&iE+iKL>xMf?6^klsi78ZVkpdka$Tw)z6?AzSsc|CsaU(-x>)RZ$!{r7k; zBS3G%kj7$q{e+R&9!w;8!W7UjdinBZE(XhjrmedB+tj*HDEe-f0 zEvsHCDPzFxJ0lYbMns0GCBJnHex;xE=Y?cnmBl4uY3T6c>wGs(aNTlCaqCNv2$}*duPvTlf+uwp@HuB~jkl-d<-UfO|#Y30FFg&)8c36*Z8Ck#I9g&-(N7?#f zFc}x0ceRm^eh$Q6%D$slJ`}*wmP!vrO-snKitI-lG?STaBT{=YC&lP&;=8pCC>MS`KG zYR4>5Vvsv_LJ4_Oo6iblgB37r3D?wA9hvd_$RRgOv7X;c%nctS-bsxI+#VQ03@jS! z4;pqS0rkDPObU>pQ>`3Nw?Ykk+sA?rg=91r=A&T+;dbgi!Q5@O_5V5m>P`ux(w??ZxYx`=B+1c7e29Set# zQds9=AkFlXVY?|0wDee%$(i`Hs+@W$>0*|!so{HrVS~BMNb2bkzl!sFHe+@AT-?BD z@R(cPhjF)k9-*;Yy@8raZ0Cz!4foL}VQe;faqE|b6^9Zp0XV-arC z4EFa-($bamD;f=1tAbs_ex?cASEg?c6f0wz#u!ycSQ@PF@`u4*5-pPWB}?d>uotZP zTs%{zinq=z3}nv|audaWypAS$^GMyWQcI@6)zwgw0MaWrnlHwy=#%(GZ6=Ut?wFMy z3-`rv+cGo_Yiv+Dm_jdnZ-zvuhON03=P7w}tsFihm{8-FyO8NNhE$_toE`uYo51y0$cTrog#KBhw>{LYB0q;oqzD@ z4lM^LTkM0syk3B=LwLwjYeFuOvmMM|o6#}xY=5jLE(S`}222eVIvsxoP`ME;IEFcD zaBKdKSH43-??hHP3%C%lbsHlG44*GQbT8|%t~@2ADX@w1JZ5y#op2SYM(`ON68X*nao z#QCB`*GM#d(t3vBCVHA+b0&xyW61OhOG;vtx86uBjp{JNid5TP2H46wk zwNWb_Xs^IoPE3>NdZ0ia%dgySdrYhbqfpLOvIC1tIQ1_m^pv%PjGfeR$aJxOhwS_D z*I|o9daOS#am3IQ(lTWVv{Rl6-sg_fv449@Beimgl89XGsrKIR(aU&oD50GmI`wtH z2h|68lYWkE0iPH`^no69c(avSgz%JF5jS5H}6(~Q;jkFlT6@w-F2L%r-}Z3JIH z#M1P$^%<^51`FU}bOTnT=t%>;W%P2R6wiV=v>Ek9zKyRoHwVjtLLovC*c-FOEaAMI z9j;qwjJpXH;OeTkFa-3q`AFn9#gi0-R(5r>E3S!#`zBh}B=~fPdd1!a1JoL>6Ba1mk70;FrzjNY+9ugi2xjmzu>GUs~xfo3x4D%M#%fl^T(cWEL?=bh^Eheod z+HG!ADh#8n$MiXm&LRBSpssrRu=r%0@&Z?H#$$@qJEO_#cRr8ocUb|kgt`pP zY?j(Sts~GQt|k5NA8T!bT9i15_){j^vpEi<=dJmwH@qL{ls;ZZlxy31rrX&#_mmdE z$eqbv9In4}VPiJYARRQ_9yd@{~| zmENsBuv<>I2o4jfQGJTScsEobL^kO{UwBeSjI4dlQ>hF92cpw!3B3v;o$$c`P|$`q zPII?<5(`DX>wUUvR(ktHt>xUWaI7IxY@!i92(Qu7gbmKcxl9*oAo7SFPVP7y86=d0 zC}eJ%BKRM&{Dd?WyB3HS{K}#ozeyc9MolQ%k;y@=Fh1*B9&c>%0aLxMxm-?q_nyUQ z0LsL%G^Ck1xdu?V`wMz!#7Cp<1Zq2g$!Ijnk`<$Cp`Fs#w0Zr@mq8%S+&N2w4NFrZ z_l`{y?m8x+HPC361JYqd1OHb^smAG9T$qiBwu7) z9OU`<*M#UHITk-0qfvpx`*UyL9gOEN%|FWQ&1>vLXDcn$EXrbRq58gRIqD3Xt%&q7 zqSQj(jpfOd8V~XToX(uz2jeB;-lOH9(|!;eFgyH|=n`-hk&ch0y?a0RKrfIKqEICM zFU=VA{ZdMt>S@PC#_NeM8?iH2?6@x!q}wxkB6x?iwNPWn7wsmj@<$ZBLT5&NEsx{R za)PW)dHv5At~*6D=5-Uk|9bDYZ>&YiRn_voEBHxgij}1>fm#$z)?LLjz5^z z4rDLSZ2FzVE6_(ubQ5NU$pRcH>f_&Y@|@gL0LiV1Rd4#U9~XLW@HkSAp>vn;GtsCf zhku1*v*BWc?3gP4)@+trwQ>MgXA+c?zY4LVUK4 zqH=t+)%%u7&L~ypHWs|!l6x+HS?`4_Cruv^NqsPxz}ry^5Ro&7h4z6_jMj2w2GXGXx2uHAy(QW zG((av4@?EQxRrhg#hD2y#_SWp6KAT0Gy3wkrYRa(`vajb-gh} zQ&aXVZ-nT7Um{=h6-sB#W>U6b3m+|6!#Vj^Ctz25CGF4gwvP;bzJ{%%CApy*+kGdb zTSwf;Oj{=7cjSa4tEV>sJ-D)t@*g}#2q^{hvbx*h@vxeuc_p#73GI0#VE)=c{`akLU_E1H97>_|YLhaPESy~Ck2iI!)`-Ivr=sg!e*grw&iye%3_}(6JZkn5K zM;4|h|Bi#|T@V#Neb@xR+w{DOZYP<2f#Ln*JcsD|Jw&wr*)by#p1n&7Q`{&U|7_KL zBe^m9vh)tKkm+%>GVv@d$#KTb3DL&o^ViwhU82v7=R9w)^G-~5Bl{&MV0cWq?aL43 zGZxR zKY`e}xKKU}jSF5Ms!0~YSUVF)GQQ1F{SyPK;ldicx+Mi!mQC1zS$yFcS9{6gqXz;H z*zV6@{8%-j7Av=%w&-6aPpl$=w>c{B_^eMRle}TeOFq0U)96nq3!0{gXLeO8nhZ5BvQoU8?#CW53TVCZ$2)ivp3}Y*w zPeiJJ^@Z`X0(%N%|Kz`Te18W#V_-~W41>m3E9YUXU`x>iWwSHMg8G{tCEV^?y@@{0WnqT6V7!!JTr4Q093`^yAJ{N2z;J#8I zTCGW*y%IE-Thl(Ozx=3%`lwWv7~@SG?M>3?jR>S!8V}z>V##W{J4r>ji!XIKzb+V3 zBfib9^Fj33R$-)Ex1d!Gk8guPy;TkJD44ZICivnbFfP$wK$n{NXs=~sr?txTGQe; z8|E|r>-md{uGe_tR8QDltUS*KZR)fAoD}EzV9p^Q`1;$~ClqR~R!v9Kg+{Pzys$UV z6Gk9Y>b3@eHy;uIin01i5)}m=ImbcA)ZEqCXrn`Xhh(w0NgIkSPYg6{M?lGhM42Js_;67sz%2TemjST{9z-a75U zkK0ttl}NVVV95*5_WDe6{+csAcd>_|LBW|>w+btc9Ou9oim{PDnzd-gY{onfy&Ha* zPPGDOspzAmYPg#Xm|4*TAa9$uV66DXZKCRRgf3y<@o5B4?OuIf7 zKjY4c?Hqi1PyG)z6XAEhLzs+P>gy3~$L;$+-{Aa1SOktdPGe|`-rzMlZxALRioK!5 z_V2OM>zfxw|8wC&lD{kDqeJKZn?ybPs06Gc_(#~jC}vkhh0yPRH0R&XyF1K#rJnM1`;jnqE>>?2-Kpy39g?{6ZNYghtP4iq~F%0iaDz>)gIEzZ#I?7a(%&cL* zN=<(w41ph+ujB~x>dWa;maMidJT4m7sC!YrDC?~K5K4Z>d?DAhBwXo(A72dYhkXhq z*v7Lx-|?sKC7`jYI&`||zbE0U=>ayOX|&vI9tmI94^ zB0IfnBWm#<5%emNNR2>Tp1iH6r#CM`M$LV6?W5!Xktfk?!ER-B?nBfey>?y2fD0T0 zE-58PR4xWroV!ax0XWhP{ldLVuUF#@rouv=ST2y+&HIqA@ zlr8g)sDELXdXRB6>H~Qg%5XP$x!gt}kyubJ4P{BXwVf5g`aK7G(r&hJyS>=4%(OU; z_CkF~W=;$(I|EX=U*AM~=qpq=BTdCd+37G703hR-VpGsc(tN&mzeF z1$2mNnGJ_zI!)x^!r+*nET`;z?I8c8JWGoHf>urgEE3E}NQuJ^-KrY$ed+YK5m()+ zmA;ibpY52*bnD!8)04*6&xNP&Cog_3H~f9J`N9jA&#ics1@vV@%i}Xu(`j@SJ1_vp zz@keGe&JnV>N$)$WPqGm@jG^=h8l8n5WBZPLeLM%c2GNt9?E6*+LCR=9<-zx(K4I8 zoC|NGRupknxD5`RJw;QI?~*1cNoXFI8p`0!b!HC}LW8pI@yF118@6A|HQdRBk~}rB z9MXQ=ajsqmAM{UW(@Fh2rV1h$j#fnFP7#cxCiJJ$|I{l!Ja$f!lR}L2+ox!EF^`h# zbJEIQV~NgFp9Illd*7I8%SOp(gJZ`062)7GEv#0G$qom@1Ul!$kQRt^zG{LI)j6M% z&Zz|aUjL3GREz4KN-F;i+kgE3k#6pKlAbr~oHH&}pDZM)ffFX}8g=1Fiv=8V!9eJe zlJG-5X9@wrrQAqRX!)k5b*9kNq|p$fxN-S=?kBOegCqZPTEE!R!pp^a*K5inz1$Bz z!MpqECdM6ysX1vOc^#!3Y$=?5`XI_J;zw!!m|dnCklE_N%51s?K-Oru$_z1hdpVPj z4KRE)^XP_>I6}Z?aQ4&)VhzRz^yNzU)r=#zA9%(4V(YxbzQ57XUAxD(;WbY-tz@nJ(w*nD}x!zV6)*E0*w$)CQe zG3@l%T{p~@-Cw>g#{SBmRdv;)lh}DEeTWroNWpf*Uu-gZSyHiSW;vNPQ!Gs==g9*D z8LoHq-1q9c?`L)1v#!9;x&XS1Kb1?I9(13;GOeH+{(nflz<;it2x9(24W_87I2Rim zBkKMm%uOO6258d=KjK7yj4x$GIJ5{p3-*0B zt|b{93U{9c2J^?O^RpFEKa7akKerYcQ@*TVgk@3sFq=+!IP!7&z3XEP^X&cs*!LL& z^mdYIs(FgHO9Jnd5Qa~*nxBz&mXD8~iPAGmKMz$oG_*yvoO{*zLTH1wFM^RZ>n%f$ z!S8wo7}+gOWmFeT42HkCH_CwI`ECBrkwvZ0+c!3NNMs^Of+k$!5%)=Fru(et>zb{6 zr*6VRS{>`fZh5;$#dfYRbS}CZ_5{j4^?ZK1nL|6im!9`ZM3EjUxl2>T()LorZ9Msg z1G40}(kJvbXJcPn>632Y$p>RL3pt)#NwbjFoIMuejp*GvzOBAlAJe?`X^zoB7rQDA z{|RVn_pNd0HhFsiwL`HlP)MB<$Ejs|+chCeKuyM) zYxl9V%C25a4sm}cUsTaZvYlYGSi&5ZRYQWa>fD}Ke2b@AC;(dE*q{)ByzqSjK)A*= zTM5Pz^;wK}ZsvGLY7Iatx(kE#7IaLIW3v-KkdQfc1^h0~{jDpAo<7wmMwYypbIQSN zPCP<%ziapAb^U3N(SC~`tfF%bu-}m4;71x8Q4^eEJPzU`lLq($ozgH9@nefqzFsUp zs;6C;W0U9U`5M1AsMOI}J-R#JQ;SzdqwA~6dy)!yQh50jhS{hR>L+Dp>DzIAVA3b< z1HO%meb09845`Z%vI@a-p#2`4;4}5RT+_oVcn;K6lPbp~c&OsQL>5D<*KQ534=LA~ z27Qd}Eqm$fWe~oeEoDRPNc?1W`1Aqa9`?W|-h8p;cSJZgvrgBKLt>MXtCZ5&cSNmh z`dA{1OB91@zhm%9Ep+|6#QBP+!$(}Z42or@SPc4PBF!FzfbUS*aF zIb$c({J5|Tb$Dx%eZ6}YGMXeVFK3Q1KhXYU9Gupj>?FMacn?J~s|&VK#nb4GpKoj( zX%PTETy_H_Iej1eb|Qbo0rsxEMX^if%zvD3=!YF*_g<5bg<5@i0DFPdLL&Casiv2= zTyT6^BZp^luA{h#3kt|QR7q+IbtjtfWD5sb6ET8=wWDN2f8 zjkavnV>;gU(n1DL8l5AbDMCL_9uVxy-E&In_rvcGFwDB@W`jRki@wK{Aj-0vreZgr zO8BAVG3C7LYI4>(l&euk??=Cm9klXm;Q;12mCIjFckbsgpJL?&w?l5ozKtUa9>3e$ z40v1?H`NbS$^Pn`nSCMX7`q&6@y6r|>3-NU!mY0f4k#ILwvJ z>j;2ySEKNT$?Yr&Cl|&tM3^1&YOFl%5&s;&q>;`cozglI3(dGnyS6mqr-xbQm^HnWAGQJ0C!Zk0c zNOC*IEYMryI<8I9^Ix?g8j;v{q?qG!(MK*5@%l zw)R{=+eJ>GWVS}LU}NJEcdTNUCtty7|o0V4=3pe}NGZMy>}pOws%~VD5-ckN18lpBBJKTrVqK8vhSQ zxqHL=zZeD8X!Zd9<_W*?r_>Av+X+dt^ySUv=8!|^NMCULjvBq5l3xX;$wk2Fr#Ucz zpHunLOoa|1T7!8~VnML7b8TjInDG^y()`G^QNa=9$7vyRfIv%*-8Fs}UATopse((u zwLO*f-MKa+6mx%WqL5eF-7lk6K-wFPA=H|T`@72?;a5CN!Ho;*2BDRWr5Xpjuco#t zZ5jHrk^s$`S^?pnez;m5N`MO7wRCVGm0$inYWayke5)JCQPiw)E;Qv^{Nvj zX)=L_6Ih2&e{FBVE-?opq4Q}G_P;lhAKScM(kNr~NNgt=GkL$L4L;^G@xmP&#eH_K z0E4*_Dq(*ujHX=&>1j0Hqs7Q3OGP{IU~;GPxOE>29XUMHXEO@~TnKTkCIwIS+ZZ~3 z?};LXNt!IDJ?b(V1Ggu1H|*HR2o5ZbmS2$61)V>;{p>e4D_UGkgrniRf4>C|RXAtL zR0J6#B9#EO0l}?jUxPo7Q5UQOtEZ z?MJ^~z7e%b?+n)cQ{AK3AjY%RFkyu4Q5+)GgOYCypAz0=9D2KKTpj~uXGpkyxal;y zwSL$9)c#W$)w>Srj>U$}=SFLXI&=FX+5(SXrtUoErt$+oA=@*w&}>;fum>qD!)+L~ z6Cc24H8U@oE@f^I5NFd;S5k z_!V#4<$3w`o&1~wr-b+(5nz;viNFE&(VOK#z<-RCieBJ>E45I?YZD*eF}A(AA!qsb3@Zh%Y(F&eOvC5iOO~5{9Zay z&)L7&CIz=J5*vFc8SR2gr}X|BV|{^AC9A771SP>Ffq%A1fTMc+ZM^>T_>7#DvDkBj z&BLiAt@z}EZ{W|SV~56qlRYGT(;TlqOb?8=HD}0?;mSVd2r+^NnZM$}U92}E#|1+8 zX4xqGfme|^$*^dNtxBP87I71PW+cCX#b0D87af`$>XDl>{KhbLq9<44_X_H%cd9K` zPnGHR?J_6if0l94aKpt%m=S4T{jXKjx61FWiAzcU=ZUX6t)O$^W@DAK;G4bBM|^e1 zK8zNZyz@%JlYM z2>Wyi!tQ?m+2r9u#el$Aoj(g^ul=yTFJkxVA3TNRM+b{N13`e0pGdra`{BC1C8MF< z@lBFMq1E>NwYG!cLk?^zNN79rM9VwZDSw{&>Ok*_wRAmo#3ncZQ2~FjE1j`>Eng2F ztt3k9T94H8W)zjoLE2>?n}sQ10w%j>Cjqh<^kOB{Alm2~YIt=|U07Sb>wCVk$d7r= z=@7oHF1Uj+-B(H8e6a>Yu&-N_ynOjKmdc8Z@$R()+&$@Ht>IpEJ0%v`-_FDmSKzQR zh;N8%^Ov0L&EB<#>D$!|r>->5iu5Jf4Yl>FySlDplrXKrAFVg;5=Sar-BIX+8I?kY zvqIkrPVddkAK|OcB`VfGL*VvVmQBUNoUl%6ltGZqFI13xr@YaQ$=1c$mo=sIs}{AZ z-4sBhx$m>N1c?a~e%Mnw7c%v|!F}ORT^~WIId&`f=Po+xK=I5(J@9f|Nl$sA)c- zzsVT*KDh#GQ^+nSzW;UaC|qR9F2`osQZ%%5eAzL&;){B;IoV6uZA)vz5lUuui`9j4 zbHHZuK?%N}#rZ+1T6#N%wQJ!Qf0=zlnV63IJ+~dF8PnzC6a{+}0l^4xLPEQ}nK!*J zY#)2rYQzh|#fZOp$oc5i7a`r@vxJI)LR(Vrn)u!2$le^J=4sE1Z<$s#&U|C+UwlYX z@0A$qO~)6xEJ#OWTz4J8nI8PgqOF}@2>@4K}(l*qC#=TE$iuiJNi*_5D-`AzEtRH1(aOsfoHK;S*KWL z&t7kw^o+vqh8ODjQgpD6^&F|_E(TJ@dMY^qsomRT`~3L$I!w&R)~rLRFZASdg6)xZ zXlsp7wDT~V*zr*}-*`V}?Oex&R0eh-Rdbt%9|9NKGR zQGsqnhx_Fk{~Lk1dbCp>R^|aIkNd)so&>D{G6sE>mj{y@Cv1L9?s~?XKPibuEB`YS zs__#|J2;q+yN(+4YuZ6RqPOaW7`vyR&%yar9F;I1EJzzn^;)-ANb zCyZ38Uk>MWf);jpW!N!unun8NF!ojG`T6-GRWszP!avkbJ4#&fGv}j6{w(+OU;`-) zU%fr!yyLsQpJREI>kzyKQm~-Sv-F&v)b6l`{%eK@n5Xvh$?^gm+3!8H9~jI4H8|wAPc+RPI~{Nts(R&hL5t(LAz`RB-HyjX z0}`pXF$S62St>;y*z^JSzT0_bE~aFI2o1i4eEV>yrtqo0_Jv`(tAJ8rW1o}jNz-wd znpZBx4?A~D-`r{_Lf9#@?El7!jU!9N=PdTuSbGr1y}cpW!5BEdLe?^U`gM82?j*E% zj6;s3Vi5v;%J^8XlqCqsg+f*h%iAhrmg)Ys{)1vVp2MjZY)GI_6Tj*srD{D>njpVZ z+_P0b9qYMA#&fGXQyug98vuhdT(IDK8v&EcX{tAJboc zlTes9a+V*@6YbSOn`GefHGgYj6RJVA#Z!s*e_2&wqe*2**rJW~leJNk$C3t1g9aif z?#X?`<+aC(wHf|kt2uBi_zl2~c@}@sP>S(e6Bi}hPC;}irE>xoAcBz}XXMc@nxcnj z`-Kh;csIY$!67|)>ACQW(=ua-8r`B3Z9wTI`U!&Ocs{{9v%@^-5!>@QnDL%)diA!< z8oOW$ZQh}m6G`0h6OYQ2ZTu-)f7J*2#FdNuuuSlk005=7X!#vUe~smm1FRR%@gf#z zwZ${}M5&X0(MEcm#Sf3UnFQ6xyEkP!Sqw&yC)SY8q)H4Vv{$j(5zz5~JOvs$+08Z@ z$f~yQ=v(=L+I|y+{3ui~qAlAP%M{z^+|2j2Eis#}pz_TvL#)$p69|3K{s0(ng#XB( zkcGi2_)(?W=0CZ$iFQ3!ZZ+n>#eIE?I6O3Iv56Q`e^E;zZj|hzs+XsM>A!|w7$e;aW6ZD7ix(Jo@(J)I=L;I(w5u)I(2F~fsQxB8FYb<7 zzBmwl;7W#8PR+~?5$E*+ej794o!B(CDY2kruOFXild$T*&_aqw*rmHC!Q2I8ddHm} zqw@oZOCY6q{G1RaYmgQ!O^e3EHVcM5;$WL|0C}MzO(YMmmm)VclMWd_ng7agKM$@~ z!Y>Mkw3Csjp1_SQ0U3Lue^uWvORq@$X=L`4j1#;xs|{}UYq{p0!$Ib*swbIeoPZ3 z2A1P^AqLwng#u()mSZHXwC*ekFGS5gdw+1FrublwYC6ZD5AlWaRQ7lPXy_a1ken2i zOnLSgxobU-ZAISMC2Kkov-+Z~g_}-w0VESCDBjy0BYHnm6T{%%gIfw5?+@HEsusI- z^XJnL57E@yEq%SzvTwp{@aD5Vd`uYk9t=A4!C`oyr3RVkj?#N`4`b~dek$#jVP$cX zdQ^$hGd!33i&$b--1&K8Fi{!W(n&lJ7kW`04=o5G1+CRY{!Av=Y4CnE6&+-jmVa{ZQ{DouRMtQcRqT8p8Uc`-Oj{6 z91lv#ZV@cH0O-Heu5V@67}9z2*Kjx9l2OTjp}SASf_<7iu)w~FEbRq}jFE48Vgwvp zTm#A8fbEeu`ek=Y_n~9%_xEA69m;i#&=7Y`XTDqreFhR@UFRCh zqAfz=^dOvnIgo%Nzo0cTBXtv^5wBnNJ=$0R7H%TRVrUSe?EKe(7wIUv+5_b)nd$4S z)a?BQJ<Gj=hP%;0QSV_Q&vi*d9Y0II`%y0T> zNPk%#_idX70a>98m^l(*aW^1eU4(~nw1Th>M{{z&LDUqPC)%XEYjKjv!yK=}rfZeEdH(%|h&vTcwC1cOpcc(FK4BJY;$cm|gEtT%)pA*{lu0ZPN32|< zC}KV+&z&pm?trUw!k4-&O~t&HQ-C@* zIQX1%RfkCE!-u$u5xMvFn4I8R&zVGS!BG3YoWwfaI|4Nb%2;y-szgXukZ z((^2H4IX?N6Ha_gehR5oKXW;cHZ^!-ozj()@wa{6*Q14x?1SJ9mHP}ITp^Mismmqo zE?<+yr$Qc>mR@wpN7j*Km1rWcI>vzbEe4f_lfCv!EichN!6*eV$%p*o$$WY(=yN``vN z2uL&m^!Ou0{Kev|ElP3lhL1Z}J^0O=I?E~P^JfZrJc)F;)4y)5KRS&rJ~3g(h7ZIb zj*9S<4f-|<==N<|zV)a$I9Ku{g=1GYBk75zJ(SP(tkG;`eRQ&P_8FrGrOI5Nj{=mq zY-va+$|?6s_=qdT$;AherOSV&;SBdGW20CsWr4YHVX~_1x*j8-_q|9c7by$JdGtfP z2nS_D$m{d$hw|2ASQ#lA-m>G&b1i*Q>g{~IWdnSkU_t~QE9FSV=w(@>u+{4f!;aXM zDUDvU^~yw_+btCqgD^Q%Z*O0kv_5~n)q!F0a>tUm6SZ?3=R}Rv?yBV^K5*8hq@&9y zg;gm&H3-H^jtKiX*2G!=C|Y4efOVx-EkCWGuRDusp+bE4t-xoy=->Qg-=KceUdn_} zNKB1kkR)fJn21EJ{v=jTwq_fzdI9l1@Wwbl!W z1P)@A3fluCWHrp#0s6S;tC*nBaLW4okd_pGUB>qeV8nTQ+73qLru_x58n65VN^hZ^ z6+b~+PZZZtjN1j**jlx8_M!vmaCr!ZTFu5C?}yMZneSsArqed`?yO zzxC72HMTNM6G)l%_##n4MY1g#LyX8+{ z@UMK);FU5bG&$E}+NYQ>b`pGSW$Kc8sT}#~`rGl5sNAEN(HDWm*{i} zdo%8@Z_|%?mAY%lVcvai3ntjA=H28 z)&E&4=hI)2%&_G7ZuYO!Y(a>4qMa5cav8EBv>yYC6o#W{k^jkr zXEV6|?=C*2h=1q4WDPw(mMe$36ns`*?>TMm-OiY!!7)Cjsg>wKHs2(alXQk}i&fAZ zR_*{tkFWax4H4@?8sm#Z_{k2I+SRdpY|n0>1NhfsqE(mEz3Q#2k&`tZ`r@R6=uh`Y z(@xqWOo#*IKF?wKbLW#jL;R1WNKMW_u05ZdCkE4`cs!N_mbPI2B5!QHJREzsUMHZP0Iqwi(!0q#d;(;WrG;qxu3B)f z9ujiMiDjzwiV;!ttb=EJKcXf&mp%)_LUL5AGyfynwq6QU*p_MGTL1bH8{2=-bfM+i z@Ri7P=wrI#gK<1bmMG}Ma-tMy8~PNTouk`Ml708#a72)n3oX5$YP=sp0zib%_OeR&?T?R!Z7S92U=lJfM?SQWumfW5&*n29Lzu0SbipNfiqrC!( zkPY*rb^k@3j|_P*w(Js_KG0z#IPp#mQNSC23ibR zx4(7AdGmzv(j4^3EgZvVq)#a7N5+&+FH^5C?l zW|c4c{IXh_@c|Nv7(NuVrv51tEgtkhnE`n9r=HtLc#(fK z2O&MiNjH0KNf%&NOK6 z>vv#Ebbqu`Fs&uQwb96ljXLg2)6>QL2=OWkZutZxw!hn)BsuMXoQRu1zWw>l>GIC= zIr)0-MJ4uo2)s1_ktKm)^s4w(edJs;r-;zzu@mXfGDv`YU_JF zVl|Mxrr9aVKz17%R77&avAssn73Bihv%GvsBS)k77n26BL|(oG0Kw?+n(N!{MG%(R z(fwIFP&%o_dGAyn!07GFK>k%Sb@@gO4io}b(b&O!PHgh{U~uN!phQ5O>%i=A(?@#9 zJ?ZwHLSKe&G{VM*l!}IMu!^QK9Iv;(XB%)t^bpxX^%rR>1gh42@HLSqUHK9zXc)li zWJ_e2m`TyXuEYAbDU;S^SaT*nFcQ<$?-rx7aBGxuon}3j)5_Kq1bwws$>!zG6xITG zu_`mhyfpC2E;kzF1~dw1L#USohswQ>^8(;%_^&6IUHoGzr^v3aegz0K3Q(~YI4}|d zk_OQIxNPJuOcj@msUUCtVxBnih`x5_)u^wyj-_lr^kKmj-`bJx&vlF-QhQ(r^T}am zW_VqhVK_PQhU1UZB`haBfo-%|o2RX=pTgcHeuvb)8`c+bL7U?tg4i6UpweTmHPeiPCv<~%Z{##waY)NAC(*Sun=;^_)#-8$Z>q;f)RsX)uR- zFj0B)C#^A94n!_?7fN&4k+lfBT3w;j>*9sMLk(IYruRXtRb`I*M7s4%94Gu-)d>fA z0FfwkTn_YCnvIxdSjoyk9T3p179MYCO+xHpM@A}e z-v8+X)!~7&YUQekWpI$yhU1)!xu|C`iPb6NFT;KnVuHm)s^Imv#O>k3#yQB|c{?>L zf^{+SOgaG1hf-(CJ6*%1w=3zKqePPgSHVK{e)2-g-Mf5@tYyMJoxzN`0Tb6#xIewy zGef9?_qU3dGY!Rt?WB{;K?wR51|>;F(X^E`5c_L38^~fqKYTp-kL{PfEBIUuAlSyy z%ZC7!PS<$za7wHH-6>TS5ama2W%-u5TJiq!l--`DE}f>d=%ry8(cAB_CEwYOO|LpL z*k!``m_31_0ksaDQT9JqCpCYXKgMf-F1}s_O5?{hW>T!5@o(sh4EBiQr zK2%yg6=@#|K`=9(4GC<#V?&^!1BtKH*^bE0e_E00qB-lV?S_6sQ$8SS_&@BuWmsEL zx9{5mrKLb=ahKv=+@XSNaVHcl6e;dWi@UoQr?@-8-Q82%-2y}oecyNQea?Q)-q)Uc zKizL@C0T1dNyeOW%<&ulF%m;+ZsH6hhOacL?|7&{Y#;Q*FYmv#n)PU7APH@J+`YR> zM5o)Hz4HCp6+eAsRPRp_BJ6Rke~?MHS*SM!X1h>dM5y$F6yoQfcs^@$4Ih%f zYcP7qNdP*P{%sPHwN#IzXMd0VwR4uL;9|8{@+$A*t{ljAf@B(Xv!x#UjfzLu9&n2+ z;JSU_#rk?i&YKh!XkK|WN|4URv?c#>9h>7AmE?fY(LxjdZlmr-cN7gW#M#;yTE>Y& z4}OCfVoWDU`vcLC+Nc*xR~+h++$lncwZ! zi?HlXwDoS<(`_|)z-?#tjSBSK;5tL)ugLnq*rE@zI9v6a{IiO+6A`y%T?_}4n%b+KE1 z3@H{f0FMy2%c%xPrwvMs>JR*@l^rOx#v+tLr5DoOI+T<&q|_DaCH{S1))&{_c|5S# zk`~sm1<@0|zwSSoFew-{=;Hjn*81)@h3gYv3fulM6Ym!M_H+vAg=Ml39OB_phvTY> zBbOOhmbXbkcrlBKU!syK5y$4R#XN}*;#$?vn8fjq4>MZggZCvgU=rs0`{)pfp0!DS3s9b?^zf!E95_%nuOBy>2y9zqq<^G)Y<_;CpdEqKVmC7dj9Db*`n&m2dZC zjh1fBy}!BBkvBm3YR5@UC{^XrOJfiSR{pHcp8A0P&LNKsT%k9f^~_EAg>XHUtPH~B zwCSzn6LtOvOaIs0+~L9aV&_@PW|EKm-c(}Uh9p~I8@i9OLUj_J6!F7&HJl^LT@BwQ z9X|sLnRGR7eWjwg?S^}S`G^4&_bLP$gHnobzKTg*{OOV|50do@`n4{H4O8q8NPJ(GDUY^akJ(6G8>&6bi)ngaBBn? zum9nrEpRNT${X!RFk6{gQRXkK+qluvPG^N0A5OYY#i>*|bywgw9H?a1TmhASse1W7 zSP3;+Q%GbeG0?IHqNX+Ax&iDdZzi5-)xPjV0goKB>4Ks$i&OIYGqxT$LDZ_+GV-K6 zP=_`AM5zQd(zaNEoujvPp~pu22tSf7;7@xTgY}z@sp&U1Lf#=;3wTFMalv&_5@Vzt zeNowVH|eXbKT(OMWm~RT(*!a*3-n(j>J#MDwRkNzHi9DufAQ{faxfTCvka5sShAA9 z2I9tT{+e&deF-gSb|MA}N3TbErVbaUnDtQYwqzt#VtgGxmZ*>iB^crvlwogK5Ptb> z2`GMpjJ+SM1$8DSs*IXRL!8CaS^`ZMrC%$^hL80%MG*1(5>{j zR}5|k2bPdS?#S|OpHHl*MjIMk-V_5~%>EgVh1E&Hd+qrmGnIpNC(}cQ=|pH_YJyy= zD#m;pG`wS}B-lon)SNf;fl4ghc?z37oo1!wy>9!IGt~(0jfxdSu|*Lkkd5wR{n&!~ zN4qAxHcMdNuKjIqlV}j`kwcX_>f2sRS{;Xpko7O7?siizR)G4wf#8=-rlP+ce@*{+ zK9RAY5WX_YSrx7RZTB+c9>TT)B>>p!jSw%N>Q*wuruFAqJaEb(goqs`pz#0VkaZm>H3IM-KU( zV$hFhG^f~>v=Jtm*A@-mBG(L->>8V6CkrAuh$^7)Mda9e+Y3@ajm^cRisd)!rJfQGadp6$}{4wN0)Ta#Q zm+pDOv~{6P`(XFvoQxvmIgs9GO)`<~q_=pFcq~J7pmTcP#kJ9Y8%j6d&VH$$tg6%0 zEiI{S@nZcHegLB?^x3)f1dFMz_t!cBp^4y9iyJ*gjoXd zr8E};m)gkuV4;G|T!f35N5A`=Gv4`q;g_g^tpen7gy4Nj#`h&wiu#^;Q*G>50CeWR zcEobb!6muGsJ-D;(dZfLaaLc;G~#;apVM2kh;c3UR#^g% zN0Dm2IeX}z#UW0%W%3@x8FOjd=QrHpQY3T)=I=kU4c1y*Lkqvwd0|*0cFd(stvKix zHq5-bTW0E&7t}u5g$!<#hPNW*pO~U#1&kS=&axcfk@hW4k&d^cHH>~ay$aKG)_R+) z=;qwxhERBW7P7(Kis1;2q0idBDNgWKyB>~*u-PngyY>;oA~{U^V6tj2uNPc0Mwc+U z*vAD5!Nqi8>5kZTClQ}jJ(pQ>V^$!E@7Vj$3G`Zn+Ixvh*u87To{GKQUL-L~VN0+y ztf=UN4bP|ubBgu%;oPkA2!+oFQCRlP2@d_dU{y6+5Q|i)nG?-k9v4^FU*c_(|6$4i zE{NCOyn7qS?UP`{9?B5D5rG>wDY@G2L!Ye%p^M6vb_sJ<+pfEe`u$PMaOb5Xw4@zY zmvvnc2gQ!>voSgF?{?l>iMgThdgnR!+OyQl&*Opn-5hh2W>2B;Ip-V6NgMB^`!agC z)WKZh0c-mle!-MMXjS)OLGS?IbO@Twl52OQiK87U);9ya_1zaQ+H0+I=zl|RLSC{f zJ)ljB?!IQl+fvCbNpCsRaKi=%*>9f(I8w*318Q@%q3WVX_aa`^`NxnP(9l-J&Rs@` zZ_x{jC?u)OuJjA3rairYYENTv-ChPoQVbxO0<_S!#nTpfe_IiF^61751gjI&eA0tFx||s4cYEgv_Sw`#sapOKTDAHl++qAErwXnwn~G*#7Cu zLVj}FubU(}a!vn~kE5M(LE}C;A&sisEH0Y1jqd9}yX5b4aTFgi&0}8^W^I$pulN&* z42ktmf*B+~1QZx4=ht>3Lw+_ILK9K7e>aR+vB=YYnkR->xF+0VEO_2;mn|8j25 zOWKf0^xj!6tiO<(wU4Hk2xbtI=3V$|4^Lbg#F1Dw1HvE}v6$DvUmea}cIPT|C%|kW z5KgkQlf|b=EH>Sr-2?m^1vfS}ZwdazCKty+a40m$OVr=1Q)uI*BKKY0A8=EMSz7v;WAnLq zO-(}_%#GN5zp!t1{1P2>0_3Gh+Y`C(sqqwsQWaiCo_92|H|OUQ^9XFCc%USZXC<87?B3o$&AiY>Qgt+O7Bi_7eF zKn9IKOh+pxzCiULS}`t|_qUhS#~mNkexK)5X4iG=xh!7=4f@MfcAYfG65exSAWP+7 zrK&(nmO^TgH17G+50Obn>*i9X=@ zR8$5{e$gB8SK5NE3@PCwY%j0hTF+C4X9>pkQ)1*rfS&yHK`QMvK5@2u^#=0V$b_wJ zAWG(7;yCswl%yk2=G+&R=o2xGZURZGS>{8RJ}X(Vv+JC6KV;# z4HR#^Toaw@#PechUlImfSm`}B*i zVqUng;7@!DafMl$g_Ge&C*3}486^A#&$V`MoEQM{nntY1*9vlN(LoAHK~{FO*{;Co z5AZZi5O6WvXLwyj3&y1mvW082w97v<5Zp>|1r~bMF~ zC_E%$+p43F8V(M5d^&61_GiX`A2K0w91G@0W=oBD2|*SNoqKE3c+I=z4Ls$)(fICD(y zNFr9N?A9$}aT1oY|Gt82{H(HqF;m>|@hjm()TlVz7l@rbdP*3`_>GF2yA0C#u}>sZ zEwr|JZrP_r#fm3S`|IJ-1*)ll$2E`w`RywJByf_7Wc~a(EhK_0W+3i;g~^!BsLV8P zw1r1ulY#s6qqk1^>_&zADB)M*((m_K-TAqIclK~qMtu?<4v(vtCC^ntFp- zU^`}1&_83$ldPk7wM%u@>#t1=M{pl8)7&jci$h_&y>A=Fs^^2Lgf4Wgv-E}-b-~UL zMha~0fJ=7Ug4V$t#ERfr^O=gczE3hUCx>}=qshyuT`20VEJzN%wTQ&_8r={BlC@HL`;zEy z$c4!JDSM>LvJ@JG({&0yxh*mqdZOBQ$!?k6L~dB;Pxyti#vQH@Zwc6fhLjNdY_$Z} z0@0^{!lA3vm(ZT!P}pUQZu5qKqoT%I?$=+fbBJGzR=2`HZ|eBF!{;$^#Dgk98(ddS z{GZRhTvg+ER1elQGgNvWqMbB~52X7jTrlz=l1l*WG!RXX^JQ=EgbVvOZRK1U(u&)< z0wNkFG#D}h)!)5V*irlLLm{y@?6bhS_9B&!pb*3dL}>zFMCnhM^Y5B>%=5@^YvSl? zZlDqFq|be$1_LjC{ZM#Fx?Fc7a6{8;AeY{Irw;_$vl7WmN^(^D^olo+VQ(+SO)rwG zhcXFH*!}5V=(pQ&cd6i>V6240w-;JPedRC%O#(8Hk^#Ec2tt!#`yQOj8~a6xd}xUe zkkMqyed_WqMszp(W0p@QK&ySYU;s9xsXh#o-^Qul1YsYSAmAmx9>6HixX(tl-^}xC zux1TK73fwrUJXa}Pz%hq(KgtUop0BX^)9xhOC`L`$^myFSK&osJ)M}eJyI&}!3U}F zki+BLg`|s^^EafouXk-0+1kq%LM~K~6z-U^yml@hZ=B=!=Om&HOGiY|#L~PU4)=5b zoO|HDRJ;wpvi9|83rGZK2ZldZyg7V5+N`Mb&o zl6OXyU2&bK>|Z3+v*{AWSnHjdU~6w6$pnMt_V{=BZ~_Fu!{;sSiFc~5u0ot`1!vjs zt2m#%JmGr*@g|@V7xRwq@<)005|J|DdAShWf5z`7>&uaVx(u=*4)S9Dd?fSp@m+kT z#xUqk$qVxU)yGrh_r18qhJBuZ=g&gnOrNvgKfb2GX_^L1WLt_GI!%r%_DtD&L1CZK-M(w8_Uqs_$O<2h6mWnIfVyndM zp;g;Bkm}j(3$#*wEQ_Vk;Fka$DtVE#`!nQys6Agixbs#e6vPZg;+oi4Jxsk!jJ(*M zYoM#GC2kK+s1Ofs`>cN2xcNo->J>l|BBt(+G|^sr*rRdv2X;`Ik2#aylXphB_CZ!( zY3ia|-hc*|*!u@21YT#_=uLoNCE(sdTk2TissCcl#z5z8l_Go zWiTUSk4Aw*qnEo;u?O{9JibI6e}0Z~)=cmQ@NI4+!}|zvuQlC>Gd~ekR*rKOC_N<3 zpu3qZ*j|KSuV5&sT%J48yoeM_Y4CJkJ+v=M20Pe1pl$Yv$_YUFimsb_;0X5N`6K#A z@!KwvD(K#tDkioEk6bHXm19lnA<+;_a(5!_ZTsYUz7bB^qf;*oSBGb79p}0fKJ3Yf zN>D$sq{&ivn7$%1RldI9CMBFIbN5~ekUxupvAtW z(IDBj#fgz2PUGX*q$)g_iFpXg<3xP9W0-KdLzeb zz{Z{rX*`Q+kz-yd`IF{Id)Q%SxQZ`ols~91e$Ha(@QA|!^J2M{)_IiNbII_*FY+k4 z+q=yU^*QeF=f^Y!Q&lQymtl+fT7UhM*XUw{53VsyXOOE)!Qm5U)4IcUr;e|y;qRkF z$LJD`w+Vvv=KyqxPxVxU8yeOxGRGHEq5~#t7;^#XT_OcoYb)e#X~v-OqUP(z2av#U<~W|8Xk+Ca(G(VMYu(oJ_Cp~% z*-E*D@$mzj(+*Z|Ez(IG%A3gD|FFNZiYdeAB4G?GyaZJ&%4F0<#jFgxn3G)dd9eF@ zv0C#PT3k5EF`AhyuLD-A2k|E0^}Wvo@x)ts$c;doFC0A-%3__8>8Cl2o!YYM`s}w9 z`-*_u7o#B+LzFl~1SwwQF^K^0&4cGIc=v&AopG*SI?y?so)o>;y!-47Dsqg@H%13= zBi9cd@otfAS;(lZQWLb>F;Sj%zBT%YiE$1!4tnqnFf)ZK=EN#3MPl2nnnHxzWQeYS zh=HdqR-!I~&)gvhD*T(BR))X$;|tW@{`o3n8Ixy_oS$8_j=f-nU2v~tS!y4a2!XNE z;kgq@Nd&dG5^w&GV%|947G4tt_>Nd2`QRsWNIVBk#l=PVV+l+C*Cpzy#Zzz2J)Pef zVdx8{IPJ2;FrTUb!zuccpN=lJFjM-}26<5WoJuhz z+&053Hz%KocCCz2d|xKjZu)p3&{a=>>Lnak>B0}m8tRc1%>pfEXl|lUdYbYwvRZcX zp0p)H&y77BDrqDvaI!d7dqR#vW9sYgUJ!C(^`ZV)w(NLPMuvk8N}2qCv+>22ZWkub zU%E04#GU(iaSFkBE8g z+7;P^Z;6EBc8hw*p4|4OAzWt#shWDa^gdnlIRl$F<|$Ii^yJoxc;b)HR}L!dVdMQY zRzcm*0}1|JWClymxo1?iMt(D0^nN?8NyTVS0Ju94=mXH?fwZs$6+u@1PH=H(kFA$r zN_;?w%?*rre1Z$XJ9$JuO}z@zy-^8)+K#MmMIH-4gF^~uz&NK3m>s%4G0v0KFrsv- zyfA(K=ZUa^6b*_zL{H#xRJDl?ptb$+momzGcfcwhfx;@G?JL7uTupNIjG3;dH|4m2 z?FLdO>2t5$9in1wlaXGT>)+a{b`szE+YzsKAEQU}=27gT7%=&j@!xU*g6H-huUu_@ zt)6wE9d0nWZ9qd$Plh*Wc62bRUZXcTqD8I6NFkBGk=6>UV1UtNWF5^;&Z{A9lB7 z>5c{aF?wh@F?gbEQfkXbj9JaZf6?&i-yv27na7tdddIRCyP4x?6o^(v+{`2#fCJicg% z96do3S&Gc)g}O3(3yFkRHVEKSy-U>HTmnE&OY7C&G>N7MkJMv%wfbM%b8e0^z%eeW zVtb=%y$P58#$M(C*mt9iv1Pe2$)|}tmP3b%sdbS&qtaYX-d;y&B=^g;e`2)sVsVgC zu09XyO3=4_G9FK z9XbKtH-xdDMpE@&R&biwtC8dkrBGJ1^}Y_uWlJILYXJ~VvKLv^t?eevsYK`taOMz# zhmyJC77d_Gae%|f8hJYp+a(!N`j|^%$_x7f?*y&m6sh0;$NWkq_~0#2KT>7thJ7@O z@b;uk4(7}~E+G)WiAmM;24apiz_!oHh!{G_vPK(*&D8s#dD-i=B;tYiYhv|L7k5pW z9Wb(++J5NZ_wEn`eJ4Q(e^9FXdP3IG6JrN!w-y5tt_acWEdZ%0?!wx3Ls{yFQ>qsw zX#JyOzDVZng&>{Z(mwW;AbG&B9DZWR(yv1F2l3sq)dmgi(8AfHCoZRGGjGof3eE#* z<$^v2lvy&~yI3oZHH8siqW|wu)|T>cvBQBxlG1X0l`R~%Ajr8x*U;^};^w??2Qh2B z5m(QwGNM0vfD{eT)~tw8NJz`FZ7w<2th}MFv}7%<=7?5%J5*_33}xU!mhgcrF7Q%H zg4Avp1)&$laUVJ8@l#WZ2$7c{hF2x4n(Uwz>br!5f7 z40ijN!s~)+bpaZG|TJ#ZhWb=adJ4?O-b4jO87zLPf}9`{UMGc z4PV??N9{v@l1=~y|7wyQ1dInMwb1wz@_b=;d@NW0(& z#T|Sss$0kS<{K3#o$p5k)rZw1p%xF+=NttwuKU{j_M(1D4b(7O)(m0RR2~Nh$^Na+ zsaHfqc$}{j%p-zo60m?F^)~s2Q@Yxu!^`0yY__&i18{M8!O3iv0vY2wO_W zgC*({lwxKVPv}&@v73;yZ;nDa>n#0l2x+V3r?qbQW=Zp{J_ke}`Jgp)AX`xAGMk{zc0b_3}QA<$HGpWY>}#@WRsM^7@dLQy30FdxILjAEVP23-6H(>mQ4rGW7t)q z2A-4$8d`rG>=QwcyR-!C;k9f97$~KI3th@^mHB?lq9D)f!v5r5C-cLo+ zZMJ$CQFZ&lCaW9IT16hj#P7uY630hO`r;ZWr*7SP!AlR?-BBvo0N~TCB&`~kW&ZZ1 z+H__^wP2mb4EHwjhk6)nX%{q0?5G)&MSM7bs2v-1Abi=VX523Q2|;k-(AR<<=mjUr zX^%dF6+pdqoV>fu9Vs3*6J6r*s`kx@?IEc%F;&yPs>i^rYgMV+3Cu$2YSU@v5_}!E zYwkto{H7Z8YBsX+|AxDjf}Om||AV{DJIj0?Qy44uhRjInei6!K55g~eBIm9Sj zmsc$&B|o(>FpV}f@<9oUnskUO_^t2QkMfZpOr#SeA5677^11PefA ziTb!}w!gGq8|q1Y{{8<9yYa8Iqy7?7@@E5%7hO43g@ba}d5k67QHtm`WAJC7sRDi^5N<(ai|2k`Aa4EXAj`Z(KT~N~Lq?1j0)2AtdL$ zxMTLZot^aSSZeSt(2k6%Mu2V6Y75suMQ|>eX-r#3xwYav1`n~tCC@Mfo?NW04n1HY3?$*n1g)#(Am+Q z(J_50J_NmC=U+M?vy)=5B^%IZwY>P8JM@xJ>da=FDAD$n2?&ZmXH@ip#MkFr;CQOy zpQi2B8uq|gbZ$M~#2qzXcIA2jPn^0ky!!ZPeUoZI>!f)AhOy$GnhBDlHa#gHUnRdk zA2t`0{?rQ{WdN%}$K=uC_9G*qV<5S!;v9EOdtY*(*}rxK8gTAy0nFw4@C+_=aPDw2 zmqcv*M=@7J%NkeT@57g)`}Qn@Zwn3l(!6Lj;@9ejzS7+`&?|;jeFz{t{bkS9XN^f^ ztMWcd*25KDmqB4$cmA-13(0*QH-jK|(f4}hw~nLEZ=a^suU6(J zr>CKJlO}0Fg;0Ds%Tm9Fu(bPR=j2;uQK#;bo0$8;D6m*|IYeg-yHD5kg}i@}%bE=n z9q$n!@NrrYW0{Z9qlUdK?mHer^JtCurx;aq)2XwYSvj*O^yx7M7QCvj2|AC?0h@a( zFMcr*8J2w3!Wm&KX=K2Y+0FyBhAvE_%J3yaT%82)CYGS{ZFpIv<*eWoe6avD{`5t4kUfMRXnEmm2)wJ-5T{C zBCQ$pqAH%X%7gdiR|Px;*0vlB)z80*lhm1Q&p;;Bc0}#l9SH|YUy?(o1}6CW8d41N zfhhHv?SdrSO=?W56Q0a}ZL$6DBCP>O*S+xjI%O*9)PEHI|C7UiCx?vx_sHQ{zgZWZ z&KEaBIZSwxKWL5)_|o@>{5SPB0t0oSXN!wlheu!GdwvT>cX9rthAI{TEdV_KE@!)= z^0+wg>`42`TJq&-q{?G6rsmebI|s2I?Mbr^YU`?o>6`>B$WA7wHsXGxqWs?elQKDp zw548S^0-Yc$L*%c5Oq2Fa5}-S_x~My{CZ;Ak>*6Q?;IZiVVo{%;%skkhq||ztiC3% zxq2%>Ik=06CL*5cB+9yp;<3w<2#^8&=~5cb{@ zIM^1jcvUnV)IHgimbBrMaqjIqaWr0+?p!Gu^axT#%#t*0{se>0G#O!c6Z?EA{UBAP z?+1$CaekUYq}7gBjm@i$L{vYv?DkEJL*gD__wPKNy@pg^bccUlTK&tjWPUVS$E}KF zsN$w~Jthvagm$fbOi)OpmCA~x`D621L^ILZ=BO;vhA8nAR0;YG@vr16u3wceZ~RCEX5wbx5^;H` zm3@|9nN$RXJ3`q(j-Jc%H+tAKS61LdRN^Q4NNP`E#ww(&Ufmjm&qC(XvH-QMPqe$c zJ=6W(*?b{coOevTcR%f>BkdSW2U8D~sQZS~r$Rnx8ih91C-I}B9m(Kq@T8e1C^*Rl zJLkWklIKf9(s-#4(2eO*F1^k`hP8I+J#TK6*88t3AzYj|y8s+9*~1^MqTEL=1!#N> zuBV;)_qNui;4!!-9yyxHl=$6l(_6g8GhyAH)0nrHj^fVu4j}2|M}$fu zfs9<`S!cVgXZYLTgF}MuR71Wh{xWUn%waJs-1GR;$D{XIS&CQo5F>yUU*7ST4~-p- z4&z(`MO@ZC{6xUDf%CKj0dp$z%}6`{_WE$nkHy{J_;`7bi4>R9+Z3aUJ1yQ-CGU+( z{0YOTcy|vsf6T$VsEY7DyR!=eWwF_h&M!po+0D8?XG0kUO7tUkJF#rRtQNJ0f z2Pw#ajo0pTxf!#h6iHP)#U)~Q$u;(B#xIA5+!pauKt8iGOKx=QPF`OCcgUaW5KHP} zn-tN6jJxe%B`=_qzk1blJ~)p&q4CSGVK3V3<) zV`ibhQ;qjbHN>2+5}ExGtl=FUYR`QM_VklPvO_uq@6_3H(Ovp%Em^D@hRf|f7E+ee z9YxWVFnIc0YWCC-vBaxv%S^NB7~F5mm_(-?ti>$XM?f!@A~ueU#&YCiR3-uI$P?fU z<;I_YHyb&OqLMC3L#Nj_f5Gbj^hJbMuv5JaAw=s)@{Z{y-#cDq_2GxlbB8IA#2cAA zomJHWTdt1=&90#fiyw+y+x`;LwX)0L)2Bt1uHU;B>zI!pt~c5@hUxH=Pe}G>Z*KCA z;px}^1*TmrSO`JsZO3OSatiL9v|05=FRag8X=c?A^CGhxv%ia-4&c*wBy7K9`RMHl zWePA?`bz}=jpK@&n3{1&2ar6%SJ}v9QDWG-2_^g*yWqHdV@9CZ@h_A8%UONVgYDZx zKcj~~o z?*2J@A?hE5_w(mx@ovNf|3+{Bar;gQ@5fF7w0pTP60xr1Td~xS#e<`03D38Dtb0F_ zlK%tFzQMfT^b{zY|IhgLaVCgZ?uZJ}5q->l?;Sy$?6Q7_sZ1iX$Uvl?-uEDKs%QF3 z?X|x7x!$LO__@7jQl;M4AC8{=eej?9we3jb4aw6psjF3zt+Laz|cvbB)+1=aX(ab#i* z^lp>pb?(|aF238(wc(FZ(a+kJS)g$mbfBgIEPh$N{MOgY^$@{MckpeF#`Be7N0)ei zGXJr@8nz2Hz~`~AfUMjG#;cMkCZf|EhlI?X&E1c$$-TJkug?M*0cDr8mcp-mBLB#U zY@XT${buvyc>tRoCz_h=9d;uS=ns?4(>_;pnN+WT)I^Wx!w>Jwx?{-h2h01zex0(L z#M|Q@0Nuzzb(I|3KxBFOSlBvm>%zZ%1aFUL6Knz>b$xUu(Zx6 z&$#7Q$Q?F|AC9h2{)}_OE_fyjwN$jSEr4BE8)d?YexAaULVyiKMkd?-Zi2~-Ij$$N zX9~F_GmDsBA7p?R9+4-ocqMScl;&^XqFVyATgn_J(lf7W zOCnS)*F7a!ng8D)QfAc;_<*vId*tc`KSGpizz;JGL^JxG6T^;9fZLZZCe+*IWf^0} z^740&amypcfv&y9xJgdsbqaNKd%MUM_NqpKPlh#&1-Nq+@yAq3+x}e9yAUjMJtJJ6 z_VUJbeFjx`Y|j)#SHd!oRuxQbJS5V;Hjb2W)Z+5>vdm05BR!3k-m@fPe%|r^{M?0Y zAx1~F;cNE0GFXA7Y=VAl#na^m9mSd7RwI?_Pv>eWC6cO^UUbb%s=rK@=V5+l_4LhS zA&)gAcjBR5n*1OW{)gki?EPtC>y_>$k6}5sntq;a%#2lv&tbY#*J1K7)s1P1r+TfF z6ye%kgvvWB9_Rl5E5mI2nEW^hM;?oX+SxWi@P}0vQ7GZ5>aJfHJ*1z+bQM)Vd0&>o z3@|7sJJ7@H%ZL}IQ~b+n?hqOb(i?ZM;geEQf#5l^Tp?X_>THM8-kzxE(=7qmcU)dj z=Y0lcGwqQ)tF$QN^Dbl2Cq*XDH2(|1n-0PMDZ!g++2XMv-Lz`FBX?c~W?($+QRJNC;TV;^@R-5y zH>qzSOu+CMRFv;(1m7*-HsT9$ft_!Wq;hxc;@~6l!>;kw*V{It%|B$4mzz-S^f${Z z-p^YyRnvjWj%5y&z)#s5@4GeHMG}HDHN+vaQN3`g{JV1O9$gpXuC9hN1cY}7m=*XG zJJWCHVzLq|vAxMRE`j!C**vw82XDkESwySg=wq5nRWrHr$pUcmf$Kc}{&pSi`c$xl z(~*5-4^vGxI4pN1oK$VwV!H%&rVq*1E$QHi;*cOd(Kz7$HADHM!AeAkcxRJ|poV(@ zv{BGb;=9IoJEdE~XE0GO)*udTEGk^n+`G2wR)gQbcqnadT-)=FI8uE^#v>*g&WhU5 z!*3%=3g@&7_h$=Xco_R060bgT$;mX-cpg)lDC8{{c3xHdJC@V%AV|~c>7^YM3~(-7 zoO8#Gf0O%YqIOj8^cqOVbIzz&SZ@!5><{#HFP^47zy^J_iOwwLP_=p%qX_GtrH2hy z9HA-VGZ?&`|IPYTi8o!b`15=&$W0lheUKNI zgY&tgw~bxe;^~MTn&yPrG;wC5jz;T(vHqd83J$bT;oQhA*BsAm{wtn38Z1?CquED zc_yCz!gp34_}q>t!xzQr`{zsgSPsw-dUeo-bBa;kfQHn)oH)$_@% z<%h|&HZ0XxP=fj0v!-!yjE?TI^*cf{Rhv@NhZ0=ei}@+we;_Z%xs`t?wm$wL7+l=gr$*s*ByaZN@SpKL&B>o1~gx7ILGudzX!}W>41~Kw;lj zdb5rYjdo{~I+xLm5$-SqDjH(6(!Oc6WeMcLBaXd4ko8pGs~uTTW76bw1O* zjE0Pc(jFIL^NVY~3eHS!2)5J|NfyozJ-*l(%7?yrtoY_ixVfCM4z5Z1u56=pMuwNd z#}P20sVW<>PbQCK`452Av|yCSbdKV|aeVHk5fg2zR&Dm^;j9Q7&-?>q0V&hZIQ%%- z%qFu&JzQ>bC4rUx5U1e*R@;TpqGN-~-1ychvZrG@sWQy2g3GJ!4*(F0Z<)*{Gwzq& zK){{0I|wBM=S)3uyMyUp01E=>SK%VKd`L-an6m7h7Cov8i`O7v_s#6!bP};ImCzB| zOc}g&a4E|B2fA99d7^b8?L7Ls>YQqX`WDkh{QI*eOqr?s5{E12k0YTwiUtfqZ_O;} z9B<0?e#%aU*x&ILW8qn)3nq^^eS$g6Nvh^3tjn6cK^`m<_IJw+6uv2YxL3W|<;NX* z>P!a&|Li$*F~4{OR9N2SVw9;&8{dScSp@4X-+Q6<@7V83nlRJZnyW{(kDRsg(9l{+ z9JUKdH9ut%8V@O<78IrH1e@RC9c_z)xhpOx|B3eY@b64kmjJUx0EFg0BvS@|B~#_b zrPg@%_M^YhBn*ybqQ7NBZO~X>0Y}0sxf)44AFKMBh~Jk)57kMvqPGoobXB-NM0qO$ zXDg^?8lR0?Zo5-Gag3_4IO$6sn&n14c(0@X@4bz zOtf__i>PzSCh8}i+TVhOb$=079&-gnh}qq%kKv498LHTAU(L_>({!RT zes4PMqiht9NpMoAk+EwMCuAf+!i%X`LKqhZCV$@=!lt_trasA)F5(gGS2%sTv5qPI zlIJC>cCyqX{FqoWp??w|=M1HzKfTJ2=vIwPL)lyYovx0F%hGU*vG9Pi6+jd?RhG{) zKTbUY_N{-V{Aor|pfDu5_mm{Tl_4<($c&l0n;{(E(;sbH#DSC!yBG$E7m>P|9n~6Z zv_LFt)6 zN0(&=_?|Av%aB0qO{^ zEBw6%EbPf*fdl0G(J8X725oS#zqAOQkH#yA0cHpAa7w&$)D>8=7}a74WilC}EnZna z@*%@m=Z1Uj52k*EsKR~$?U3y5U_!DoM~&bAT#1&@FXo0)L}!Y)-?RNEz0_J|kZ*od zym46Eam1RY?V&&WBNI(#W1zWsTlS<6O&l|$bFD;khH+tq4EyBY&`FFnJE_7x&VMN( zY7}vL^)`5e0yX9vlZxm_mO0Np*+lTyPgHt`NRuxgx0gTH+meWwVgY3yyPN>&m;*eI zn#U}T(S9}`@JmhlpEKMkN~;shF`6(6k8SVn{uk^cJ*U+u{6Xx}o@F$j zSR~yxG}wSAL$;&9R^W(VNeJ`O=bMaag zEC1!dkamifo)Nq+2P-y|o0=xkOs~chre3?$=Figrj+YVIC#raRbJd}W?UpI-@XaI9 z-}{tuqzw}lG>p(@bXXe^37>abg-I&IV+V=>u2q)}@5EE?u?*{xy_`ZhxFEA$Dk};k zxR0@TcmD8fpX0ispc-YUvLL4JM3(V*cNWnQWoUxLE(e zA-o9xCk_GpCx-}!Y1siAW0gKeUd3k9Jm41hJ-oQG)o|&jNpz&=kCJ|BYn4+q!XXs1`>a#1qc;&&Wi`8WWB>%(L;|PNo_ZJr=IgIfo*)NyVB%sEM_sqrf&U0h^66NQo)M&3g znKA9;z?nJ>7?~Jr)T9l>5$P7w(S(&yL&7C5zG<#; zY1zcIjK^w6cPzwgo`gsE#wzF^z3o#F6s1b1mP~s9W_al7{7hkg4+&P4P|tyFh)$Eo z#{PatP>I;R7xUW$cEbX8(?!_)*Bl-=m-;mba-*I;(7t*uc=Ix^p@Pg#9D#P@!r(D( zgd6(g%KZx4){yzsWkl$C z$+5_J-|{E-_D`&-eCGwT5(v4^*#c69Ae#EudCj)Oh&k%aZ}YJQYwUXyr-1NN-K4#Y z2RRO{#K(%Xf!miw+4Ximf-H+|Jv}`)_9tKKXQ1tfxAOV0`DK2S3G1`twMJn1L9Y6_ zHqk80#aO&pC;`aJ1!$r568K;%^prE)LR(UtJ@8ebKAz=)my7wrJ1RTLBMu3{vAmzx zpX>nJt;CUZd*{|#6`_MDe6C7uRkD%P!lxC^F@^7`iN;^B!2~dV?08+5H}qX-t{!;!od2 zit?u+SBvKgXy~uZrN^6#!gvJ1ZhSHLmrQOU1g9~uz6;QBab zRn3O)nuRLNNbX)K7b_lj+zLUR>{zD|k=j&`LwhjoVf$spweiA+&=m)G)SPa(OIi&G zA0)urB`^W5Yp7}qm%O^X%-8pfc0&F+G=EMkVe$s@Y$qnpGn7I<$9)QX(P6rL5y49) z5p%cNHICw6yxxd_J5Rh-qCP%YaHhDh3G+|M6@7U7=q{o zVIs!pz4zXuhLI4xx6xY?M2}vAQAaP)TZrC`I?5Px=gVE|-n-U4f1b6@AMZYEud~my z-~D?ic4?)smX5uPs`NX`(9100&&gF{lw$%mHlb9(p2!!0=R}`D#)*8p)f0I0B}WxGzkMU>#d{Q@&Ws_2Pxy}XyRvx;efan2FIm6kiM^L0S`TQC8NN3I_|>Z^ z80@<__fYOL(L*Rgn+c|sq7Y~8dK0@B-PTMLRpov%-Z*UJ6){YiKq8VrFWG%;OJK(L zF`HhsX906O9bZVG$u*#|B|TK!uxC1wFkT;!{2TfR10979tlw98yZ){`P8twjl-DN4 zP4p&uX(%baJF+77-isg~%$e?qs`kqOB1GC*#O)SUJA+u1ITHY$6hKK{wUz7&_5iGx zhA+26t=yb^gmBw#-R7{VE;-V#jN@PC97Ha9rj!L`)be06&nmu~8-D}sDoRrf2Ez+s ztve{y&0Mll7`S~nYrwU_h*uS1!Bh5{F8cUGuom|C>gvLS>p-l=BjEJ|*-yYR0==6- zOPzpc1im}m19e9sn+iOALy(!I@zncIBh(mQmJ_FH-yc*fXl&@5X~&iR)uJYYpmY}t z%28QyP*&FPhIE%kfO>SiJ457FzLSzx9kLkBWpH9$AIJSH+X|G_9*?uOMwi;TjiW6E z4M!``xyj8IVx_N`n;7i7Th#nI@^K0XV~Nq*yjE^_%rcpW$}-j$KS4dEB>#y{JNB{a zZW%X_U^_hNOBjZ`guN|qR*lF zyssUPhQ1~oPl$G>@z1HCaB9uKXCi4eoE^z17!f$OJKB@bc$~)e0^NTvUL;=sx|Ct( z+MbgbCH^JFsNNE=6*gMzg9h?jQbPhB=xlLpU9W$IOuY-348J$Iyf+#&j@`VnC;7Q)1M%^{ zJE|YLNXCTpu<-&BXC(r^@Y#8VAA1$^ZH=IKWrECI_pb%p z^qS>6O)GF-|C&8^5cRhtJ%xYd1>b4WJ+<4CLJ^lJXJZ!dkIb zVrBpoZ@;79nF*s}M6xr*?|e!wIRiTw8eB4U1C@0ts2Ramd+Z>l<<9eM+?d^iY{`TI z&BjD`T_zpSS|wA{+NElXSfoDNpAtcvGkR)=penB9UB{)-!3^aHKwZ!L4_-*z%(rF_ z*ED%dp+J(KP|7BdY39KSC5OZ#UGH3Wb_s-l;#DG2_2<`f`H_D}x zPKHU4&l!_B;;t(o?qf3-aT1`G1n)^mAEZ*gl%O5E31Rs8kp!^{9~G`1-2EqC@Z)dS zH!~^QLqW@i?j4-d_HTigPmo~p^)%(e5zl~kY_MN5-z3Ie#tljK=P5bb5*@d_PkwE) zJZaZhI4Iq_;deW*yF(~RL{X9-!zOdj9j^tcIGkCAY>9^Y^e7B}D|kkqIW44sf3RTk zO>XgnL%N%_ICYs|gSkhw((4!t5sy-H@)qAk*;9zlsKMyRcdVIV0KuTnSJ^{J;`Z9U zyX0xmlNppuBA27v!Heufw8X@4A(?^Y%j$5Elg-)1<`j;sV@bU_w8#n=LP^MM!|n=e z438nQWE@xu*#@?bbd1J+hn~I>t;@CMX{5>l@D!Q)<=d%V>JQQG>LXDRfcx~g8%%7z zQ?}V$<y-fCZ!lYkB(TixS&8Eq&FBhp2OOPnRYJ@eEdsD67dhi!t)TPF>wOCm(XrK0Gjdarrwm5pnDR^eJb@YgXczZ}DZxT8joH@uaz8_u_H_ zr|SZS4Y{UOy)KZ2-d#bXPyKrlESm2s=PGzX!1Oz@}FMwyRQ z7X_A<^i%hAMQdG2mF43S4vmyA8VCIk-!?KHeZ`1I^7gHBJvdR8DMD?LjU-IxhCHd1o z&@`N#prZYdZL>SO)fvj$+S7fef93a9TWYQq$FG-Zz4wRkhtJ}XxjFshI!(SCn)`@R z*uD@~4mQ5t8!>~7!76}pehjSYhR_Gz0-;7Z1X7Ck1P)`_;Lim%{rY9ZlV$OQn@G~f zidBD=FcD|Mu#Va~(UGWKVlf_(Ld>T|KLCGZJ^-8;E_ajqwv;VIN|T@lcnDf)KHF)M zim?A7$Q@v=)o)5l+G`dJ0qtoSzMrTu;iFmi;0a=w7M~m)OG>X#%occUiQJoPvilOj zg|F4{?lGD#u-vECZNg>3*q=hE0XK6aYhE`&cU&{a8?%vtP5->4PqZ@hUtQOWD7RX{ zCmof-^p=gR>miqoo>paPt}N1|5owqBH!HOrl^)6uv^x|8lvdZ;-&1X@95Pw5YQdz&z_y{e zd^Y&Vl6(tA6jc|kAU_HATVVqTI9k4~!W9~AOGldH+yo90n)t^(Z{vX+=6u(XSLB^u z;jVSveXEJ0@5yb}Ku(Xof;Zcp68Nv%a8cy=MI{u%_u*}_{+Lll`S zb3&D(hxir|o&8Dn^(KLLYLJvxQr28X#h^5(rs^@6NK02nrLO9hmHtZX1iywQhc$~_ zW4x6>+KWx0nd`2%?ldsrqH$}ChKZd0K<#-+WZ(SludxlOpE)`WgT=O7C?La;lxf%g zpg(ox!r1i&&sX>p%f(9>O4D-=A-1gsy(HBwQu^Esr0_~BhTO^3h?NOz5uW-0TFy{| z9yOYe&#jU$2-1d!m>&O%G&*`YGueVPbK93AbCLu%82z{#NeIkva&oVKH2Z+~A8DHz z(IbOldN!B5k;U+(6Z^?1j=+TpR|i*<1r(vCE@ScdC^3zop+R6>*ioZGqI^y2yt?WnWm&L#+mvLS(9r zjj0Dq2~Cy7b3@Bw^@NqKHxQ?XbUsdl)0_*Y6elRiGq0`1=SJh9>xt^wQVn@%4$UDl z8I7bYxoKp9o$0kO;P>8M@#nx)9NKyV^SW3=&xTxKH?9A7i3ZxJ0-{xHmzP9G`gqYzYVWx&(^i=0{42>GzU$IBv*+pJXrOnRdU$=*`Zu3w4UaZ60{0M>u{FUjZ0K?}NC zYyQrEAj4fYVY~4b+xPRn#Lv?tOZ-Wdd~}BRKBrQ1ub!lEPAV(AL)l{f6IId)49+Qs zQa#c;nTu<<;DMCRjf7$~H+_J(h}`}{M6YAGHm!VpkBcFZ{)gvjX65-XO3MLfQ;w7k zk)aMXJ)>*HTO`55*A?ay{diY5_3&aZjXVH6)qHfQe=nXr!g%_0Emc%CxFn^Xny>ym&YfwYRowp$>%* zdfKWwk?1yMqkhXExVBXJit=fNY(&V3)GZIqv`Yduk}P8EN^=8Ys_3PfWZH?ChNi_| z(z-1AB429Xza*drn|FO81f}zTEq1?7p(oWMmaM6kMZ6l%G;bU{%Bt=k|D9Z33opA7b zdj3q*@yvNOiGL*n@8cgozg-KGKqi^`VyLp4ZCmu9{xT=0?D+7-Z-gm76 z(m1YC{bI%Q?ivc=v-qbeWq5oLH0=`nys}2)_8Iw`n&g2Lqut;8F@@l09oAH@9lm6P zgI8rXNV|mbAKsQb#NcN#Rd39Nemp(37kDT7D^pZ+rHrRL?AndhLWJh-Qx?m^GY*=B z0BPbM4XW!l&k7oxm8y>TQYG?4G(^+P`zFWg;nU01^p3xrF`g?oTnIh58=GuAwg>f* zIEqqd+4z{dxua9FnvI=3F(u{o!9a)+|H~p}O~?NK=Vh+FWz1F0=v}+>2{-(A_8)&F zOOY`;?@n|@9n78AutVRTKDPM$&uX=_%gzG*vz`u~5XU&>bMa;67`!ujwEC{0oKqJG z5auye`12O8S}Rp>LKfctp8EbMFx;ni?bZcsl{yt1NKFCr`TiIw>;4qw-M2o+ld#sx~H%$xIc(GZrG;d*Vn6g(nW1S)mnRu2SZ9Klr54Z15!M5qTSUT+Wl^FQ>8 zS#3)vuT3;|vReG6RWcKT-1^4J%d4wT>(g+J?l{AC?_rNSU;{lwy;2>Exc$#A3WlK4yM zOY(LT?++)~?l5CBMzNCOxoY+(4zx;u$$IDaUe6t4#8yz8mHylt7lxob;D$)v@nOF@ z3CdRhx{>VbE1VbLS#$oWm!LIQO=s9tfY1eTBdr%AhzQN3*}4yp z4x$aX^H2={96YWc$)5(8a$qM?i%281b)!Aix-4O0h$_NW^H6__v&6Q2G1 zpzgIzGicM^K->cSGdnE7yqp1J_hx?dz$~((qhNSPpT^4_fBUj>E8?Vck%0EivUpmr zx9s2GtUfcY@aXqYep}^ThL{^T`u?8n=rUGTk_TY*{CJ`4b21gfY$EnDG+{&W-Kj8e zO$rI>^7Kh>hBDUvk(H=e2&IZyd+ zcT1k@d>B{JoGTuiTM(qnGm3c_s&~!Wgti2+nX?pE+aJY%zsWP>Xzf%uf3J7_pxVec zHTL5*R`BM_84ZfG8X~ThyPt)A8n*{j3MD&FuZJeg-_4aFyqS}z`)nGr4N+1Yo(f;s z{*+xZwWpw!6iV<57;BbNK^8S3TJ43K$29mlTY;mAfpwRleZ#Zh{>S`bDv5Q>PdR)M zoYOD!?eC=0TqJ{chcO}gxOhw|4A8H&s5X{^%2TE&rRD0FM_mhl=2TOoz%rIqoqmwT rm81GE!8#VGu$Pho_;sb6S@6FAF^e|a literal 0 HcmV?d00001 diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/doc/pretty.png b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/doc/pretty.png new file mode 100644 index 0000000000000000000000000000000000000000..f95d66ee0be9e821dcc7f97f05443ff5e889ee59 GIT binary patch literal 105498 zcmb5VbyOSO+Wt?AQ=|o297?ew#kE**ch?jtTD-WVl;ZAAaF^mvaCdii3+_pNedN6F z`M&2ofBaUGHESj_d(G_Ga^Iip+QG_-Qdk(o7zhXmSTfS$st5>(VF(D%-=U%WKH^s* z8T5Pe%t=*B6rp^S^x*dnim{xOI0F2SPiAXD?C&G!_R=~|2na9m{`fsZNJ%67eGv7V zjDiH}3L*~TTe4s$zH0=8w+J%gBI<67$La3c8X9x$z&-5YcR`=ff?fuQF+?O+=SN#S zg!n)37dn+2l zAxv=0TXwYdv9$I^*Ar5E%jYR)qYI{m-_JQ9Jw&nEu_h5wwE8yJzS{0_+ARn#U2#ZI zPyZG1>FrB2r02e$-nz9}Og(U^cVY&-i*-J=&X2s)O%gpbRpGxhTjO!yX4vpBWI}a4 zrg^88B>VR@%9TMsRo)gJZ%bWTx6>M-{x0Q@!aDGzveX&;U;kO`U!~hq$mUhC(}XdQ zdRBa1im{ys@AH+K%C_QYUb+K$!hV8;D3Z91RX?+KbaWu0R%F{LI4_hZ)<4nxAWjsL z)8Qzl+>I%8{Hy#Qd(1}ax;(op14DNYOP_!EA>KP4UVhi937xt5lVWF(!WVNo`CQE`L*Q zEn)Ct2eJfk@d(Tt@^X0paGN{Q;SYCmCZjSVeJ7!5H0ScN%Uf4vZUVQKIXuXu`Oa~Q zyxeR+0vz+}Y`-_EL(t;7>h)k6(kKPyXXkYXP8@QDtY6(u{RQ%02?sB9Qtx=muC`^s zUI_V|8FjuB$s}ll94yqoop}Vg_dHaYcB>X>hdH&uQ0Eyf?6vhwnM>HUliW< z;SREX)tpdQgiJMrrPN zUtv+|rMJ-__@h5i9}rv=|JuwnHYLT6H(K(q*Oz&btww){?~T=Lqw8c z=-WMCwsP)W{@w?l!05-v(hFC!EmYW3tT!MauqZF$7lmdeRF;%Tvi#fqc%-G631KzE z&#y%4*sJoXD->IPN9O?VXmu0wl)9Qe(E%uWPG?#ZWYko&nz0nR&Dc7SZFI2`KULKO zpExbR8YU)|O=;xEI(Cd6Vg&lqJEIJnmF`J!vm{ANR}ob_+_8D65>HII;F_%CmZ|rI z2h4CZ;3jwY=`xPsr|EBx9ZGRr@MzVG}kCf<`z&VFE%GWg6)rY z@`M9dlx%lpSd?;_8|&AvATyz+D_1=~%~CF6q^L-Tz6yKCeFn&Yy$8RnJxAbjDLZ`0 ziAi4?x{!{}6Mj1SNh(85CK=%%^mD)lsaFT}$<#IKxKiSA3N2mMFg=tKSk$H`gPA*x!4JLB87eKH60v+C-(+n z^DJ;W3HEWmZbixZzK!_x3C77&`{_nPk@}4xedLpBJj&fSbtkt~$(z6x1|~{-{u8a+ zU9Lxp;9xE$6Lr10Ze7_u$%ifv>sV1f0`dq3rexA)4*iIbe2*Bmld|wAdHr)M%h7w5 zdiyg+Vs;+%<;4KaoR&hUGn#o-y!JW&vMQBF=M_G$3ZMjKfWQam~01g~a_a ziB?=`+WY`y&WZkQ1YTec(RdE`Z1KygA*g(<5PW72uEf85J)q?P%Tj0-AwIFM)AXfP zs;T*7bp2gtV^*DRYy4r$?>xqyOOiWhiQp+2+Kh)8s;%We+JV@dyAB@7Bbmt2FBc8m z;n0j4uZ0wTPtN?6Pi61rk*r(3N|?PuoI?1x=1P;U{ep(@?oDAXyGVF~z)4q0an;QmT^-56shGqPiG>0t^A<5Ek(RvYi%plB?pSN&bEO_itljx$K}euTwtKdax*S6R z_P$<}Vy7?gegR2;1yZ?6%8@rLe>0s=sL>sf?g7<`gbO%d4QTnovPQ%LiSeA-0>&cE z0zoYN;*X4fH=Kh;2w5+`No&n}MT(Hkt1OBI=$^KwqDP<^|ET?Yow34+8gjn^>`v%D zM*gUvnOvogSriojjfQQ#1M;2W~gcG zn)(fm(1RHla^u0aahQMQb6K}8xr8qbQiun>@Pu4fMQw!G0E#S?sa{Ttz!wq|{~6$Y6D>bz4)B-AQZT*G5Pu2hS^BX}!^p^oz;Z@ClEY{}^fcm1&+=4Cpq?o_=s`pz${E8MzB z+ig0hsn|5@8;{b(SRQzx3idvswRiop%7N%IesgEaI?QpfVn&}*^A|`P-FGG!G(vgr;7Nf)UfOu|S5~3zgTBLV;&h`YUi9VfAVtmuKJ0X_H z^GX$l56723k01LV4x*JR;LDBPLLb$8D%yzb4Zt2f@Kxn|hECz>87q~tw;A>d4sw;U z!zByGdLyI`X953u!Z_9x?$6!Bl~?XL$k%{!nKF-){YMd=V@`8kke6NOE4h&E;iGU; zRvy(HO&JOFAuQY7rA?hVl-Ibuqhv&92~ffMAu6jiCH-2@#B)e(UrxY>8|Luy(={xD zoWR(bD`5REn6?J&G8*U00Fhjb60lQ4=zeF|>G)%k%oGlEe`Ps7@i_h5Vj?_i>v2m3 z<$kBsJ_5kg+iL4P7{|VAxHX5jFipW46j4j&Hqa`Fh|0Y_8w}MSea4!tc`I^dt4BfL zN%GYob)v2f+45EJZTj_H;muS@qT!G3AB{EF|L9_as@dZY_LjTLL;~Nu4D#dipiC zz)l@{l}dRGr3}+*Ug4MzTk3ia45k!AVeKnn81%wQ^jR7_-^_50o#L&%e-Xg~YL^nC zOKLhv5sA!Ccn`{;v)Z{BWZAQ4`^+8c6gUCA67?E+EBqm4T-Y^6HDT`_gEMUr7!F%i zs9YhFOUnYsSEE4>Ioil!l!$v}?P*`LBW-r7D@Ij$Z4(E^N@Qc(V%_FuG5ym-wkOJ% z7GC)PM9+R#7z@bfQ2_lhK?*#%&Cw0S*kVcn%|UWc?}C|5Fn`*8-o8RyUXWK`bM}tA z@@&1(hyuPZnaZujibhq8p&lLntK+|Q%U7X~m+lJ0O5pjr%v7op95qaGK2eoL&2pEN ziB>t3yS^ZDGMU)JL5h}i$5+5^YV`8&kk346qYEYR20LfnlG5D2O7M(S^O}?uclV_L z|G_&K=d#9z6Oz#oQ^QrIh~@(DLo58811ri41vco~bV%Tdo0=1#o+r zSCU#j7LLzxKdP*WcZ2@ycRvc^M2kW^168WBSC$oqJyvk@Mo5O&IKy{$5zIK#?`2Qcf(4+Dp&D16Ghv-XUCB;2nT7QekGuZJP@n@Xjx_ZRWn z3J!$xI*nGjeP{6wD5GWq;|^+_&bFuY3Ypw}yEdysMa64ze$9c}8qxaTaKEN@Mo~*v zwhE79sYAwVfy(V-S$l(hP!hMq$B@@>Nm~f*`16c*7)vdMOu0dJi<or$t{JHXAYjM#e<=^ea)*Ffsq8C1|j*@M~C_K&8S*G4<1v zP~EBsJJXKx_ZQDhKM*<8Gsx6g$fo;F-Dm1h`@YD3Ra_zlsf2KN+cRy=f~ZQE#Imnm zwi!@dc+IuR*fe=AInkfJbXYW(u_vRa^V0^Z_G@Jol36Ua|19z3uH??+-?o_kymUTorYu&@GL9yx<_VKf7|k1+ouP_ zyq9imZ>xYweN%lCW1zN5B$T4ly-|O_?y9Te&v!F}Pkr3{NniI3va79LsB3;iu7>{G z%RYE`Zxx$&U!;+&B&S+iC@nxI9ovNNtZsok!RzV81~Ri-_Y@j*P(>SMf?gjOf%}Ghg^;}gwal&gTCB4$OI>T%$Jc>nWDIGU<|L31}Ouu`1TqVjI zxLe=7U$xv3eJvv=IjrNOTbX8{;vNuRfm&@=edlpeB8{*?LdXY2NLiw?^2bWwtJoHP z#gFcAD5@7}_0ls5>vGPCS|xDN`7I;t5re;XcvsnRBa-^aWmsngWC0ZBHk|#3RE$WI zFK-a_eKB|TSVQzxAppx}81RH&ybHUgQ6pAbYTqBmLi*Aw17;@Irk~`icc%rN1dHhv zLp3~hSgv7>1oQjAjq>+3j+#M$Lk0^L;`^%1uu@Hx#uTWX%mxcSF=ZykrtW zm0s5-QVGtd;v*FGFKwrTHspkQ?}4$&mrkU*>b!1aMk*C zpowziD;KGLTcT5?`^#p~2mX(hOOsFQaQ2n2 zYRAyN!dYHOmLbJyJ7@EHObE|+{uIZvjz%;5Wo z%C1Lqu>Re-E-jhBwg&_6y=ec5R6^_2j z^L#8r5YsjkCdGU0jzAd^_^&qhO#nayrq%SOPfl!}eOX>8o12RjM`d%aL!Q z><@8ePXhNo24pGYl`v%Iz6nI_VkqxSg;+FlCzVy zwN`aLSE8@ve~8u0w!d;9Ka$!Wwo)l@Qa~JUHp5C4IGxrk_pvEW-I29x@%Z!<^S;1u z-iPytJdumteLBw*|CXh96jTN|4~O>y@%og?$c8(~0)=KnTguCZ^qUgT%M@s2cQ=Fm z`C)`-CpPU@A^nf1eBYZ)JW z_D{nfY&=7X`7+)uUPJi+dOnkn{>%g1xOwh`t41=2wb|D$)p-p}t z%E?qX)semo^b2l5j*^-l(+g@+(|j&`+$K8r4C|Mc|I28A&;a!i$~Vi*o%tuSw4g!X zqa}2U72hIk96Cj6iqBiO1&u|>RV~*wWVkF6f5cLxiExEQ)hUo!!iB(d)(GhQZ-kYKH~PA6|+5k4$euF z$Hh^8Y;Fozw*J(%9jjCxKPsW)0PFJJC`DMVt_`QX?APaAW?`8oee}(WWioO1B?2*M z$=w~^pHsesgfrwfivao3mZ8*=P4c$wFwiHY|DN*)gROajS#*tp9-QY^uz8L#WHcF* zm+}N7gn?q}uQ!ed6c!G5u=V-x-w*J>Sg|e3$Y6o8~NJ`A0qs~^74*mA|VId|Ld%);Y&&6}CXLuMp zRshWFip?#hKYJ=ce5aJEhAiv#_7>Nag^|j1H4E0}N;XRw+STTFxEr^=hrP5@Xlf!} z^wPXZ5mJU@XW@_xC5c+8Jmdx@tHvllKugnH)7{^`@r&A*IYz-pZ6Q%x-aTf3L*;-W z5c_Ug&TK7iXgkhQph61xmX7JWOjqQ1p`{5ir|n4lfuKdJ!*eHK_}+j(Et4OUFsE|M zR;7y69giz9nE(^oOkIH@j3`0;O&KI<*5qtjq=CYqWBQ&hc%Z+p^j@ADGck%m_G2T$ zir~fTeT-F6Cg(x#e+wLf`CzvKw?3CycSRyD(Luehr$ zw2 ztIk5zY-NV{C{JIOf-sYt2*N7SIX25u;buEidynhBFe3g?o4F7@Z;sB<){m;a3X_Z- z{9%jRCHiBv+h6L7CH9yY3RO$EXWi$}o2$1Aa#K@~a%PJ>df=x){m!yWb^a5;h&TOBsL5$r$Q(oQ@P7PHM*h@|)&@HM{jTOuPD&?|~EABGo^i+{W{53&RLI>4WqsX+Kol_K#h_2N&X zR3F&L)an_Q1zaMMO~_mE z5{63Yeqx!!+Y8ZxEQ*ZYB`O?6u=>pJeI<&Kco=zk1AEz9vO=yX;A04mZQ7!%s^M^r zBv3w#hL~YU%`x|VIYvvcfqmCY86p*q4jP?NhBL3gey4BaPQX~*8e7wlZj!KM&oS(d z12CJ@6~Rv;kBA7z)lXr zaKNcQfJM#c@f&|))fZFdYLn{2Hsx=pd!ZGsZCr$BcHVKHXAYe}DIq;a?w& z!@bNC)qS6DF(f1rC99N}=ot<+Nt=3fIOU{IE~hnk1I~wn@iD}|ydcNxRaCH-6>5L? zM=^ilRDnmn?$$o5ma{_A{hI^FhgpQGic0fq?DAC)pXn)@^zA-~1lJ34mc~7;^9~Cm zR2AXBAYDf4PZgRvPeyT)p;3pnWBdfSi^6pGYDg+?Vhy^~pYk=Az0)5|aTD+-DHM^& zR1JPDDe~p5a0&pC8=W5w=^gAZJfi;Yl)U6`Sor6;9p30U82+qXp{h%DZXYm=-IY)W z>+?%HD{nD=y!qCCSEctw;NzV;f4WrC51CH~O3RWqOhCu;lpc^nAXT8wYnD zGrr8UFn0Zy7vP$%@a*BWy6t1o-D?=)=h--=I)eL--y*s2`CuHY%R%q;;-c?(4etqNhCd;6NH!Q|i0^4?)HJ1R{K*6nK*G4`NvsDK(czHvPww!p~9Z!acFu3)IxCmXfpj!}peb?dE@-5T4%$IR7-OxH7c> z*Kw9^$!qMKTz;^t7yJWma;Xt7dq#O+OYKFhUyd*L*}*SnfnO?w5!oDpAPv~)*Qa(6 zunJUpF*M!Q_W9gW`bn0S*Ojmz74kcJbEf)s@QUTM~*u0#%ATV&ri3OKECdB!?T~~H%(08PC`65vS3i^W>l%Q^1tRt`JyunKC8(7+M z8u%fJ_@K&j@uGK(SHh|-L0@bQ%B&%TZc>1aNxqPXU0bHIYu(`X_Is_b)DSs5GEO*d z6;5Ibx~NlX62DQn*@;^6EWMjPK~A@Ie`z8maH7UX5FZ{LOIIgj9@I3pG5r?+^m`i2 z4gLqK!8V@^;n0u&g^#+04VH5MqK|;A2SK)s7?>4m3ODPj3rtfImzWRSu^;>Dmdn@V!bCs zsr9@h(<)Tu4yc`axioiifQ+U6QTcph=5M(y!Iu*7@QuL!U1|Isah7x)JKMWihz(XyW=i(b~S z%=%LYf+i}tR1V^FUClnn4_`y9N}kzhuXC-sQuJ+YQHg?8T#eMbamkN^ow2tW^|V=4 z)_}nDHfINVt@Cy}1${4x$Vbbh!XhWHV*dfB zqSR45oC1Q6A}6o4_*%OrzqIk{Yhcw`Z*n<&{` zY2ejpiKA6*t8|^X+{P?4m*St7V5i-zO%A2t$(yx{214nK=_nNqERIyLjB%=sU>*_F zhnQBvgRemkGl6XX=`#O@av6CHgl-!`Fam;{R1+kO`E8Ye#mObOkw=TkZF5iruE3kQ?FF%R<8l3}lVagA8 zGD`4@854>;$_tHCSe7cyzbL4S1S22p8CgiVm*nS1pbo3mGx#q5hTw$)=bAhnb&k@` zq~p0B!TkZ%`50B z&(#hwlSZ`1LcbcaMn{=)7+#;7T;+0R7o1S{Mrok@AJ!RaZJ~kv?W{=YqK#gEv=Q8N z!e766Jji!vP@fGAq~Mrk32<=2iLz+_&iJ^k|8Q6QTM3Jk7#Y$Q{_kMY=^fDhI`--= za5Q92=qV{f1EwH}+1gch;J+$)Nz$Ps|o*n;}XRJ{@n zVRq2n2f!1dl0h0<^L z+4v0j_))+Dk+}bbt`#KOIZkx1%23q#ObR#P4iw8O3a1XC7&x1BcI00z2e(qdgg1M%wd#jIbq!A^;161c81mP zXhJc=?8%;L*HgEf=f48bvwDCdxh^~{C(N(h&U(cnH+MnU#*Y(d>|f?vcU)J`AYld9 zA~$rxr?1!l8x$Q2eA<~&s(Qa7Y|KG&rkV3R!u#e!AC=SF3;ySDcR!-h*Cpn`Hwvm7 zsv*Ec@6Ou45$QoEQTxRhVf42rJ#Lss{85o|s}T=MD}Q>CJ6=*H|Ba9^!zwuJYQLa+ zvIB#UKF(6KW09=DUR~g{48e$ z7z&N{fnt3HfQ(tB{u>kSt9kyA$lkr@H}`tCPMdgX^HeR6g6Apmi zCZ>bLTn1K!fv!j%jUM;yKw%8uye^mN!W?~2Qfi2&U8J|}5=wHlU3$3>-qV$@P#dB$ z^pS@h`h-HvpZxO?!Wh#T>VsCRzeh_MSd4eaYLRf}%uUxHz?RJASL{=mUZ5U_Pojm7 zFk^g5K5npA)yUx0R7s#TnvN!W6|mcZBF>)IJEUnEVDPpmsaHZ{giH$0T0j^p^U_;u zGPqV*R04~PhB4)#M&x5tR4hF*&OmviOEs%6%KxC^vm`v`cxQ!TIhiLiz*SvJ+RzB2 z%sy!b&izmcNC>V>)QFz|GY>EOU8dz;y+r+-ag4Gom{tKVxHtC3jpLQsKCA5YrG3i_;e$gnKNj(+ii{r#yw7!xon=IyB)zhs<5~M8WyckChLJI-$88+l>3Y-c>lk^b5LA$V}lJ> zVB+Ie8E-dmFEC0+e&zj%?&e9xz(mAftVn<{!v5gkQEvgC`H!Mi8cUTlA^e^LG2yDmvC7i4E9?=Mv<+6}*@nd2O&_Y9kr9^W@))Eh zY3_T4F973?trF$`A<8J+w2nmAEK+*(1evjr)rwDAXX7iNFZV-vAab~Jvrt(OLui4y zgW0t>Z4$n&L0cZ>mM=(d*Lk1An>2$!^IXP$UNDkf;|XbUWGJ}b=D1S5^MvPk=oH|3 z5{37sJ$FOOV!DP6i@4rw{ffM1mDjfs+?&HO4kw4gl$v3K<#6wRAkyT&CaCHvSdiHJ zafCB8qoJW~cT5K!B8m(P`~4w`ty?b^Yj`IedU{*zk#~v~_jJlHF&OsTg8@1Tkm^u% z+WU+MIR18Slt0ldZE~8vuz&1#nbw4)XbH!<(~RIPE&F;TY97O)a$4%6j+6E2X$y$N z$hNRHo_k5>*J6NB@>SGZGi)ffob`*`Vf+ija}$F(&X_8U_sWUn@ZN~LJsfze?fjjL zaL z_&3*GlDMXmzxIlpTa%7JFZ1xv#g%4bPfI#fJN!8j#-d#_r3tr}|Kimjz_9ue<)}#P z*R+R^wbS|HS@gd;2V|Yi%R3hr4t)(0GYtOfd4OxR_L92o@cU-2TtyO&xD#bXhIIqYdma1&@DMGc9HiL=70*us;EG7w#$w&1R zj9kS7OD3y57ww|E5Vrh80LwDDeh7z4mXnm{CN?>3K9eWS;W>rhHsbsL1l=B6001n? zeEeP=DSLm&aAQQW1poP6JO83s>eIu-5I^En0{UKi$+yPwqT7hkrQsf|NX zaQ~>%Ui0kuOX=`t5n~q`H>&BHXH;epd1E9W3gM0lRx{R8YdB3t1$2BdD4{R-_<1W)?HH52%eZt=L&o4HW@>ij z9j)W#K9N|X%|{usvro~8@xH#Rhmk{Rn&i{OgiCV1Livb8Q*0X=8#fNW`kl8vFScG6 zG{>^uy=j+$u79un$Yro%?_3(9%bwL#O=4Rfp{^k(t&z%VAx^PsF%k8V{Mx;BPAcrS zc(B$xFnENg8+>(OE?#!(x4%*+#C*d&-^86`(B=h&sTo4;Zj)wf((59e zuV=cp%|9Z#{$2+9iK?*yFc9@4plFt3GhsQ%B~x8a)(j z__%KaVkiWL09^zAPL9cr=>Q`aHD1NH+OQFMC{-B3^o4XOjk>q5l0xPaRi8F)xV(^REnj0 z4)bCv8y)Ioj?VbuOT{2DnRj7gOC-G!jo@+qe^UAPi_c^uVOClw<=XvAt}YzpqfIAW zzNpyBW0AXi*Zf8NKJVoCoyKlv=t&KlNfRrnwCnB>Z7rFdp2XjMoZAzJT^tsS32&=M zQ~(AewspF{J6D==;noKNf8X8rdakwI zc2^i}H(RH5_eAh2%avEXIFD%`#HyshM4hV?oo=;y3%ZTCLy1ERLL>r==6{2FDa(3_ zS|7ZtinnnkzzG77mG^n7RQD~YvUii}K}k;*_(dpq&&OzCajgNOe=1cAYD&9t{}JpP zwAP0Q&a)~|YAZMu)-?v|4u@FzU?$i7Y*YQHgjvTN~+f&yWjrTfK)ZWiH|T3>~X}Vk={eod2bf zu`sKviFOY_fKFE(wR1VPmnJyAmbnAw-B#?afB{jF>b123o_d)AV$(UlKzBi7eiYUD z7j(XWen>M3x}HD*1y%j+wzCM#Q7)7~4gvvV#k@w#coDa|+kNsFGD3$bjHcfYXF8xW zx^YDP$mP5e|Hv_J{{E_D!jklxj*{ae_ud(gNTckfo@tg>OFGx3h+Yhw=+aUBFklW zq|I(qe{=T@hI+{J8k!HmyFHHfeTMHG8H=8j^xF0ee0i}VBI=JF4(@T=A%su~bW6O^GD7O5jt zo$poE+OL!$3!pSQo(vx-@x%Bse=OyV_p0qRPjABt%H7nYXwvqAbvk(n0psF5OI}yT z`Ec`cni4_n=fpMhr&tq(%iE{@wR~)@;`fv+(V>Aq7GB<=R@O80`H09K_1<~0zJ%l} zCds+yN&vR^Pg&4;W0ZTv6dA2;_%^FepH-kle3t2Oo5evl-~DMLzC$4V)@8r(JIzTX zoBM^LG2=?YH=KU0h5EEXzM;)$ZPE!gNzLU-Jx3MD%Aa*A_{C6K73AuR-(RYs!9D3p zW+BZ^cTX>@;RF?~A9{t``=Q>N_x#o8h(Opt`CT)yq0jk+hW>q|9<0w_-enp+;{9gB zb!m@!@HKCVoKNw>|uL#1^g!Eixs3dTxbUG z9%&yP`%eTly$)%c?)Kgpak_L*3B^09ED-X!8>fB?DAfP-kN)5Kj5=Cb)RqGI`~q7X zlHKxm40EKYk!GB=B|l>JsEwFj(AFND+KlD3i*;KTd07wO3>J8G9HFwhcqT4Xd#c*6 zGYUOk5H}{&S}YEt%h9|Bv9|5s08yY~{kKe+R6C|GkCZUv1k`S(_}f&JYkS^5373xC zpIF~t{Xk(ND@-W&?0DL<94P3le5CGm88+(6mPs3TzgQI)rY$fuKXk3fNo0{Y+@@jz zd7;PhZ@o2HepE1t+H@^n<*&?T?Q2W<@za|iNN$LsOZ+?e{dBFH`JuFK4>CLOY0ZL( zWXko4FyB<1W2f2T;(D;4!0U_i$FTJFB{NU$i*uHr1P$w4yC%Ki;NZ1kZ|Z-xTGLge z-MnteM9&$lBd^6MuLMvTtyR)CCb|&VEP;lL4ERrd*qDB#EuJK6tsz?Pe6bbUDTC4s zeXMbm*{e@py3esNV>r}(4_tdBQ`1@{<;Gp(t}T4`#R0mHJ!>=HRr|H^EPCXg(ftuL zApa!v<^!&V?${S^_>dPn_xB(#gnu^shW_-I;t9Y!6)8z9Q{JVvhkZsUL5$3qcxI)i zdqvdosUl#Whj!|zG$&o25yG!MNEY26O%W`~;!^_h!rTvM16oX@A7E;N(b0MueB??^C^Rm*9IeP1ia3-`acvx^Y!FRl{-Z4WB{ z-Ow!bP1%_3K~9tNXw8pUtF0GOf{3pvgOsQw>_$OlNM4mD)5}QIEL55lOzb^JF#`+O zFX)3qB#eUhqLh;7S>tvtVY&A$1L``0AvESrr(<%5kwzm(!C!LbV&?VNpmLF8KZ?Wm zIc%u~54FTdE(wJFi=zh#wP+3l1y|nqM7T~rD{rpd)bPZsVu5!)jMY1R)IgOLoV%Wm z96TUPV7~0h+9!$SMkRoa%{Yf8IRxSBfZ?+FdaMtdLw9s$C}GGVRgwLV>P9 zo=k6gwvP<)PdGVXZ?(f~;NNy|f1%fHzR^=SnTCspx5rykXn&T`m2G(LCFH!q=6;Ut>85k;SM65{ z6jOLGJdlwOR6+;C&l@7JoQg85BgST48)}>v2wE9SAWPR?DM3^eMtT`tA@zGe0>l=p zH3$4CTo+7h$`F4>d~+P0xtF=9u6061dHb9M%CcO$caL@G4Eqr)73!N-go#wuC zXV3vVjXN~#xtw7UB*@Ys=hHx#hhG6ljSuG9FzL`dkzVi_;qVnD7Hi_58T+4NL}~gk z@gnF}NO!R9sImY1U`MKD_2ZV~2Q>IO#l{|-i|*3qm-6$NKUc?oy~Ov?XN_hv+51J6 zMU+F=8XlX)@_JCWDmGSnC^q_1RYrDHR8OC&m~?+#4Ycho>~P<9UQhfOk2c-3m^#9td1iM#>efgcuK>o~Q8QX=eBIc*x6b46 z3>Dvi@M!Lp-WTNlg8HY6*~ov%12=b(gdE;fd!&yXHWrA()QDF+4jb26)8Z6-m-dbt z8&l$upMi*1j5F{?;G25ewPbk<7ynu(@a9^#_GnL`{Y~L0)Q+3J(#5ss{V5ZVEs@n4 z?xvcN!qEi9RL-DEf)epiDTLkfKm-5D^6p<=fE;8!Cu#Fs@XhOL0c%}oA**D|m zeNAmf%vM83sD(+JNofTOVm^e11}+ea`nY*?6biY@HkGb`7u%mb1l=AQm>*q567rc5 z54ixgZ(_AQhIsmcvX&W)u}?J09*|3~BKF>6C#?7pCH?LCW9kKBR=s^_TC8C^(_>ar|tb0VE$ZYzCyxs6m@xtpdoaQ|(D2PRBa&C@bt)o7+XL3sk1%DKgV_H&+aqBY^wbxBo)K%Y5;wpIB z23cXR1Rl}^j$#wm);JD^2=T9mJB< z%oR3hFA(w93TJf)IBJCC4Tsb4rzY+q-vJwQE{DF7Jia}|Kh_eHI%xUO*&p%A>w2gx z)r8T?3AOh^l$<#DL22EgX}q8x*i`y0Ottop2PP;M-m+-^q6#zLY<9YyC@jcy`)+W1XXn@Lt(66f9j zQaIAEjF+Mr#R2>sk)GMCE@k1hgRGAhe=dJkw9sbfn}dT|FR>$w_lfTywsQWQqG;6J zpIEO}U%h(vO8I4!83KLCdtz~4f^7{XVR{CIPcK!hkbZpg%9CNi70Jbu#gLJPcrQU= z(w}5w3?}E-pEArd%wreQ`S*sC9nE$}pGL0Fto5aTb&kkfYG1sL7hY*Z;LgCLq1_~1 znj@vXTqx&sR*e$?(oV9t-&>%=ov~7JKznBDq?K6(3zblm*|u=EyFKKAieF_vLgO>G z8!!hSoTrQr)^fchmf+q)Pt!g&3~Gi!8+~JmP7D(Wj&C*+aUF{Hd~0)ia~}D_PBwyx zt&8VeX?Gk6iK-eOJ~a3cGxB8XQ3)2zex-dckTR}DqT{;jz&)8t2bewhKpN36G27?l z@#s)>5-!v=>DVCE9-$V9#$K49^N?`Kd4zQ zuvWpGbp($r;?Qy$D5HoK_M!xeo(v2E&QF%Q3x|5q`KzQyowx6cgfFIQ2bEq|OJ*E!33f5{! zI32tcOi`8ikmdMQxA+L4+qm!Q3)+qobBSo+9oy#(;TG zMsk!G#bI+}dm2)!y8N}Ei7*IW?-f84^u!;wjeEXCx+-`ek+Z8{IbTTQUC=Vf2p%&V z3~@4DY~IS3*-=&3^g(n)?&+_tviQVNt}#l5%`cXul;#fk=Z zcTaII?q1xjSdrjf+})+P6D)7KkL~9h=X}5NBN^i!S;<;+UNWx*Ubd;87tyd_2}g4; zh)0>V=8s4B2@ZPAr)JPr(IrVcdW3OaT+v z+Hx~Y1iq$R@6Z8>RM-Bm1dREDo(VS1J4>~9Wxdf{}kmvuJ6!&|yX1z6^#Hs>K9RiR@)(@x< z5yO_-0~mo)#v4#t#j5KH;u{x|gyux6<@fzk)8ml~6d#|IDI$;-lU$P7H;W?2Q)d7# zh#h(l(!w32&Ha+7zC1Ne6PRFaAE#j12$9@jrb+#3@2>3IP1)g%PUBG2>Dz?BHHJGXPeIEc&Mhmygz^J34=Tc>HdDR%FAN>n!akcB`757i=BC|*a9PY z$w=K~^~LciobG5Xvj27IW+p$@Sc^FSqMwhzx}sNBat37Y?RoP_G9~skA-?aoZv&?v zC=rnjpALkB+b>L;LJFLK{(d(J3y(QRa2z3Qc+oLDd@+7(lV&4M`r3DpF?n#r7@(^@ zxiDT>^)Tg!kIip(qhSXhMJA)+3U-O2qZ-?rkM#Z0XaXP>aI_X8JJpK4p>Zm$B#~THCUi&KdiZ=FguOxQ>HtSlTp(Y z0yDcks?gms2QuI;y=VtKYjH^)R3|>nclUFr)Ts`3io>5@ncQlp;$vcr-?&Bc-98i72bKtGZiJ z6PsFoIb?KB9m|nl3VtO-{EU>8bsWbQKPhxHUiYDt(u6=^Z(Qx+U2$^ToPHk(JD1b3 zHq-mD5OtITo^8&h=BF-uNASML!mQ~84awB?u+a-4o_w;6*$c7!408s2A-mA~FC3m7 zz%gvU`|(iubt0L)LQ{DH;lLAj=+vbNIY|^G3Z>~s@bv}8yM~6~G19>u%KrF|TE^8X z2BTrr8b>0P1dU*L2E%QAq))y??o%kFM}u?z!w;vTc(QaYOBq0qg3Mo8Iv*Dv=Za-v zUV*j@iC6mkwOD zQ1jp#xIA3*2L%Vc$H0&^iNMjbnrR2+e|9~P?;W9<0m*>n7a;90TBGu3j>%XDY^_=dWQu7&E4TnoBp5MMZ`t!B_W zU%GHWh^6XxRJXRaUt(U$9+ZP6$WJQ^(j&O@UxuYjWc+2d+HNIt2>KTTm%j*}fkycf z6|!#E7EMQly;R)oiFr&{5w5M&Khre>bSy!Z&!C%C2@ zs%%=Oz?Yksi|9=Jp-K}trdj%RdR%o=?qd?CFS2DhG>uNmcDH(?W)$oJ8xr){mdc#K z8`)sF)ujb$!2a#3ZDD$P+e6nYI+E0piuHf51Fqx30P$bY_5=0>TZk16HD9h z?l9T??h{M`!G{@T09m9a5>ZROsJi5tdkz~bb@II#Npkk%iz=5;Ra}a&XgN|nntYeT z&I9+*^UtkCGv(WI)3|G$zyju_$WMq3L9>z>Qf*g<9`LS~3V}X?u{ zr+64AyIN-2NO6UN&vp#&RHeV>50&n+;S4hn>XtH}f+;q#qI`vC75|8HgeE~i+T^6Nh&~#LKvw8)PbZ8XL zbn!Ok0uaJgb;i#ZTKnV=2h_Z+LVWgil%`i=L~Yw0uPkJ9HnVEl8*@OaQB-5lrTN8_ zvtm(2%{N^n$1b3k=}?h)=U2eGjmpZWnLg(%8XS~lZXVKcY~}|Z9D2g9$w)Q-#Of)5 zOEBvd!l#g33|SUGZ(tIBq?H#g+NEE5A;}(^_0xDQ#Hn=giogxualp!pI|&P=}dRHTkEQ0Sl#U(%vVhrTZ{{UIevw*7PNEE z3g}F@dmwOVqB^jubJ4G5UQQNE#W8qJRfY4r5pe!~QYp23oIM|Strh0(WTYW8X> zFoyO1EWSON9_JUnjEgh~lwnDnco~(_%gWASHa#3&^C%gae;FlY<(YK+&6fO&P?T7K zb%(y-nW0u(rTb-e=U&P?Lp;>@!snS$-|{%T)!q65#X55KrbqWD07x}Ej`@A%xV8C! zoTphhvrO>QrBy=ujLl4BobO6F-#LF%!z&GsyNhDbvuLu-edLwD++z7*G!U2r9IJh0 z^V?;gw|JR|2mLvf878d+NPSh@TPR85CA=Qx<(hFGuuds-{HpkM45m2?1+;zUrqti6 zZkBZ+df~IRYS}(rjp*p%-;DM6c7^Drte(F-ki*`4L1_()?(8sQw3;moZYoC7h(Ekm zm}Sl{T#m_gp-z4|lv%O-9XHe$U0PDcT_`o|X;-w~5gIhh$5sTaV-C?c*P%T@aP2`bFX0p?6L0b22uTGtAd zeypiYY#e~tb4DVx!4o!OF3r??7A(f~>3w_-NUbAF97LL&5D3m)ZrK?&f6MNY|2z1t z)2qd(ecW)?w1joWPU|QBQNS}-OZYr5F;+}hYvOPBj+gIuIlYY#`Hq{3ST9#@q!c2W zA?X*v6v^HUEnsvwjaF+Vfoj_7{SZ(bsaucf46O3D#gU=RsIh z&CSD<8eh*XFms-`(eTU68nO;Yie~xBb01!^EfK6l%@~labxYO|yHfsSd_{|f{j^1V2-?l}Y4>}V%Pjk6`oY*)GM!dmq}`||}mOE{LbY{m2R7a4M8fk=u+lDM3(@oL%(Py;S< zG$;Jp)zId}iFNJ_c`uOHcOsX9^`2$jx5Zzl0@So!E}jAoDe#L-dgP?txk)`z|7* zf{J{sG3DSPqSx?DbXp_HO;W*U(>cuCL=|!Hvg_`yKH99m^ zhm5kK&5PAj=9Ry{|C_4YVt-dp^RAEwduGEt03*kDkq=^$(Jzs2Q>U?URlI}!-UJkP zy(Cq+K=#y8Ga(c`oo zXsL?y%XOY^TEze-le+Fe9yhLZ-IlE(&D(KiZDA$QlhQ3%OlVT*3m4V2(&Tf(w=iG+ zaO(^BtkvF&Z0HIdie<)IHBwL+%C~f{<+!28#fGajz*WcK5131AL$+O=6#6vr1{P4c z&EXuqtKVm(gWr6E*WA7^VixG;a^R97l7FFvj~{Q|{pR_pEPRD^jrMCT=GAPNr_T=9z{PdhL z;$gl-7H=wYB6}oy#!}&Jyi$Qoskb_iUUBg+x z+2~N|d6>}~^hAAG>|oK`d9m$Lna92qW_@gflb>u;qC^b_$uI}+ue zQ@*$4`Yp9t8|K~@Z7H0kU7(AeZr3+dd-IodGcn!4RrMXa4HK2R=Lb@s0OnzQ-4R+N zyg2qOi^8kLrkQ-dOolqGXHcC9s`M*R{*D%6|Kkm z#q|PqTDec#&HZ&*E_dEsPW7cQP8&Z>FRw*^?N~KhE%rBLul)2+sNlE)$2*&Q&V}q= z4lbp?-sTj_-#LRV8mY7)iAb>7`ALy72ou>qv`XMHYl;SA2djq&j5L6q?jV}jr zDXrZh$mk9g0Rq|nH;gcQ3}3U_A} zto&yT(KqN4HEn;L%8dm=II_B}<3@)T_OIfVn76MQx^_~D0sghOdEPqwOpuz8zRl?a=%B&0t6jV2t5#UmWsodT3GD*KgwJ|e%uO_~f#$-v{~ z^u{disUthaor5d}TW0Sqn;i~negPLcUW!n{{%jiXH77;);`eFgkP-sLTH`wfbK6hf z=5t%FZ-T1Gp7bLej~Dy`KZp}<7X1_{8DsmMVme0xJ2ZgH!n^SEYszm^CrnJ)HctH? zXxRC_6Inoie^prAca zz6ITf3CWs8AZZ4D>drfF_Z5y(-H74gb#2PO(RutM4oaW2^13L0N8S<1m_`!_YCmtI zpsSAw&D6MkKg2ycco2~%P`Q;Ak-P8e=^gb+fxF^&I{nO|Ird?55S(g6;-{P%jYSD6 zeJbV9|BD^lJAFlw(ySAXH~Qf`G1(_LDaSu3_c;i3K{u|x-rpZ&?pYh>?|fC2pq2ic zU0ry%Pq%ZZ|CLuN0q2*+Oa*L@(4j(T5(%p_z~*Cz+~=@A$M7u^*jesV zNB78htVgmhSxXUx%nZ6udV=QS{)& zWlJF=jH7}p3r#FmY7F9h*wdE-}T}Qkc@^u!cK(+bg$-qy6mA%~{C}3=%k%2pihZC?lb&5T^Q( zBj$W^5E!HI#@h`JJ+4YzD%!cSOrUO1dGKna{Lg_jv>wlA`cCx&B4jh8C#IH4{RbM( znh=&cFo|d0sfP~$L!e2bD^1BD1F(De=m>dJl9ki7h$koQzx)d83vctrmPx4W$}F^F z3hKGP&ikK`{}(GUM9Kd1e{dyz?Cbvl^PStVaMN~1-z%;+b{Fd>y-oq$l&Vn5W&g0= z`j#aX%?FxKVrQy5F@R_6f0za(anG&@T-dHgPGUZtH@u$suK<^%S+2b1T8<$l{AtJ% zchOm2v=trJa`#X+8pjuZWo3^wTlvG~P=Wr!$m}pPORfx4FM(xXFv@?Whrz8_WwiG@fs#;^4IQu<$KG;1ZKDy5 zKT^YtYxoHVy?Bo8vG~d)dGCeCnB4qsy}Q~RNw?_}x~&J#1EqCSLmzO3Tm$U9UVFBv ztH+&H?Y!1)zoHAj6u`t8AUDtyZ!<_Zdhi34gG3-4rmB&4$E91bYB%E-85(lxJ0(!T z1ACk>Z}9ZUe(hC{qkQH(lI@P88&TMIGh^|!-w{h0hLL-hR!Oah-wYS~Sw-F)J<-(D z7y0ZYOf%P?i81}M%Gx`ywPlTHin_M`EF6Nd6!WqDsV`>a8|!9ea0PyvjP@wp?eW_p zLuTh)=9~w0!=v$OrW^~BSAw-5i2unE`|5jn^nc3Ye?DKKtTRQJN7tzki-X4dAwf<#yt{c^hVR6tA4Dg z)Rn0#u-4SwO)-NTlneD5u`(=K zUZbBqH+k4)T`ut+T45QUv{9fN#=t)^EoGtkh5XyiD){brDXymS`86}wRrgST#PGO) z5=ik@mmf>_Cw+6Dlz;yi;&>zM!5Q(0zc~6qQ0coj-+gPsZu6e5RXrdDMOK0|Rd)Aj zSBG%IGsF43A7l{TBFjnN2IEy1UdiQMg zO3Q0X3?7HhT_5ZO6S$hd3%SxfZpp_rqkA8A+hw#AdO59R2<`t%1V`>W!T@`^`lHL+ zL5xUHpWOn2?IITG9mx(22ibe9kbgm@k*pN$$g?EhdRQ|7NzlQC1J*!dm0UE}`#6(81LS?7KEM>*L|FKes*mlwd|-{|QLJUm9T z-$!;S_wOO;>g5`9=1nSPhq`rnud zY?)Y%r8`uXb#9$8I3{Q);4z*1AF!18-A`D|^5B!q?6<%}{apqCXnSB#G6lUl4ZseI#C(`!4jRkSVhijaR12C#yA^+AAjK7F-7fY-U_1E1D z<^(b%TY(6I7+mj7^v0BWnV4*lFA5Fs>PuNV`+b>1iAnT03*;?SK>V+@Egd)9`vSGfIH(^LO%T=n+X zJBB>6bB`>~D}=3V$X&s#zbAf@+Z;OKZ$ zJo>^&&>sHuk%)lR;fY7z`XGvH3$K-F?z{bVkB@*Q!X$i+Ef~L?np@)aTdl6v93s*S zp_~$Evz-mGXL2<;)jZ+haKu>tepzi&V>^0Zh*_)mBIK-CoaTla5f9jeg2VMo?E?)a z510J>YIX@?!@i1LqDbzYqhiEBA)k~rl+4Lb*#>u1oH55FDw@T5-sayM5mYzSy`A9a zl_WNJY6LmCLNJQxPi_I?CvixrCO3@RDF_MHW^H{7O)}4^Vy}Z=n*=rwC_@2jP>;nS zZH=S7;{F~gWmc==@TxxGM0DI8Kz^~W)Ep~R5-Y0Us-MOi0~28@pI+ndP>cMr=GAo^ zh{bP%*}_Mv)+2<5em%P@N9!(T+NOlxg>O4U-}ELkrX|)yuE*~sDkD+0ccxO}w|cWX zFo*jnwDvfmx+T$2oO7LehK2hXBd@n%fGGLfH605Voq+(Ry96#TPc_daeaXrLO7?nt zz_=8Ee0D5UO5HhDVRw8(I-?fzaN8jaF5&LI>J8Nzqz1k$75I6Kk3B&YR(<9`IHp=# za7jJ!n-APRfY3KUoYnVmrjekvQQ|v-&5=u9sY@JH%CrK1WYG@y>ypx?4yMfu}1=L97Oa6c)8?RGe8!OssevEa6ul@OlV(B*gp_bU}meV&ix%P@ON56mH zI`C>ePkDRtO3hM{Qbh!h4mEe$< z)0$m$bJ4+@;)t)U6YDPYNw7GbN5*nRhTi8vG{-AcEqh>E1}2JyGS8OBm82cs3%|BMFnC7}iI$Kos^!O-(ziGw}N~ruS}dc#(pL zmqfLqM>XOcXVT1ah|`M1;q?tZtAvS6@O=suAi9PKjA9ZDpHKp9`#ahY{0G`_!;_Qi z2)IIn#|XH^eCaP2(DWrF#LV99lY$@n)v9P#ny9qKK4m<8rI~K}gV#%WIX6yZSB+gs zxEA~n=N#4&_jQvjROPc)zEq3`pcgCXpU5F`2@;?&@&9!b*n0)H>z=gIK4V2-cNl}V zBXQ|PpU$8sjo3fR5Rnv;8$P>HOBOnkVN+Nx(})zPzrGds{nq4bl2EUEhQ-e1J6~XL z{LK%YhYvZ#GB`RGZ?JLyhBN|qk2hT937n&-8Pg|Av=Bmkr!r9Kg^l()7C!rE&PywL z;Vgzc5=&84F{jwbS@p#Mq;ga{4N3k3K*TQ5@G!>fm`(7WbFK`=8>%>FvNp>z77JB{ z-g%4oS(p+upD{{81?gtyH47G@cqL;+0^To%_Jv=?3X&^MCS%356)oFM-68LO5{wIB z;#VzpYG(9IkR@c`$pzGwc(7|Mj7)Y!7U$>&q=5Qr0O{;ckwZ})V4&_hEXBWU_@T98 zQF&BYR@O7`2Khj#h$LF;gnkxn2$zQl`p1wfTw|%&Nufl~mqv{cQc)ZWK6+x{*O3U8H^~}l0n1>lL$+4~^ zn=!W?u)?yAa%FuZfI(-4f1r~UC_3SI!pT8_W^*(m#biXYC5@-{wzPBOfu+!X3aLWz z$zqUzlet*eNpZ`rYKiV2jg^0Evn0TSF}HhY`XUbXa}JhRMINF47~N@>%WaMG=@ar; z{}-_jdQxyuxWQvsJxIn$h1s5lKU=&`#y~6*nD|}N99!~>^q{Y6r&`IrH0o@yu4H8kXz7gAwf{Za8vtU6bW5 zWbLS%Vj#VJS&Qe^@=x4+n)^-bByMHjy`;_SvxQg8+_<{!I#ad&f~9#EXe;WPUmo_1 zC9}v>)41B0xX{o_#QzN+E*_Jafn?&AnBatIrn>#M05=Nwsp07)0>%fn=9XW^0(k;E z2{P?9DdkB31Caz>MG{o+naz&{&m4L})Y+MC;l3%Amg}vYRnY9VN9Sv6&BMtv(-4P; zMr@&*GAy>`vfh>|=0+9Km0^a?-_XN6^JkRlm6Ypc?_+d&>42yFIKmm_M@3hzV>8;9h0c1F539(+c~h3nWj8=kfs=5 zwjQjTKFjxOa(QVgVcn#Q#`&@p&LbKa3NBx#=Dy%74%}k(5H=#sTm>S5vKbv#KS*Bp zSkjkIv;`s=B8&v_MXN8tiXN7y1v?}zXp;792;%kLD?Z_g%ePj$!_DgrxHNo zejq+<}r^su~$LWntRT4_V-=OxOV84cmu-6~=FVWu)r@qqx z&Hf8|+^Ok*zyC2p^QY^hWf50Z{6WB*6)bEwNLT_L=8KxlDlv3zGOsD@E6%vwIt}LZ zSy0a0ygd`6rWXh^HqReo?9U@6$WiejVad{H3`W5@v1D^$x#{jO?_Q?B2d~}fdLOKE zna(QSHz=6wXV)N{N{g!p`XS9|1CN`ezF`IQ30dH0iZK zcD#TntH{Vp)?#$4Yg7GBpNCo6E**khHPE}tbx)KxNqj!t#aUVJ+7@1hmU8}vS(Ngy zg-$M^R27hYi&)Azjxy?_=ECDN6FCN3Tv_AB4eR!Ol*JRUO_Ax97n@SG$ynog8^xxn z;NfJ87<5(iN?Ji;0a7hzL%ext`KQL-slsPyfGFwiX$9wr*|J3;OZV`vxhU`XXQ(^>Wb%JQU zZ?_F-aIzMnpS7{EH%*DpKylZf2wHHqrtE2*H97mK9NEq%ISBntpv@w~9uIqX{W2Hi z%H4r>(UtGQ6c&(~I3GTA7VBym2ekkxH)oXe_D`bg)Je+>^^Z$q(Q#1sM>WW@F`vXPrj2Se#{2JRF}xsJCNpA$&`tJ#YgxB#HFqa{ zgXry+fMs-3H=-1@D&wJtX-Wb$wG*C9*5@VFYAMs15H&F++wD*i;I`R|XfPXq?@SWI_~9ltvWhd6J(dOd|1bRfJxQ z$ZnQXyOV^C@Xz;XTx!b#Lbn8q8e?`g#{CQM7zSTlri(#*+hvk!%CU32$uZ0;Po!JvMB)^ySjiGsi+Gw8sbelS z92#yiKR2KA6;8tBWicg1NIbm;KM*cK_Qq$P!()&$3uGHCbg8lk4G&{b%S;5dWDpCi zOihg6A|R#$!yS!hu3ktUj7QyLB*pCfH|&RZRWO%92N(+ZDPGLpaj32_4o*dq zY2-NGA8(c^m5^VREzl44zPt0R_rn_z0;kL2bE#d~ilI19a~HEaoDIz!`h6kR9gCvU zl&QTekksKmPKvcqHc(v@IsevY(}u3_vp>Vm_&JS_FCGmCKq|+?2ZUOiL?3C3F@AU< zC=84n-h6>I4ArbXk3erSt7hGawo`j}hNQOBWS2?qq78P`W(ZyYCY$Q{iyNi#fVz+L zp%3aF&&fmYgvV}A#_p8}0usnWd;#|R9v0cora$l=6NcV`q#~RteyeG`Pqr9idP{*% z26Qg=749D=l+`#Vduck-yv=D>DC%0d{J7+2Dq>l_F{;VV!|ep`#|-IDnZ~);qM$J$%0{s@+UF#knfGdt4${J$a@iboEw-2^YA$-$!NuL8Pg?AS>vg~Sp+kbVP*pY~h-89Ug# z>mV8UcEWwY`UBmr3@PY$#8{3cSoSlFi4z5CjmH)YPJVCKog};;Uyjt0@WRuoiDHnM zQSb1Nmuq*PA2;u++rf0>FO8Y>i!oZjkvuf>PR;Y7>RIgYl?Pubsfx83_=DlElLBhdzDAXzdfk&A?l2-`jKO`@OkJ%+Or4=gqpURoX9wU=1?!ajBB{@w?G=Rrs z*6El8x(q`5Y}8>zs1?qB6Qs%Ots*JA5tG_F7bmw;DS=$L!%~*%TVi-3G0i+TdE=kT z@%=c-6LtB&Nq8!Y}!zYF&^Zz+K4cbz6L@*~B}hL5y{+l$Hb zPw*GIh1SQ~5P*iBLWlkLF{0<8g3Q(7aA+j`x)bL7H!9&D5t_F*O$*Rdxj*Ry;3&ij zdxWasq2(MXC}-|4swLjo)qSi~-S?Hiy5TzYBqoaKV`_dz0Pn+yb~;MhXfGMbwlUFo zubwvMuJN#+=-mGI6jRE|54PVvXwBtwejSz#?$>=}{LfkJt=s?KEa{&287;lKF`xX# zqK9SQ+k-UUP-4j*=1jv;QAKA#q78OOw#ui_454Gffk?%{9up?gNQ`RcKLU8!w@79qgo}>v*Al1xM zY-r_P*Mj2vk?sBJ*vna(HPT__=%R+>NEgxTQo~Ha=IGh0myrtb#Tm=9Xy}|v%-?+B zMfon*T?5nsf~^5z((`2b{Vf{mAM_m;!ii0Lk9O6f3NW8wI*>6XTjI=#eD5SZx{L4K(T;#XECe*z-aU4Kn%Fy{TGd8|q z6GgQXXA2+Pz>J|WyUf0m-%{~(NGRmdKVBf4P@`!3^c`_N?Peq|8N^9xZ=$^IbO=b4Rc{5fqzwE|2^hU%+^6 zWoeO)W-RS(U*_4Edv=a$QAM<2WChMb&R2>i*Sajw!*oC9u$qbCEsJFr=kZ;Bm*b^Q zH+Kuen^9u@k*CQnj@?4Z}X{q&g|?oh&zM0`8Rb|vAL_wuCI@RQ{bcU-NPnZrha52(NR_i z@Uvf=HX%?CMhyR{2XjKh54tXwtKkB0csB>g@GjcKwCc2!SJw!n#hIofj%jYsI$LT> zf(3umG$RZ{sVdf$)?WT2dhRurzoVN!k@g*{^;+VO%DzW|39X7NVF&4P*@CFA?W&&B z3k$SS!qhF?hK7#`a!VboAMH2i>*1=Fp%;1H8Sox7w|i506Fjh6yDG(ZkJmsfXde^{6MbYxKK)m=V&VKt zc|~xFJ(uRZ!v0Za(>Wn`ihpCST=d4&MI{&^dGNn0t_yNT!Vd@QsqErLJA-*XYpXDY zOmWtr>fIkOJJ+Cl$3<4^wuV?v3U-;umd%Tb4mn{eM;$!D9ce-j-P?ubWsm`%c_*y-*LWXGNO z7^7pY{`Y~-;A;a!Y9INf>O(}v`s4XTA1X#56m@%iwpqk-aPR4OOa9~?IHhoUqwrPW z44Yd^tIIU*KY}azuD03V6<3T0kKX}1q)iZ$=r$u8-^C)1qatwx&xeqk%O6lf>K5P& zXjVUPH<+G!kdaPCscD~*N4*pwkMQ_cPwY7Y^yu^HN z#Lk>)Q&I9XdUbtdGTtEGWil+ruLPiy-5pIQS#%yiZT;*MH}`Ky}=NRNB{3Ge~HR(=c{dPXGHqQ3F$~wNTUN~ILBWQ ziESAejComHkzJl%F-1g5<{YnxV0%Tj4&t2-4yq?@e-E+zZkk{C^!zr(CAXr0x+PBwT zJtf&VqGfJhhdOGEnKQ$_U!U=?b%w9rJ^RAeS@&H2RF*`H>l~>To#MLp!99qO9v*`^ z{#u~+K9Vz8a+mLXlkogIcZt(Rb^bXpgLLdwJmXBL3YF2iA$}aG&zYsv= zd)j<*X?f=ib8agQ<$6#xC@^0JA^@6r%0LHf@uraPfXYE+z^?Nw&zpff6dRJaXY&3> zeABzeZ2EBHccFKHpx+wrfy6kFR|wm`26ON)c4v*;?O+XC$!`2ISi0AN-6h-`>L>#F zU+uMfP64Eo21UL}BEn|N)yTMzS1BDE4cK-EvQ57Bcj)pXUrn{n70n$qI@59tr_Ltw zX&>2At3Z;!Nv?J=Pe6aTF{mjgNE#{doa-E%66*>3`mXaEh^#&8RJy(#zCB%}JGc!d zO$~8LGZ;zhd{@_E7g;66@Pdvf>mj!v!S{7O*7=@VGnEuFPT&$s#|zpQ5;zEUtO*>k zwx}spFMeJciH{oYo*&}A2_7rz9!jt%JsE{C%H5p9mE1iw>VrZMBJ9RaU7N=^(*^+7 zY&@tQe?tYK?Gjkr3LE%o$Mz8E=}iat)i>-OmGX<%Zx}U5R3o5h&u}uzq8&>Z}UOh zL3hCn@1opuEb#kh{beWcZN8$a)SC(jw$N259fr*#&TZ(v@3_TqM?w7IzT+{s;A@Pm zTtBMjIJJk9R%4`t4%{_wlKA6XQ|v36_mO3wqHFtPpYP95+xDO4Acu%orN%?Z=j=@u zf6ozxK?O4CBvb)m)6DEpV4xkz=0oxw?*($y^4rC)!#G5o%GKOYZ3G$x;%9Lz`+9hn zoV{Tq?Tpz=dbxhDkso>OzarOsWDuSrcxViAw%(Y}@C@uLB+MJJu&DWbk`tU+$ivI(5Ba~D+!SEUWKoEP0ulrUW6P%*Z zo6=2ZEVIj8=Of=McYAL3X@MQBaeeR+FiL%Jf#Op3&d^*+VqotgI5^O4(X^d;4?}Z@y7Dp`JtCI%f+jqs+|W`Twel8*ajm10yc~F z1j84_uo>7z2M(BeKnHEv3r;BnWB9L)3|*@cbX&ILRj40QWO?3D16X3t0fb-2x&U@& zaCc6^u3ZP>3mUGVPVDDI;I<>oJtf^$oWbTkN?52M`YE*Vr+>|PffYtvu4kYu(L$QC z6Oo4r`Cb!9KyXk0kdqWViYKk?pYrUBYWyS|2w5Q#K}q*nZg#~Y7xMqAe5Qqs@tnS^nglK~*MCsu+_iZNg0!pDK*sNR0#i zIv<7am=1J*$Y{x@{oAy#F;Mvk?ZKAAi5H?-c->P~e%=sN*sNgNK>LlTp>?AUsv5Rk54km{lTz6m+W+FPNJM(v(E3#x%V z7Fya`ToK9N!Jc5h9fSLEe&kp(ivZ90N{QLSndQrBP`xGE&jZ-v&ON10IV$9d_~sja z-O|_WAtL!!%Bz_0$Ztqc&LPKHo*vPkmOFvtT6GlO1TqCO;>Y|{WfrC13oRJ!m310^ zV;9nDt3Rk%t*e((eU_M%1X#~jC6?(iXi>)9n5>Uq`T!~4#%Cr3hm4*5-23Uowm<4T zE_laqH!8r+d%lftF@^iHw2uU`1&EoA`TVo?|s9CfMAg|zQ9et8{)l4%#la^!fjdu|iEp9y#(=j;g3@z?s<>n^*FFy> zn%<;95ME34uliD;F*u=&oLMijEtj)SY@zNSpH>oG=-`z0Gixk>`rNueFua%@tM6_b zuFy0+(;cpYLBOxm_~S({(Yxc_C;|zFzW_z+C?Ego;e?}q_*%!Vv{r*Ag8r$}{dqa9 z^|gL)6#UPd$p3mnk{sIi{_P`w$@Txz_PU`u-*DKwrnN}K^i}jwa_i8b7ISWDCM5Dd zL4r3hGxfB)6qItmJDQ>-U)I9P7qTg>1RlrC!J#O%$-~(ZQ&n)#IElT-4THIu($HY# zioYHdVD9C@z%tp;nBUh5a}QF>_^qB8o6dHf?(v$QFnd z+WZmzR0-V+I)_#JTiy{9VXk?BK5X4PICW-}jVQXh|2fI7In;j7CZ6XDM8;V9&uCT% zONlDVEqq8GV_=WPwn?DS?Q8Df`hQNo@k9kY`bl7zyW6!wcqyZf(@#>h#&P*~U5#81 zR}hszX8>*PqR^PpK5Sg+BoZPA?WH9nNt}-#7Y~BX=utF&37fC>K1jdHE63;EeU;uS zl-2G3tzLtzyLIF09NPvT)r8pi0YR?W=Jy{ltn&Fd{Dn2>y4x+!A$Plistvm_5a~3_ z;>a3pGE_^@8v7IGWu-*j^;W|s#o^V|m0BEIi?0zO{r{uuD#PO1wqz0#2*DBvZoz}Q zTL|v%?(S~gNpN>}cXw^vCAdp)m&UcHlY8%*H#2Ye0UvF2pR+l;)~Z@ns;4_D@u5Rc z);sijK9&LwXtQv;5PL_mQ{X-KAh{b`bRK3!#BF556HgKGzE}j;czG|v0(O+EY&$z7 zb)bJKXM#vRZxm7GPItG4@w>12OHwPZ7DgjG*GHX7;UxU=ZJ+NnOHS{?R(;*-&}bjp z$2-Q5>>1}`p!!JMc-sx5*4aic@*bE^rgl$mr1jp9c1x%tZbiHz@E_krUTqNY{!>D!bys!Rl0esZe2Vb~Y$qE#{QhU{or=!>N^ zMrla`YkXA89^<=*7%0LxEO?320WcD(9wTW1YbP(rPv>G6%_EE5rhYP};r`keepCso z(X}Sd2lOPX!EpiE0z-jr?}%l*&V&>h5Jh-`J+|~lY27%4xB2Z_kyy*2(Q`f&>LJb zvrCZ;r1)t9hA_skifX`hzm`~aHlX5#h_o1)0~k5m33|Cw1|)?BTISBPXPPL#`IS7` z;w=&PO1%WLB;>E!7)r3a85IU9?yA!e?!5T|E{gN2V)PZoNcecoa;%ckI>ih>__13; zfGFW-IjoBUj_YKwhGzUAN1KmegCoQH?)~m4#62A}?wL2$(|k@g#-rP|>~?1!R7_P? zi?^r%LYMrVW`xHyWx!JTfkjBFTTn>WIq6_#P{?}qAc(!Y<^uP&$JTK9zFX+<#l{`$ zbgf&F1dNBXoTJ+g&UL`ntM?#tgyZmSE@{FPH@~!D2ivAV`fd_X(c8M%31=}j| z!!Od>C@X}$ZnmruAX)U#D^@PBlRxn>H7{M8UP`r;PB`*(e4=<}rG0NNO`PO}`WtFZ zCUwTF+(Mj972&}(_3f4ARMDPJ!JaX!!LB#foUW9<)TStow_a8g0T7;OM#*B3o}|bC zI;wMCgzCb>x{1E%COyplEp)PIf=vQ#i`wt8ndh>wN-kliP|4AYU#&BtLg~Bj+O36a z?!WpG0rGM^k$fcKOW5}B0U=@*H4gKd(~EVHAvf{ZGfK8|NjT!7Y6R)jAIaTb2tt)? ziH3&d-$YmS;sgNmEm6U@hxVUh@KFbRKZu%7m%<|@*Xpmwp46%{hhsl%1bfY?L{rI; zi@);bu!JG6V$a&M&L$f+ZGMdQLo(Tlj8{xPE^P8G#Tn}$OlH~}4nhPxL1k_jf63gS zan^+PD27dajnK)PHwRrB&?q89I7|bmk9zUIL@uhOCq?Q}nfyES=fj_5ey9Zv-BayO zj;#KnSR3HtU&kiO>$&1;%^rp&A-ggjM6P0N&}>yDV-`AX3l3A16Qifc@x&`nHrA)s z%GZ%~MwSA`S#)mg(Nr>QH`Z!nJ7Z-Zt-KC5)RbmJdk$IH184a~4Q*3U(|#IkGcyu= zv4-$m`*VC{ZC2o(X$nfp5*X#AKy$-{-lVc&GozU1aL zgh(%t-W@aIy~-Y$$Z&F+```&1TzJ3SmYtGzTDdNb>0RhaW5|bH5HcrotYX9HdC{g? z^Y&A!<`H+AaNA3tJ-Mm4U9Uw(J3SZ&+0$JQ7ySUrWTQc!*)XjtHpLv3q-I#Nz6)E# zY}X|Zw`Pv@t(nyND=RT1$pH|x!Wj9z#=GlL-CTb^-^p?!ZSH1thZAt%d`n2m*eS#H zip#BvYgca#yf)O?-Q0vnXRL8x%my!Cd8Qw=3O0_vEugcZA}RoI@f~6xRn=a@@7ve{5WSZ zV0Hm@rdfNvYG3`8r~nOMKyp#QJ3uN!oFDW>Kd4}9#vnj+GRktnA*(B0S z9Pa_^h(X3w3fPFSk+BB#(tqSiogkk-kW4-j3bM{fe;BQZ5j>5eF02hp?QO!t)tU0U zPaIS^)Igs$B{x)VJC@J@xM*MQks*`(TJQ(NLBDk|oT0KpZoiLta?BB zk^h6Yp!e8CKyU4_A0gMRsNAnvPey?n?u|1w4NQ2)aT_Tu z3?Vx^hR#En!ke=q=4dkKHO)R^psjsjWaj0yBF00#RgbT9=bbq$eV%R@Sf{$Ar)XH~ z2gYTGGNnYBlkj8hERZ$bd$;DX+h2`8CZUz@@DA;_IO~Pn{Di>(3r5*WD*xyC+SL8- z#a|`>(6%CHyh6ixk^OGP%i z;m1CW~OlH(!g9*RH7Cts_#Fvrqnc`F=p!Dq%(LR76;{6(4XIkkV(*3 zTUQZ>#Ks;eAgjFo(eFFyXXA)5!MgFHq3x;g)IebN3Q}b;fiaf1T&EzJETuDA7&`OX zxLpJy(>_l%+1Lo6(mf9EEWO(;O;O_q?(jLWk`&;5adaKY|No%oW#RIg$@34sMhq|S zuKV>zew*^GCs`ncx&suO#)Y2I-FE#ug!OWb6Vpzc1zZb3u)Y?RYsAKIwrswJp}5Jv zo3+G~1`I5)5JL=Y3&ZwBVW(wkj~@77xY>JpwPYt}ysgyQgJRC_Bz68Dq-v^h-^Yvg zpFydPpW~81=-##{enWBLRgrJn@?e9dt0S`_8P^+=IHISH?(ZuK*@`%`1Z zCiFZL`B4LV&c|95-DZ|Qxb_A}U59L}-*o2gQOiF?GdBWwP?z`sjn?oa%egZaWXQ+Q z!+~7-c(+&VVu-@Gq4EZU&qBmuRTUzd=;RM1N(~-0NVu&_iYB=D@$ecI(q|ij9#i8q>Ya*78cIzms893qqE|fV<9$qAWAQ)w zO{#JX;G4n?cjEHJaYO$!x`~ZL0(Q!lGa+ki*}Fmg9cHCxaO?QH^tA6uMh zct*k>&ZE8I+-G-`!I79F!6Tc88T7IJEVZ$;hY``3Qm1q+Melk`mbcO`e74@SEgQ{r zgIMLC`|*QkB8({K2&$!!HFzXWl*R>J?62Z<@$0l!SsD_K%7^F^4s1sg8oZb_Y;Jzk z9IbCq&UrSqJSG<;neV5(S1MoGN?Nmx-$k;em~(NA&$zH5cYTmmU6?||9x)oXIUPE! zwIzLMK5crZ zS~8|#D`JN(p`iVQszj`AxF zKTv<#e_>glL81a@q`mF*V{q8bD0Q_n3+i{G;1hjr*D3gQmTzEF0UU5g6g<%WTO$28{g8YCcZXta{<6)+**ff0u#;fzwm(k zSHs3hHs+9omLC8-{7-H^bTByU+09=P>y7S0cPm=o=t;HrYw}GbA?;0n=^s>I;=qqW zYG`;rpU)ekMV)O0Re7OQIz7IO&(2LgrM^sR{s!v~thDYG3J)+g=vZ#_j%@&7l>j4Z zo~fx@TN2%T|Z7`VoED`t|SwnV@*1J-7;^IdC-P$7;xLU zx^AwaQ78M(&8_?q5G)(JTOfapB?OzeIy6pp@R|@|50&1Yk>#VZ80x|p(2usn3`mHORM*ki$`urA~J=n_O7#vdXmkwkp0J z(zhF1tvo&fz;$Gyi7uf^3)8m_EL+!njq39gx5Hn!e%rIwhB2)Xak&M~W0R;iX43A` z`PpqB=_6-E&`$jlilADJKA@kE{@~!(Lu@VB)og<4k9;gpf_ZcT0>yg3)xF9AV~;~a zqeTqCysKdOq?rzRiLHpnABz;b?>$LAJar=*COx3QOGc=)Zm%UI6l-lJNM}@?SU3=s zB^eNIml4Y9ZR9rI+lp-tMd&)}#C-p4zGvg&!#iByIK3Kb*491zMz z=}V$1$N}yaNxsY&xP6Aoys)}&b-|&r5%v!W&P{tp*p#xO&_Y#xHmU$FuIXLPEH~?!&UZgi{T6mr(1<&K>6~Gj6DBoYSq(%DDl1duBCBmYl@R zT1s^6X9D*S36X@HJS#qb#OlWZW@^-bm6+A7FJl~iv|BclmTF+iDO}IiyW$w{nD0Cn z`a^35AQ`D8?t8ovhUeRqT=18_N|6$KR(-S6wvQsekcVJfCF`A%F!EK=rDf<$pe z1M5@Ym^RjpGbMrTuR%T$)NeLFjHG(o2?-hvp)K1|;zmL(Czw=_wG}?wdvNm{4|8GW zlkEJIDd%V%OR1CaB*^`K)MJ*NogEk)Ow2{}kcEzAcy2rwA>-&{_T#9i3x1ahGlfz?0){ym!NN zi`W&fuO$Dj#0eMrOWr9 z+&;#E9-+LB9Twy+t5y)#KkR7SvJ6+TAfG;L2@>#)sC`SD=c^j>9&5rab^AMOxVF)d z)$&GT9IRBGBnqeNDGF(5yE`h}UuxPUc7i^I2& zBH0r%Eo}>y!DzTL+$IC-d=c#-d7o75p`xXo+i826i)(n!ZJMQs!P=7*ycUVsuNVb{ zoSVelC?-FTd|r4ooNaJoqIhY#7|yE!y+&V-xIKpnT-s=&$YR2!wkA*2ry~{V!~Y&J zb9vhRQ00orp0=ic)N%|p#`Fy_MQgry?VdtJgetsdxF#CIVW>z)c)1wXofEp^RkOYN zE>!tKhfRr_7`0~RFE&b~&+IC@>x0#w;qyec5~k>?POIMlRx~$qqvcxKg(_y1gR!g= z${>->O=bwiRiu<1nSv#AIipiQ6#Tw2jq(wAK0#|W7qEoN7@?GO4b$|B!z={Y4xp^6 zI1W+1G`BHMUOb^H)M%k~=IpB?u+ENpyz+I0D>G#CUm_UPk_+$6&U7Pv#-ci z20JD;+wY#>(_x)@j`+VTpJLP4vy)sM&|%PW`-{(E7q?+Gx*^+gtv>a?Rk6W-DTIo} z5T&~zU22+)X0^N!{7pVY9rFuih4TwUoUs#-A8^iu;|WVzD(PBd$L?Yd62;I!fv+W7 zO`@UdzL;fj6*D^1VLmd79S$kvysUaqXl7h=m1(4pwI8khFuMfEXM$s6a-+B4{ zCEbEXxbih_@rzhCYE!;ih&EXn} zs$-gB0oqSbW7amB%vvw>zu-f>SeKaBy2KjuyVFh6{C)>^!3!43VCgn(n z83?cyK#6a@*!TSm##D?&-Gvt(ZkOR|-LMvz1D~kIAGTf5`dcnVK)9iS1Qlr!K{UcX zxj*C5`IQg2aryjrW25wFUu?z*M2WjKLpU8r>*oz^V4xKdD%7!oYe!SIWS17v-L1#a zN+1w9InV1D%rXLM_7Y;=7#BktAiDhX?|#Q-lZv2~IQrYy;~yP%$m*?{1Ff}HhgwU- zWwuBB>yDZX!|L1?)IPZpUv)3HQJz4ZGx*X%e`SK_U?ivx)o&IH{4>RKqwBqUZ-;|Kkr5|R9n^?n(*o##mHc4e}n2WZm48nZW)5Eo||hFa)|Icu1DVKpK6}R>y4&AjCz0Kb0;d@ZlRqG zci@M%$HGk&^g6z{${6lDmtz|nlO1|84OU31Guk1^OW$&ntymZ{iB0?BG_!>pZ&(+b zz>uc&+>(d+N-s2u%?s*?Yz>lo088}A)zO47zUds9^K*@q`QE=83+a`79FT|E-(9G4BjP3jOG&PMMrCVX!D4FU2GGxEkA&}nJHNzR zbNPw5K;Qp=V#+SjFTGwc>tIz!!tY38)lm5^zhh=dxQt2~8=FH#?tk^vdzC^!9qq?|n9>$}tb{f0M$S!`b z40-5^l&_k{MO7E^2$|p6*X&<^@Aao=e48CuBg~dt~H!#Q@ z$TUA;GVRu^x-i}a{~&I6DAAF4P?#+(se^e1V|f24_ZTm2I6hZocl@ZkT829|MCk~% z%@}lS53^%t^;X0&oGX_~--)>ERF=|piTmh?l3eG|DFTm!{|(0!v?wI?6v$eI?DTAf zEcg`R;4<;1nri*7HwW5(w2DVLr(t5_GDF-11{Y!N%G5^u)dz*HbCIC`#aQ9J7)3A7 zyV>5R3tMQoMx>m*+Q0T^w}aC}c#|94uda56*DXw&O&W0p}o%`E>`6R-TgOCi)abtJqz zq36J1>N7=$z_zHs_8)j6hT{P|#K;81E`4GcbY{a%l0;gZo{8PNhJ-xJ1tSM_x%UY5 zM!s4^@~U1BF$4)ZmC+P22{|xzWF`vkggVpjHWFU9M?+Mdeq!}O@Fa~?CQzc0Jhp z6_J_*-??@wh8t_c%HsHr2lYxNJNp+p(W=nqS9|#SDt*|OMBVFF$7Kj=gO8ZS{8Jya zd9ATB?jfP?7Gk;ceQ^={geHQQCtpL(Vm9gjU9ow}WR%0?D8%#Y>Eht0;Rp^e`p;r? z4FRRi2}2&A5w?q~db`?zEsJP7H*e(ObSP8u53}eMA4v-Dx46-Xjv+{Ao~#vVWd@cI zq&c;s;AuJgBpX!M#;al!6&p(ltNx?lRbCkiUwqWj-8M_qzQ>oawgzSk%62EZ2!Rj+ zbc_QyeEhT>*opfwD45sR{kljJo=L~~DlCikq@GG_07hxveLlYZWen0l^s5;`S9ToF z=eE;4f5&UR-|X1V^nkI{)kT+sE*`eXBs-nzAILw|NEcpg`9@P=ctbJ%_^ui1$6o-G zNR+pg#Tr4*!*aQr#a>KNPp16cot4|_BWG^DQFe^*${#85dWHy*lHSI*g)F3Qk?Y+$ z=tPC$R6^e|M6lz%E|`vhh=yYAgOk~;&j~$ymdvq8?M+69sP($h8RG_mr{BMUZQ4sJ zH!cRFWg?YBp-nF2!bpajy^e2l+7cOZHi)XM*R8h}XgqjFm1PG0uLrO(7u*?qObB29 zZ1KY!Z*p5-s>bc^yWg}#c3334)~@fU@RUqdLbaGn*qdpVC?c$o3?o+uXF8LpmX1yr zD&K{dRPFj;kAoNkSFI0!?QeXGQFUCLts!Ei`Obqj$u2|i!PC`#>JGoJeF=H(K&H`+ zEvp2`&NDic0Rm@Bf&|^nK4(SvGGr^(k(XUcV1!Sff%}Hba4ZI2iK5uHwk;Q`xPiau zi!KdPt8)SwSVx80{v0f54@3n^8lPeJKhtMcFCrNWwcPhto)HVPzmzl$oeuL;oJmm` zL~EVZlKek7awX{fUkuxgjU-m*5G~2K06Mcd5%6I#{xtRj;{~_E-hG%=IjoGK&6wSz z=xA01x|t$Llam$PphrjKNDw;0Io<^y!YoL%e21$*h9dKZ%9wXHRc~`lDcL>f|~ zy2rzJJbjjeWYf;R$!L*E6vxb7c$|3cvP$WeY!n{G8Hpp=JP#oHjS&R$zAQpTOD8LH zx@KR06K)Wz0Hrddj0&6}n_jbau4Eb+T_}u%+9wd2K#?8P!R_~h;$R$a@*64eKi$^a zVf@)13u&N5$M1`O;m0j4ogvR0UxL3_vOmTJN*^sybPjKD2zv3OqcKN2tv%l%7ob9? z?f>2`pbDo)&z~aI^mb*DvVUm5@9T`8{S%u%P^s}sXJp5H#ZF!&7;*D&s95}Q)W-}$#Yx`4 ze|JS=<|2ys9M|>$;)VPuAQ+5pKBYB`0r`0IgpSvLtR;bn z>C)(*EQAFO{{S1S5q{xCkl#XQ;#1_BxI1j|?s3vs;0d3-iUQYeZ|`52gFI=ND;m~^ zD>SQ_*QuXJs&d35US4|SVY8-{$!+!6pLg7pu6jjtSd&c@X`^|xu}7AVE?32a#ll*L zf(SumXJ%f0Yn0dHmwq;v$?PfjDXXUG`ZOi}zD&-`Cd9SED1q9ZBPKd6F;c0GK6?_b zTkC>g4|S{5z6W>E)lfyrgdNifi)*XdOpLsq~nKQyC0+PdaNMS@kTyufrex zS>R`XmQtbiVEPW0wAA8CPYqJfQhF@Fx-EE9qkGUEOE2D6VqQ{|Y9TTlfgP7cuaky}^HAda`F?~1xlA@7Z?%sLaN{tz< z)(PX{Anl2!o!MeN?5iu(aydwOyMl!7NJmzdnB9!{7w2k!^VC;gK2fu!eUh=v_7VYC zI9LgQP+%vTvJiH*qV4Wpe5Y>Tjd)G_IqXifZ;_umSz5cF0_olOYa>U4z6Y9SqwF7- z@JDI$0c&k*#^(vE5$0Sc`Xei5N6}rqfixq_xSO%J>>oJ4EykH3(KI%B((?OLWV?C? zeedoEClQ55u>0{D%|nD}9rF$;(Dt*|Mh~zhg9fVlW*Rt0Q%f?puu<4_`vM={z8?-;@Rt zhs7C#KuyjxDDg5;(Q_UXQ3a0Cdxos~rJxIsx$J;p$m%m0LPSAkWx31+A0hZT7q6?| zYF#D$bN;J}w>PTIzX;lsphkUT;J-*tBE$nFpSJJ%O3RgB{FZRhu%?JotaWAAYug!5 z0eBrfu}f0-M3Z}tm*S%89OpO~H+@Mvx0e|spL&UGFw!~X)HV$&J^@bA4HTFq?VY1P z+)a;PT<1pJ_F5Ut&h!6Nvi=IH%DE%ujg|!j3Rx=gk?d3dMf++To2=eKK3JUPUhJKF zv9QH|EAk9t@8oA%ecm77sq>c2{A`9zBo~c{w1B~#GBdJ2m%{_#EAjAD$ z%Wl!h-Mrl*Vq=Gg9yXQo)zLBp zQ|3xXL9LOi-*)W&+bJB_x)ZD4gzEC!+{C#$Q<+g#P4f#CB3${NLQlf*eu@(Aq^Os0 zBxkZ06At%fR9e&`=`Zk2*ERQzrNP%8tr7GG9!q5qjEv$neY~TV;e(HJ)D#&z?i)_W z$n`(kSrY!9I;-@}OJj3Cp~6dvqXEAsPzNw=UlOd5Au&Ig=GEfD&dzMSd6!^iezKN! zz&`uoY~>|5gf#SUmmsNo+m8q#Nw3|PvE-{;Ehi&}uF6wNG(X8Tq~o@lDlEWjupf!O z%5H~IV2F{Q@9Q$uetAJ_Os!xaa5Vblpgk6QpOcqqzTrZ^)TV|jDp%y|rqrUf9 zP6>?2k?Q|jOG1jGDqc6_H(txCM{VDX>&-km&PtbN*iQW;(~N7$1bR|i!C@|QPt48{ zWTVtH%RT6pU(4=)ZQ&agLrU+7PIHAzB=T#+n54JbUP92@+5A!g2#=$Okky^U^|i;T z{i6frp>mf$hh;MChNm?nDKW;195sYTK_a_&sk_ZMq^k$xF76r_JgN67x-mm{r;M`B zt|qoIu7G6`6np74b=*L6-|YseW{N2VxxK$t+lySZ}RGv{#* z4DZ&^8uLF=)-^%3|CX|z&Vu4X8(Yp;|3^~*YhM?gY#8(8XXK6yG--CZyLXQ#aCO|@ zx}vhw)N>j5j#SE0h>zqBM8>I5)BGcFeI>OmE$}5$%Z=}Zp`0|HvS-jZ;|^ic?6dh) z_FEJrT9;*&joT}6uF#!2e@38(X)1yWPCi^cec)ZN^zpO7bwJG>^b8My?sFD=gf2l!mV`JQyS7DgO)kb@7T^dDF|^l9@69T zd>R8UHr4#-L_ zIFR@|G1GH-zwg-6mk-tP_)fDR_DsuTt}Q9Ol@D@1x&qPM&*6^i23=PG?c%G(xD~OX z4hYa-?{H9bX;q-Y#N6D6tGlk6B#9%hR)&zfAa3Zkk(|3`a8S?{&X&_R)iwmckeQeL zp{e?+Pe~MA8>bF?I0Lmn<>V;&l1R5-X*-Xx=FV)|n(zL=tn*uuubbfDc23CscSdi( zXTWfR(Fj1f(dC)`bQZ~UJGMz{sB(*QO{7uZ;GRbq9LM0PYxN-dCN`t!_`;C*a0K!G zS{|yG;?r&T%mo<()CDEpf3P&b-+Nq0{dx?%TjU>H49Op()EWgFE^pAWI839t>eC;B z7RK%=w9OtBXh%>Z-p7%p z`~=27dP&u-IUH6ro@aFBUiT+Hi7U67?P=OXjHKP_a%DXHX!8#bJv!|nMA$h~UCcq- zP{wu2f(O>DONczX82b3b#N69`*_ViDx;R_H@7Q|6K_tJf5LbczA7#m9b$q+l@uAKc zpUQG7^-GBpQY+SiVw8&v)X|~~^VVAf=4F&qG6k0$cS}_!x+Bu!ftmB_TTuxsZh(Lu z1*?&;<2CS5z3qu-&_l7$RMvt}{H42orxY&p_c+YSCVZYSXk0C7G`7f3)0d&?mBGUc zD6(Qs*}5@!;U^rT7G(3^=n66@?55oDo^~q%S6cbu1Y!yKGgXZ(zIwj|cU5M!R%^fe z%ozqY*#}DF(i=<^Gqci47F9!CT^0c0^E9*z@T#2NoY=hoknl8Gz(mW5^B({7?YUEk zs1Sh|8`9p4!00b@%XuJYbYtRsWShmWdye!M*&#vw411gN%!V`}^hPn>=A4`PPg+|; z<-(&jPR{Lp;XbYe3&APge1W5)w(s2!S@=)GJC;kxU8trmb0k}PdVk8%`H@C>KiHOw zYHfba=A?5m$s5uY2b+(-soEC8s*2jZweKckvUJX^O3Qu(V~c|xw_`+mDsbmr_ITKH zHiHnjdu91oJGvTPqCi>;AE`_6>>1{w@G?3#0V}mq_w31_=wr}X$Ch6MIdhRWjU`B} zS3Hbhi-wrays~67+%LDU?c%}fXDeeF}-#(^k@J{28X=utrPEy`{`Izz)BdXZ6Df`=2jCXp?n5wvyN z+k=*OCsWt++vHJxtk)_MU&t>U-VY-$O}dVJf(<1lRRn>^V_WZfn+%?%IO z&1A;KZNYuEx{T&moJ`hQ_KcF-3Qj8DTmM~fPOh6=M)6x9aWaA3{4b#bEIgGb;WEvU z*`x6%{NEn4iz4voSMhm9k~KQ?L}`iLNk-iyB1x!8N@wjw-%~HOjG(PL)X$-N6tAId z;r~$(FhhyqY%dR%27^ILhQe0g6f-jcByRL~MP6WRN!>WrRd7^g`GQ}Tpy$tnH{2&_ z`iW3sMAtN!60kG)r)x|3ICT9_3y`CI47Yp3V6&g$xghaTrY!WHLSED1ITRWNnd;Ws zElPkYbV^Dk>^e@zI%gBLR7E$gzMB7RiEmaQwgDaXDOA*!y@hN{Bp3hQ9frzb!xe~u zJ?MybTX+Vxq}i^l-mt4~&rYOkGR-%94RqUVgTXs@_mb?W8QHV}-ied#TOaJt-d8b; zRNDz?LcMl>4J~xz@eyh^cMDLpc!_XrZ!CfyMe<$^RVd{AQJmOOLtB|XKOPfWfYGF+ zp8#_f^$={I^b{{pIW|4;`rTCt!PbpYlfo`&8K#KBcx_Rv{>`PnrursC|Lzpjz4z6p zTyUR#EF&eReba$lWbr0C!?yY;T@|OR!S$X#O{0|MibOWRXO;HU_dntv zg|4d5)Xv|1AqGBs#lChu6@83B-KM7V7G~85O%#$1SyQ{eBeGHSK^7D_8w_BS(sD{A z^>%;C;UT_0CfzvckHjTiq|+BEaA|zH=luX{2wlO<=dt|J^;RRd+cDN;U^KOdW5zuhDJOS#nifk^qQQfos~4s($ix`+TfI8E~K!O2@COegzd9& zu5{FP3rXn%h?x;cHmrJCs^vFeO7jGckND4>-^-4RkYNxJbyThvy382c=K+9OoV+Z! z%1;Wh>dSYW2!c&)qxz(Z2EQC(a#b|Z?5y0|9?$(abqM*+xLb>xUzqN3_hAm>W5X^b zx%J>$MTY0@D|?lS&25#Gdv~~b(?ZF#1Nd8&uw6MN8_INDucugJ7>_$ZsDN$Z`XC*= zUv(tU?+n{X>=1g%yTsLYqkz{;`aSYEtd?JW$gQzB^0=*MLk;`dIWEyB+aE8$*mc{e zi%`N7G!%wdt>yGQyzq<-O|JbaYhpCiRy~>57wM0QJPS>(RX%~PzXMg+hw>vZ|1Gj% z4?bBK2tHGEg;uNmvNh^jo9_Hh*1}6U`Ft&BQ*`s%bU>U0&e3WFT`p9G>@Pt}!3NlT zK!zNR`iO>!qvil@>;;CiroJ$_xcdE9G=#ddqIY7e(+*0GL>Ky^!qQhRX+=>^zT3Z= zWaaph{&No=Cv?aZ8j!5*xC&N0@4uwQYl}w^s&v=pU6cWaVB$aPxwf|dc*@Z-sG#@+ z+WM+Y_7QY^L=Zptj~3u)kW25*@q$zJ_Btjav7R<~M3Op*!Gw!{ReX23`aG22f-?mn zyfT`mb&t`UsiFtie`yP$scoota0%y3=3pX2up0S@#bgjTT;ku5qAY+OSLt-sr-C`2 z=EOUoQC*i=-RSw=|MzrAJ|O|6spGE7JGORbdm4j+Z~v0axQ7ZNB3QIfyeY8c=5Q-; z!mpKo!b-Vip#=7ADH@y}JJ{k@CB>j1o4u8tjML;Z+)vTqtA;k~XGm&1B{T`WXh;?= zhRunm>IMp{Zd`UcE8-#{sY{RciUIwSVU_eKSp6I@lZW>+=Y)wjG)^CE{v_WDE|dOvYKtOxoJcv2VjZAce_ zs$Z%rWGcj$c~AT%3f5(2$04EWAXCMuaRf=UNg&tO@LW}08=B1ZtTD%JL+iGwMuMfz z=u0?mOC{sIx51XcA>Ij%v1jqI&<&O9R{;mgr~BHEgDCxyD>{oYBAfUbHZOgIs@W zMC>ce4v+45lb*AxpWrcOr9}JKam$j#sKwdNo@=3p9&(LK$`o@Z#p(_;DECCXADONP zk4H+$oJ|{A_en>ibVN!fiwIhzqu1%02X3c<-qL$ziZlM+l@v7f%iRWenXwqeOw`b^ z%zN)eO*kGni1Yd#fUXX|H|Il!A@^MJT>X7*zxf!^cO=M?hiTg9b<7+zHBPE*(Lm)kLykQ=3$3kq5JDs^SQ`!{1u4__nrSw z2DB9#a>SD;P=oSnZ>1|_SBvM&dLc~T@adejB2)b9lF6k7iM>NVcC;k-oskrO-$4uf z9kVcBP5$$x^|oJ#r=bU;MZiqm(_@;!=LWC7N%kf$2gAnVs@-1Il=WYF0oHMkHzY{^ zM{0yQ1vN|B8PC-2nZ+6E>8zOScyPC1^GI4fz3QLa7+eswzh_K`!cfSs!PHt1TjhZf z>nb#BQHKGp_FOASZffreM<}gDdTZ?$&s-CyihM%QTyp*z>fZ^u>vL^nGEnR5L&-}E z?YxhR%(OrgX}HO?@sM4fzfNTv-WN62a_wUQR_5q>==+He11UNjT1(g^P_( z$>)!_K6@+m1nG3h9PX?I*1Wh1-KYeOs6~yJ8L)R?QN@}4`(B6m@xAbtX2caI&Y|&I zg1PYe7}aWrXFZGLIOC0`z3YNym_G2etb4=VlN=s_Ey`|~KLJ!LmOIy>lBmnylh<-> z{Ywmq-nMnQI4hpU?((c}X*kTnuk8o;V3$#G|F|Xe8e+7Sz)({W-qHe>&KKr(#sAEr zBI>YX0?U^V5jz5pPMc^={iv>rD4Ivmt<@;T#$B#kH;=q_QF>`g5Xm3GXKS(C!u zh^{X?zqMs676^k~!J6!j+k*kwbE9+qtmho49tGO-xp8`qHlzJq+I{9E`er;j z)@tOM0@H6OaTgsI^*mGPC4rZGmH99%U8vad;rNN-Odgj5+bh(q4XPX$*R5#k(LGl- zcq0ze-d~CbiG~E zA3X}Tugh7FiU>POue8O3Il7-o^!FCyvYCVaqweYsY3M&lxC%4lG|*?bFSBhXb@<@# zfY&Fy?fqcj`t9K}p3CZyUP_hv6id`5aey3g)~!gE{{Saz5q*@>Emzz{QYtoc);(nq z9Gc(wZ`l?M(=K$N%QL*JqhHu+yB1%27s}dz? zHd(X6R`$Us58;}rbWKX-TAbnvEDv~Oi!R_&0|2VWN==U-O#4$8NFoi+Uk$}JmQQsr zQueQzv=&;D;}(bCEJq?N>U7;h4P>D49W9HJ?*de5HabF4+!`D?Nalp?&&}{y#K<4N zvMn4CjioHE+q3x7e5uoe_@QJ`Q~{q6y#kPp?t`C=DAG5+xV<6=!8v*F&gd>*Kg~O1 z_gmRgE6CXB?<{+3F~>BF851qhwgN_j9@Oia7&`?`s(2E;Dpu%=pNg>@sD5TX*y*@7 z2Z!ZjsN!&f76UfQ`kjolrcLbL|4!JW47;Rp}4Sj0mymrqp zWA}P>9B91q(7oVg*mDm!6xHnlYkJ^PP93+9?t*;#GaA|?5*Ve9U+L|59DQg{Y4)Y9 z5>X0nhHj*gfK?C`xQoUf!dUT&v-OEa;26dpLLT499igom1v|RT0or`8N@&&;+GBGU ztzO=FiOm{!B0*K)I-)<+&}2*70C-gXp>QHpZpJ%p1)&)3s(@b59Xu z{9C{(E&ZoC;6UFM5j(+cv{HP`am+zSZ^<;{sJ2oVUPi3$0VG3OL$B=EaWkpGQgIPV!mZ|d`Tbr$`^Uj98MP`lz z@NVf%aYm_nZu_wnLcC`wzaTBK_#SYt)GiaXbslb)Lk(Q!{_36 zdCz&?Vh@zgrER$D-qvvX3K0tYUzdH72?X|%4LRm6H?GweJb2Qber+|^;fc4b5t*Xb zY;;MY&AsPpS{Zeo6XwjcFBt7{E=^i~$zFDs)ru@iQK!Y1SWd9f66WBg04M^Q6HWpo zN=i2!_xObl1P(+4U!B&I9z6xSyFM*{If_6~Q;IHSe%3RPQ!Uy652SWnN37{R2rm0o z+j|Et=4nPM)kC94a&Lb1p3rY7{*+{MFj#2%C7NBGTkQM(>)Ug)g+@Lh5iGy=5gdYu z{AD^+SD$|0ZjS;+%z^$S`uz($mM~H6N$nG{FLqk1+vjnCrCHpw5$)~#wK!gEd*RQ$82Hlr_-J7uR}7-wQ<1LzP+VL2!_2sHRi<*(f+(>UaXXO zT_XN>!}tsN@hcx`a5yG;jlW=KJ)%T>vDme**uk&7f3Z*{Nt zf;TQ{HZh#2SE_16C4b;hfL8)98p;^oz#0JV!>JY5w%o@zt(v^}5!TJl%~sRu(NUP) z*O{Irm@*{}|N1zn4DoOxlPEO$;GMnYULIuSj(Y7T^7S-$r)!<<#a%G0f`joc%2UwL?k_WWB$}dv7M6YDq#v|D(W3eLa|2MPllL_vUYrx% z(OSokUQN!FEREW>Evq7a3r4|mdUDby;Z-xVZ#Cp`hSYrw=9> z6e=7K=CD#**zzRIKJFs*Rv5D2$Vpd^CH^^>pRcyC`wS*FmhT-^0{lMI8^97emxV~K z!T^Is0$`b8H^V*)_Qo0tX`aIu&r>$MA*GMd?DzqBf;&~X!OB1$pOqfG-*NoGpE`mp zjq4A~AJKv#cT~9WV0b^M zwqX)W)OtWA2T@D>+YO$+w=>N)QpVkyP+dVcYMD&CcWm=fvmi zbTvTY^gZ#|8DR_9hA6jxkP|lbAt2%G`wAt*9T~FvMRZfM z6fIxDj+%N=i;CSQiEC~*srEL(EBVX9Lmi-TtkS5dmYX(~uEeHd<`c|jTyPj1RCbp1jX}jNNNX-44ZxW(dxvr5xsUk1licL5 z+nk#$CEjYS;(Vw2MZ9^)vKn`IK8KPrI@&-iOvRz1^$Ky9^%9X<<4Aki#;F#_bx0f+ z_;%JTZEmYuPUYmeA*%1*Ty$u5GjO!vb=4uq7DZ-XAiy7f9XXxeFYY==G1OK zfrAT!3D+s7&uZt54F&L1VYw7|beGv$t5@M}g0RBu&6oNfPiNQJY{l}pxu;fWOTytu zhq&}k)`ID5+)>rrtZ1O5>rIKY(xbFCb4+yXN>Upz;LxIvN4MWQ?ygOru-?eAP=68!k_e?8U( ziw}lJ5_00y@<)*QpW<3=^y`tbl(K)fV)hYS5z-GbJ|<|W_=Y4XfHU+9=eY5$N8mB& zi=Ku0ki}3C(TZnW#*KFa5KD3?wOXMT$8>Bc?2;GF=DLk!P^rTLL4uoUq<} zc*9`hu;`RNsTAQ}eYsZpbWuCC(K&%&uVBgeS!4Pz*7V>(1aA6)fk!#& zA&wk+z@HB#iAiYuQuNyPl?@_0|Bo^D-tT4me$$qkSI&IdOw$tfySxHds{wqq>a#?PP*GV)#RV{#+rUF@0!W9*`W*WmBVuRSRP&rE z29aU2oLm@RqgV0IMf=)**Eb=TInEnOtdzQ$d5I5vkCD>yU7CHlWPpYd-FWXZ(c(^@ zYdz1k zOcyhbt>~lm=M?J!>+WD>*e60)zU4Cky5Yr|8lG3?3z3bFHdI^I9h3S zTp*-v@9Azyjo&hTzha11dZBp`p)nMB7=k1YjN)8)xmF^+Jr~R@6=pK>lQF5{5Y#nK zWIps%qD|~S0%mkXS^ak5t%Twu2>;s?HfGQKwZgCMY7f*mo@{4dcML@p1rnyin{cFm zkuLWHix6^0TYRp(&Ggsgknb(uf{zi!lue_^Hh-afj5D&c<%jYx(86a$P;Sn_>ORMl z^=+?GiAm=%DN`F%rz=r}kS}UIp+BfEa7-u^+$vbhU)2``j@6C_P?pfM2?Ixg}I$$e6hzVst{%vRjfvGK5JrluIPQCpLsc%!w-_-5^Lka4Cyc!(| zb%t;+)n-&WbfmqGu1Ym!HlrRC6%3HPVP~o6otB}+QA=Y;H0M>TI+tZI#_N;f62Chq zm+BcjTD8H5h?72_fD7h_VVn};zrX?l>e;RoD{PC!s~6D7)5If9hyK2AEW+|~UbLET ztIyZ)vp(EbIo_Y*rCW3>$_$jQDux-7Yg3Rh6K}R&F#qvK+N-hS-BtZxM3u;cdYXZr z?C!kdR>LlJRV3XfNE*`|=ey7W+L}Mh*;+3H*1jn(f7*6kxW0*^YKof9Q9^>F`ikLE%ELP;qC;7)A;cO zO!Ui1ZsR2W!!WzB8NP2^zrtA)-|i$!Z*_WJxf>%dvX|~XMRU3qTKw(6@R6`47;QPk zeKfyOSxGTXbGvLr;=U=`XZ}K|aj8Zh(GuQev@$XaP#+|F> zB}t!sIJYGxZFwXZZ!|V2kv*n-F9I+8nzvqTbG!|`e5zDpdVzRvvOi>wSkR7)3Lx+> zPy=x%x$JTHrTPAcLT>`5Wb}q`Oq0%>=KlEMPknfIYO#8oiG6OJ^5kLf<=y_abOWZO zacHX%Tb_T}38|H6GnZdqr+UPP?408>1hVrc zw8git!nvjHRnkOgC5Qfrp?Tw`E8ZDO@s7xfRTlz|Ux1cwq`kL=sEk-YYTR>({jnI2 zhd-e>Yl>m{M-HX0^P8HJ7A{Z9R2lb9uzA+W<{&J+PPu!>P`oU&%a#H(rXRQ<__NJ6 z0F_X%^IHGaxvoh?l~YIl`Jw%Jh;eTjm{^^|<{RMSVi^L9{URcq;e(3uKlL?tjqOX|!DCyP8f~^V@{6Q! z*+$qN@V<$PIof4@M;lIs8`^8@@5PwJkL#0BXUh{y$JWjgu}D$r4(xZ1NNn{_w->W2 zzD@+43&fEgy>$ht-wR3X&m!$8{wx5-fVmN&bE%%pl=F4!3sQyvgTi~BteHp*_(72O zp@R13pAw$*>y;*V?E5E{JJ@sB@Y-o`w1qT(?8C)noKl1l)B6`~%Lt&JANNA1pHLW| z5X&t6MES~s5JadmZGJratPfLld`J2$yVRy# z>8-l@qb)4+2dpuAdk)T-lhL@#A#K+|&|2y(L>%Sf*#?a#EZ__Kt<_W(O3NZLjizuX zb;2dikyJx1grPNal(i8o+xRjQMb{zJ?|ygrJPn92V(pE6O@dg|S-IMAtbDfoG9T6U z>5pB5?Xe}h=KCTDmoDpdHTmY|gF6^ECy_+zIhdI3+AABMNe`LL-fwP`$(WnyE45CT z6Buu0rd>08t>lVJq%iPprUTG<5~C;7doXsrS|}r;*#_p*)4RJ21gXRqz@jm?S5k*C z%W>@vwP#1D@fmKXON@%00{(@k9V?ICd9V&m9lH*?H&U-;f3&OW+B2mPqU?sPUBbSc z^%CD)J99WILu-rM0cIzJH_o1%qrd|Tf4+qaVvw7}kO9OTs{YFo?tQ_2+>@Eh zObJey8aMu>th!gUYu12^$6CiV3wTT3&s(m05ctP+m>5K1ic&Um`5x<+;b-Yd6?XKG zm~i=>dMoMoo*e`_9t6)?=&R}8A;x+-ALsZ{Yb_+&fZZf3W@v&8-qtdmxr1jhv`A;Yo^wQsEl+#U+zu>rAv`3U87JDyY-EDr&#toHF8#zUUSWv^ z?NChsLcnTnk1^VN@<7Uu*luNKJ`q#97qij{`J8bKBpbtMldWSS{XhqP6(_!kmAfyx z_BsvuXdwAHD2Wi8fOZ@H=Z#!9@^fG_J4?JLe%V3$EDV}qoCU-cx4;Z;G}J%b$s%L~ z+_`(i_~w$?SIT!)rX2w6n0eKw5MqOGZkH}S#9+ANZ3c^_Tl}xfm$d{Rs^Mm`K-ARo zLRQra0Q9W|#XYKjuzPFx!nCsfVnE#6u)QmM3HVChzmNv+a(I$0`5ln%Mou+J?gf?< zDNHiv=@adKe&(p0i5fb=j2{_kCra_!Q)(PwHP52&Wl9MOH+J#THb-=IuJj)x@H5$K zJP-5g0Jfat<+8}!6|vMKaTy+T$L+l4N_>6Y`pJpB-lxdP7x~j?W-(PFt#*vBU!&uV z0w+2WUaL;Em?pTuXo^^m?V3X>5ni3aO52}&%+{tTF!4p{cA=<90;?|*Pd1>=uKhqF z5JXrdfBWd3NrrO+iB7(`^1}~nx1!2<8wDA*r4%Ybderv1bAyD(qBJCvU1-4E5>S1g z_@sc0r)0|e+Z=ve9T;W}9g+Ryp*!PjB8c$z$m4s*`xo42PXYxqNKMnQqyXn)UbS@Z zE|*s2FjT%16j>#NR#+0{ckQ@Z_VodK+G3sl5gn>jsB%BicG%|JF*RxfBzP(=eA7@b zpFY2Jw|jNqnZ|dm_q*#jI-OP z<4<>I#09CG1Zqzd&c)PsZeH<>EoyMl3`=cs`a<`sp;WB8qaw~1L7LEB^-FN=0%$Tu zOW^SP4a5pl*r}fmoWD2Z`KyndWP{rP-7`jXC(`^jAIN+cFKN3jy_NusLEI;;l}ovq zh>n)1wa8m=IbzpgdsbA%Llql`e9{NeI~Sxobbt0sGFqgYN0=VMax&%hh&Kt-g#MxZ z#AFdXuOQl}rrmhoSOGpRnroBKXW4O!ajjgK$k|nT-+_DPDBOkL?>HNhoIJL-K2?v5 z)xS4U;_`SQYTd@KOGgJG+?r~e~{-xzP$pYNi=T03~H_QnIu(TZO3$T&oZ3R*EJD&2TlZS19o^mtnzP_a_{ z2jo*jkNtZ8$Lqw&O|BPTuW5X^-R8JgM)Cr+`Jch24b~LGwux74p(DNhofbGZiOk=F z8k&?rP=~ME>3gZQ|Ats|F5**AN;_l z@w$RrsYvMe(zE!YjiE`xzoNRY?SEyteBX51vQX4=VH3Ki9g0I{H5Ib6aPp=;Ix-~v zn(*mQsAZTso$?teg)KbM3!tP;GvJ-6a$dInMVNE&E4yO=V!0D~ttSqtBpQm`{IjA+ zuk)zP%+J|Qc)SHXy~4Y!&tKkixvVE8)w@Ew?zS&*q|7({v>pL;Z(Y;zgHboJ?D$B_ zxW&SiGXAwPs9%sc6dx?}&hZU1yxGCCMT9n#w;bi^h_0lvdV)A(bHhmA@l`OKWbOvC zuMEA?G&Vl!d&kX<6*E=xk^O(mqnQ(lw(^EGq2?Gb@;GZGH#lBUsf=iLS*yO@YXKN6 zT$MR*Z?n0JsGSIo(CM!2X_Hf1)ueGHtD=Rkb%j;p$$z)t2=^1ZS{GyeTMLkXXSipU z^;+Zz_*ahZe@MiQtI9|9=4;eJK1YBeANrj>L>&Tt-w9|WC>GpGipm$wojCpz-KaL( zN(Ad%tiDozTr`|~wRkbVdqE|D`kH3{p7W6Q@}j}CrEGraOz$u-Zoeo?X?$%8TBQQT zzxf^?zEfHFqn~C=dt(TPh`1~PQi~aNsWyB{o9~E2T5qxFZ>w>^qg+0 zQs)6vs^(}b5x*ql>wW$#)+Bl?HJdA*`tA^aJdT%6-+ZPDKE_HJei4Z_Y1tHAKaj;C z#61WDNFOfN-X4H2}xZG_sUWl5RKJ{HQ{x)4mc!N}S zMlARVUn9iZxEFM#f|XEwrbD4wT5 zP8g|Xb0%NJ96~pg4Yn;$EP_80v?e@A)%*#}dlVst2p5n-H^k?_iBEYs8Vg}kpuTx> zRIAw324*Nv?(nzMd4H zbV(uRbrClRX!@-SefS9)>TI5u`^u8*MqU=wo0Ap|;W#54%A=?;m2ys(=4d1RwqjQ?)P-?kpWC{mW@cyTK)BWh%?6pnWgBTGakl(eBewYt?q-`Rbx}xy!XZoAhKODnnz9T{_ zKO^_1?@T@Sr_83-m=`sFs2GWAC^#~dD0=hxQSooWX&sa9cR-wF5lLMLwfX4%JOTmF z!Z{?rZ;ZTS->ZLcIRCfx{tN{!Brl-}T6!`%3;GbMn@xO9OZ?{OWfOjGUv=#w>?hqS zeaYcxyF`2?RCVNvmT~#qLAuYB^*!{E<>fktu32AG$7PXe=#yi1%H| zIGYYiF7KcJ7Yl^qYxdt*ploP%N`A);w-d@L3XERoKo02(<;Rf~&9HfKrSDSfXa3r*FC89(H!#WL@7odrT!^`T-p zTTLd;bYF(c=2RX|I;ox2=R&*q8GZ?kVItWO>K;69&C8$4MZsyTK{wnV7y?AiGq z0leC{&UT65-kG)qgpd@>-Ay>2$*q`dgq0@AT*(41_9w6mR~}K}m<2t0V+*Y>T6S&f zwA#}BSZbZwPGuH@0}}bZ;{z%1Bbz~g3)!O-+`zs?V)FoLLVM7tDGbF^q=)U4m{%e_KD zf8w2$9T}&PQggeRc^XL(ch@j|mB`k>wl7=0U{iv}?zPvn6L|b)GG3Ys5O{2O-(| z1y28s37e|43#+r;FP|<7C`FjLrBXw{a?gfyFme3UVPCQxe7;d`5j1AE`%Pb> z`O8$Jo#C<_BK+)VPN@xE$ea~T$rDZ@kS|y!gq!&XXrwzvH<)UDqLl%1nDW4muv;cw zh)K}xB7A-d18vxnWSA-qH8Pk?0%q85f&|Xwb}ZS{q(f$6%fXZz5mpA>Sz$!tZLCL= zx`)$VyM#(>3+ed{mep-6j1kE_he^Y)N$bK*e5Nc-4LE)$masXErd(=`r;LTvPPO{x z8mYwVZpbPssn9gOvYA#muwdLD6MdHLjWXI6OBU(~J#dS<-65jb+?aiR{NRwO$bvGw z`YNOM@_uHHK5-;)EVu>lQNSAUc>8Q9d#O*trbIL~*fd2T-BC55ZtQW`aq8%a*~6UJ zU_1doMb3Qe-lxNTY4?4{WkfXZrDBBGB*B*mmvoBwWfO4!Pj~R_`t*(VN|8$%JSkB8 zmxCq^{8X;QN?X|5pP)Uj-Vjmmn-opl4x3GNixpRYnuo6=__o##e#fA`V<-de>fSTv zN~O+xFC4B@y;(TY@fttv^H71b7TZeGO)5dFcnE#SeU0@?>YL}Oo4!uDjSHM{Po+LC zws0$L2c>54Oz`H#f%HcT%;| zaxqi`XY{Ohnh1s0Q{}GC10O<5c&FQ))*L z#I3!73e1m z85h#G$%CU+Yn;wew?xFeC4aXH5B2jipCr z=y+tTStm5qurWo2|StH`9yfH;btzj}0iCtMZAqNUap7Gz=_|B?H;; z#<<(}gskeO^98P&B^Ri%G(3b?c>T;tA+eyI4iwp9?DzVt7qBMK;zc|1!vpzl`D9$C zq^}{MbFBmknK%rq6TyJJ)aFJ$D<;-F&fU?#uQEg{U1=ZUU6@XNCpJ{-kx0(nxT7pY zx2-*!wW4qjR1FQJi1Oaw0`44Biv^V}v_StjVwBR+S|-8oH$^=qcf#mGxf8|=vKdE+ z;QoWvHux(`4}HFRQWB*QC?^b}tp%J+{t@R3Giyiec3wMk0psw@Dl$%i&iaF|!~2;G z5*x{B>i2~SpU~Rys-nA)=FyGJ5-p`&BaZwa&+4Hm&VeDO2uB3rdgm|Tx4ns*k&Q03 zy$>vpx&G$9nbR|r>E=O2Z_lV>hx(>plUBqxd0!W5gYfwUp`-OENSRLZ@1g|-HKZlISH8(wNxoq#Xe5^3l2VS9oDgprr}48JE}*)#ZK z`U<+zbSU-eJ$v$yQ*8B_F&=$k`j2|rw>of6z?Gz;FgPZXr#O^E)2))k!4>N4yNpfl zJRMu1WFi@jHiUvXE?tqgh3egj;Yoj(l*cBR)}DxrTS>t;7?eWL=rr&`XhyH5=0m(^ zRJAz45)H47!8~(n3>8|A9etP5CsHY)?D|H7m!JL(StQB$ah{g@xGEz8H(rLAQO1u@ zZoZL=3BJ7}5IsDK09n2kdVA}s$-J$&(fG{H8liPwjd+pmQ)8$kebc8&2w*?4V^kzk=Zb@!lu|O7S^n1)pumUf7m=5e||E44=@r5 zyvAugG-ycL(~mtW#yH}2C9Xdp+1oby%|5{Ph)IpWJ06Gk?$&y?X!Rm8f<*04 z=J5^{n}fc}k2kSrpRRE_SBmqem5_XD-CZGXkbS}3>q$lfnLYjoE#!)wdzm$6%7hEf z#o_*9z1WE#F^hkrA_+^=yt%KLej`MDRttN1Evd!Ppm-|IY5!3T%qJTW&v%L;*Bza6 zHrx2Au=)DozJK%T zBwP9RCkdraOLL*OTF;-mM2KLMHmwD^+p^`gTAZUoa2YWj3`z5)A|_k>KS)G@8Qq&* zq16jcI#l1~n6wEVXh!T$GLaZ>k1bY?OigJkhgB8^R<< z3*TlLq0?)+)MTy|;yE6bo^lQLqUEoiD-CM=Ud&^dwIGWur;`u4GS;qarM|IQ(O9>< zZj37Jv-JLeaEjgLnc9Y#SM3ZODb@S8oH7)Qijm&ddrDbfT;B5r?l(d zlUoCkBT(R`A}e>}18dvRf!J6iwS6s|u*7Q&Fh`Ujjm-6`>^+@{psS$kNKz*)j&UUn<>;=BI_qqRI41 zhYJXux3yS{Y~MYm%m`i46Alhb8tS*l*Q{`^GDh<+KJ4RDe|aJq;IPDXy*6o&atRPu zhOvYWF0$Kv3>VgFEq9r4ne4Gli?U%%3C=f6Dp zHuLBWRI3O}sREdaC1bN@2jndZ=Yb5YK1KbK*2p>Ct;_MgQm4N0DrTE+iItm%-W%GQ zFAXdK(D~bz^O#RldFJAEqrQ|%3a_M9B-HBZl|;rbKo=D0CBL*XUe~dE{~VeO@~^01 znxRkp4DlavQq5XPmWi3gdV520%%4-Q&S8kvSRrVQmM{bp&tY#ZzYkE)nS$nm-}$p$~qLI_`s9W8nD@?LVDDOLkQ3z;7Ew`bt>b~2_KW)Igqa1ZxIrUHv5xYF8DRoX@L_`=jp0TOQnTM|QV}3?JM(!<7DTb8N0$4sYrBPdEM&E zJo}K2-ejsK7g=Z$JCNR*(Em%nnGdj6oIZ$^m5@cM?kyI0@yrMDBGe zGdf9vBTur2W*NG@Mxx>_JH@%0+%aWYm!4s!lg%5k@snpbdW{gSYA^3> zrzj}51k@Q--c$>j6$5_mZL&(xzpXIY_)tJJ3cdVo1R6+DN$NQ zvo0(bR8_q$-^g@*;LpBEz|3MmEz4e@uD^f^v^2G`FA^8V$`bC)m!@W7x~3{(0R${HwL03*p2X7(Kwd`=ozw=a%!OT>;*IU{xx!imV6H#?YZZWVr{s0fa|@55 zP(qXaSK?`%eh_5bY_W)=sHZ4+!D=Z9ij@mvA*|A<+E-}{7dGhA!;`9|(^=UMS*ORn z&|DmfEX5FDGm8V_T-#)2##kFw9)B=fQ_f@HkwC!F8gr0K-*c@w=Gd)LI&NG>z+xV_ zkQWzmu#c0`#$=e*v@#%enauE3tUZg*MPyHTP zn!liDmO$_pda@(E8p`%3W|!#kMYLj^s@iPbg}_t|Xu^^mYQm@tnYweuizLI(W1sREc6t#()Oo#16PC)mi0*~~{v9PY+ zlAts}KyQKeAc|&g&b3Z-J^M}?BG?Zs# zyil#9GurInl1kA#zWAi!J`tRs;#f6XMts_mGTbu`iZ($wgx!q#7ms5?{f*qJ7um6f zpiAs>G4lRU4MF2VAEi5PAcEJ9|Kg=;*zJkMf~s}zqP0`j`6k1j^&{6drmJLI9rgbN zd>!g=Qc+z)xA2C$2LPLEe)-DC7?se3MyQ175_h!2b-_l#b~)V(EYow&G+xF2ewNPR zr`P!d7b@=q%* zQnr7Iw?EA%c?n(OuMS{fdKyj4;355HfT85CmGOuaB^=g1b3bRgBun0}s9;j78;z3U zmm7d}@yFe=Y+&2yby~AO<>kuyB)|B@4__8raV4wC0FDP@cV@zbc* zvsJ;6C@gdv=3y`GE@nECj10aC1Jw?THd?vXQexxWXg_we8G?^HST(^EVAW|@f!t{P z#-w$)8wJh^f!agP?A=~s)4DCVo+oU`i?nTem**n0o}Z_8!<3gk%|IfIZMjVI5EVf${v|Y5PH}lR|Apa5Y_yzk%>40{E9eRiLl2V;nxt`NgDT4;o3rqH_cP0aCfX zpWC$ca+--~gKk%>{!J4Ssi`Y($KLAnn)YH-TGj4Muc;OqS?EoaDBo0P(EDe>@?GA;-&z3Q#hD*;4Ug!YKz8;Y z>EVlGH3lD+9FSehjrW&+os*1Da=pBRgfNE3L;cJOIcPw1r@ zoZ99rbpit#Z({QadbsbfL9(*gkLJ5wcxS)#^sLL#;#>rNm+V5)Sa(>LT2#l&p!Bw8vq=XtZ4Yv)b`W7k(UDm(bRbjMfPCdS|vtzQf%jIaXl$(iD}P2<*Lo3ET-T36l^1Xi}5Z zY&@bq5f!>PuvLld@o=?vS%))5fO!wzRVHHcPP##q#69|^21+bBijg_k&VIbJB$st) z;77OH@Kmw1k~)i2r$gVV`-X}IV!qLuBpa_DD?OUv1LliR};Psz{#Gap}DQ7f$}c1JoQtPeK0ah?fuR z5o%b8>c8%(`Jl7+r2em((k(!Eb^F8k{kYu>woak*CMROWJNp-Jx(?Pb9#^-cYa@=T zGegt$j6RL_(-G>D^MCLwSQVbnJN{fwg385m%2aspG<#a=T=^a~snN!>m#l1M)`Qo2 zp*}0tS`%uH`FIS~QN^RJ$VH}=3rgEsbz6Bhrw5A4S{N`40ID9=;}-0FqY@+c+0iv= zW&wp{2Q~5h%EuqH&|Ozg4u-nBrap;n3tWyB>6A+;&N31d%s7qX0PoTNRkaW|{U)oV zic)t>wdCo*Ac_3+-BrAE=ypwxnd{3;^YC@8NfcV{^Npy?-c4~_nKI46s2Z?GYE%#{ z`18CYdn884OqII{y+w{bbfrJ-SSXZVt@UWWX=ZT89x!{acd9xR6T?74ji3+IYR`(+ z;TK0#=XiKGnDhBBKLds5T1?%SPe7kL9kV~uqi%9V1?cboAmD$ikg}u@LuZsuL0%$0 zuoZEamoG+Z{sy=c-013uGK-9#6UO^dEKP@2{~K#<9AYAH^dKe{%TTSxSqqo8pdhdN zUo7_a%~{5%UEkJB!&3}Uo32fOp1%#)3@!L{Z`f5W6Ql+$0S8W=3W-)paWu_t(g%k! z%$!<&%0*b$n-00`V)Zz*F*Eb-$P17CJJ74~OvyP`~k3=>)8equGMl3jD zDgC(+1Vm>9mj0vQlMMAg3O?^~^~;;#L=S1EE~R$V>=9H}uD^pGaL3hM;43RB50@C- zJ!&YeTjVQ$va2yJ0NH-XK?#|12+N$nK+k#NS03!n zPT|~IeM#^+&ZkomT}#3d3+(~UU1%id8khFue;&l0hCZ9poNaLa5zIMS9(4sLnb5*b z0Ow^!PR{^V!QCd^7v%T7DBdSZ75ow9NYI`{;31e_FW_4V8C~%ZQC3+sF-*0_E zh7|b%;WJ~Fm;D>~mm=`)7%y>fFy43w(S5C4Hx^QQiGf2MECl00&nEv#D5*y7vp5;j ze(MU)Dk)Ox)(YFJhV)vaQgSC(Ma3mTM>nqY9R{!wFfXbo0$|X=hvnqvkMwu zB+@jV@1&&bTivgX=G&~to+6IY%aq?C9q>nH%vsOHyKJkInBNGN2=d2`KM_>uxxAj` z!3Dk7o4OB}>~l?$#z%H=W6!v|^Y{pH1MmT$^JWVJ~$eus9CsHnH7& z*8DjTML&4&+|9s3=e3e9)0J+h1euv~sEKs3_yC|+>lm3juyTYSy%BB{p6^(6t8Qpm zG+oj>gZ7waY6xSD`&H`xu=BnyU)`doxA7Q-E@@9xN*=3IJG|P_k|34jAPBH@JCsJ; zQK(-Fdre#Hj@-nvj0YL{)Wm83p6WnV0IbX1%vzM`PPsT(t^wXFn6zY*eSQ4-@)P=1 z9Fe|b*>?3Pa9hdStob<@mskuf@425b@v7TMB8l7|3tWB|9^7NF%RGH9OvxDB^j){k z&GXx)wd|9{6(q!z&xH4eJLU&qvM(^=BO^XSjkQ2l6xx+Og__2P|jD=y-4H6InC0P1I+DIJzjkoHJTdZY~W?JRP<&n{#1LMOf(xL^i~B=YmN+`abS} zJW-0NMz(Gz;Bq&XQ`Jc$$USe!<5DV=biqwcwu6W!7B}dGV2JIewHuh)>8V>xodvw- zmqirRfj5(=PQ0)NqIt+-ZK=(K=#VP!1C>`H@o8{<((gEU9%#VJNu+|xjnChz6e5Wv z?e{s>60JoXq$oLfl73uj4>pq%5AaG#*|T-W-}0Sa^co{*4wkP!tm1)5HLZM~V%{1v zGHQJ!=WPz8b<>%@wCv7bI&Uo<*R2X zZK;$Enfs6=-^_dOa$_l@i^0J_B*HF915M>KS6x(+)Mw$_AM7m;b6-hZcKA6`s72xJ zVc?u?cD@p%>GU5_k20Cw#2>NWZ{)#aL(7@?V*2Zi&Nr8K6S-X87Ax|y=pFFCoOe^q zG|OXRO(n_>HXEYkuYPek%@fPul_sni*|<(6gRT8=EV8WQVKaXtFsYN$dzy5@$5RE* z;MgN}n5B0rR;`{$Fyi5aQ+2g{|F}6D|4fF4Qw&Jlo|Lb*#tohw)}Oevn=je#-4bs- zn^h6Mw_pGj9cOpUcYU5hCuO!9V3l$=MGAluyVx)&{Vso008$j@Svpu(OAd;WAB`z^ooy#`G1rjgeAvqMbTtZ^s6G$Hh(MVRLKY#zq)2Hs!dQNWu zo^qaa=mg>)wfVR}-Qw0G%N&9SOju&)v z!%XGgyQSCVe3yG|m>7OGlA!mRkRw!&F_y%_;s!tr^OU|Gb;e5PwvXQ<>mGGGOUx_y zuDa2k_d#}jh5I$>4QZZxvQiIcy6b_xspyjN=tW#W#a5o8ZXw0f?8>GhYM}(A zIBt_wqvc^l-{s3o49VT|&I%4^bL+?l!0GwCLm4Ej8dA7*S5tSCeszt{W=w_x0L5n% zFYl<&xN9DkZ``%j5dm;+4-T!wG)kb00pkTwv@);$*YMTRrt;^EwYavL>lvk1 zcaAu~^$j!TEwm5t^CooOyP|l|d^h@`%m(&M@F3*L?0UB0ZvD`Nl9oL^scpGN;k;fQ zbODBl0N^I>R&WznSQAH$>Gh5M;io=tyk|YLBJqvMqAGyI@Hsd!xuz75o(SJWsa+_$ zZMt0_Pacd1dzKCzJ({sMZ$<~sHwJIJq2dH4d0f*jUGoEf5y}ml9%5 zF)$SAv6eG^EN$KSqt}LLb(-|YXJf)j|6of%Z1d;tm1lWTNEJThVz6AP0(js9X3o-P zUYtFm5-Wx7z>&>K2O^4}^N^x82xm;&p=Ml*V7#hvOHY7c{@9&&e1fN}rE8xS_acB@ zdwy%lfpYNu2>&C+k3bOvlOx^UyCc_Gi2po9$;w>=d@HLQDq980C;p~{w|@UwYNmwVa54Xu^8eyrcPjmOQ8EYqt% zrI#Q#29zF-mObn8$`+@7*&y2VO-N`=B4FpS|M4~;Cwh>V1|K*fy*)cB3K0avtRcE^ zsCoaYB{xhSy&VkQ%xAtr%}=|;*I1bkAxV<*Txp8mxu*a1939-hau-+WanM4zmY;L! zB(aaCMNfHe$P@R%t)ABHz?kw-YUduzJ~VIKH(^f~1V{_JpUJrt50TtYu5a!xXQwaM(g{j{4itv*t6c>I)e@&5Mxc9KzRu~x>PK+; zK$xug@N+-*=z(~bnzqXMV1l*zQ(aFvB64xuFRkLu;w-z*5%}4SDF(&!f$;n?59W}9 zspzO0JI&|jH4&c1*tct~v3zO|-uJW*)h;*KZ%H}7e_-1ERSCJ}x`8}@IDAeS3Q#1? z*gSx*~*KI#T-Uy4u8N2=KEM%u&h;}fLy`{T;U*~eBH)apd- zY2C+!b^R!cqdVMyR9Aa$$DbY`W|~n$H-u`fM@knys|TC3$>gX>$ifL zTF^=12iEjbRFfH9pm0KhU*F{D zpB^u0h=II^#xds~2Uixp_EpEY?6hf10hDb)5$i`}3R)-c$t&>b!;5v)6Ou0Bb(Cd1VwdXy zQp;Fz$w^tA*8;DFpcOLRV)sXW#)*wQ-aq>Mq*D2k9gHvMAm_kDu6yM+ZjTQFn_qLe zKKQ|QBXJ_4&ODMUgr@l-G^KzbSYgV$xacmm+^p`!%)1<#mA8XoW zRJ1v>{=ta<%P6T>OF(n5zTQKr7zw3`wrzRbl|3`aj_(jspM1xMMdRxJ`SAOG??55& z9RFG18|7U%$DLO0Wa8xrCLyu3z5Q#Xc~L3upk1Ks5VKwtGoV!e(Q@XuRS?Yhx-yuy z3A~)nB6eQljLHm?T&XMC>9r;AP1kH*^0(XKs3Wyqt1C+_h;jS5r&XMKPQM$HQ^Lhk zqVv*ae*~zyLwxiNvaRnpEgNDT69nYzU@t1DEVS>(M^f z4Oovp;N-vYmjXtu6atvQ)%=F)Wh;o<9*^g@Hm(1MuD6bgx@+5pRa8U}qy+?|LAs%iXhv1e=$QCW$3nh-K8%>C z6N#XE4HuFK8Y<2-{us>#vIq0mSf8XaX*|FvpfyDi(I=3p*>3_Vj`ZoNtV!!$yyMvb zBtm~zv+l;PQ~lgOf5@WZWSDLqi)ixmC+o@~70%`&=Sb9bR(dM;`w>l%V?~;6PC`Bq za?_c&X|ZS8=|4j!K^$!l-9@|@Y}-FbzE58l*mk*~z2S)pK+oJEH9d+4^73;A-`l;) z(p}c?xlb%E>Eb0l2(Bmir4PDGk9Tyj zwPF@9F^9>L=fEMakkUdJRS8FfAR89Vf+(0!B&9g#@mC%0&1@-&BDu#+>}ejHU*7rh zy;+!Vdoo^A;f;PI2~kXVz5mR0t$kbvz}=kGg}>abv;y>8=uM50ipP@O{qVSv_t$tr z#Cw}-J!HaHgu~Ef&9TaIW*8aq-b`nBYGSPniM#I1SxKu;l^u=PVLj59g$P3@N$%Rq zsoR=Fmj)k#MKif;3@u25s&~r4>~zlRd5v4274o2WL~q$g+N`Xs?@#YH+yKumF9}$z z9;5D{wI60-ajyCt5dqvLkHG#6Ksz)!;`i)@725Y|y^xY6uM#s)2_c?T!8FZDhSFzg zC!PUxPywDcgM(Xj@_A10VoP8-dzq(~h=|OcsX1bN8rerTKHB$UJ=<`eXafsg7S z#;^0pJkIm}+Ywn9te$FI+A=;M&wZjLIr3G0zPLKGiu2{8d>r&%ZkC&`C`-EsVFBa_ zE%418F7hDOCpfQf!CJuEZsjl!Bf)YUERZ9CofjYq@lo98lUOqisog0u$Wa6h337{u zEZ2p?W-@niO*ObZ5nhQJP=WDeHg4D=n~TOLtO=t*vom?fW?1U!hc4}(vDgY*8CC-~ z)cG578lYLlPIj(S5f!R*#oTyO(v<60i=`O?+w3uCi>r`I$e>nQN4dVg6*%BV9%D7qE6zZ@2e3w4xu(Q|%)ns?6v_3kLO=ihp zrU8r_HQ8M1;l_-|Tv6noWr9!%IV0zY2i;sR^G^ESd)|H+D8Mk7dT40ceOP>wuD@PP z<2!*LTd;t?nf=S=E!))^`mj8V+u1+>;kX)$1v3)2(Is<2*4?Y7w>Fmw1rkm+n_(iP z)FXS225n6sR-?`WF@kbec-^%YJtE|NO*KAy@3>TAeV?y(d1FG~_u{>ZPLGRs`xXP;nrU0SX4^w*Pel~p1Y^=UQJ zc54vZav!3wkcJ!sFI?+*c8VC)HH#{Bg)DQY>;0fRKy#UJBLk0uQCJpi zP>{0Pe(V0YLGhh-(_CiZYV?aecvX(FT(7TSw#s#jVs;0n8yu)Mauj+}cc?RBlh{oD zEhy*(Ik}*r7?KwOX>9{g^WnrhFzy6{OjwJED2r`-a?<|BlfkW-vpmGf=r?5g!XSnJ zBA@NzBbxh>fJ8vL!5;hME!FfBTJGnU#zP2kH0%BFnb?l1;lW#DF#2a%Rk^XHJ^p*g zd=7deSdl+J&*mc=z57^*98-pS^fQIl&KYamGFQHU2qLgA`p3ri5)K=YRYuE*S!Ojs zS~iUEY*(=P!G-?T5y1mDV?4cHR_^CF4Jk*-lxVYO&!@8eTF*~ea3c84NL%H% zOCS&9DK4TUrsgN;9A%r|^11!HQb48X?i!ufmLI-TBGjR;MOSoQPfqia$c$u#q_+S_?C4$DL+Pn)_w`a>Ppv!XzDdHiCssJiLto{M?!{o@c-W8vX*VSEkw% zUD}g^F{Rm6);*j*E>zfM5~M5--8fV4XmkR`F&ET{Jr2?xx=HvD17Iqcx|z5}wA;B% zUj=@<8)qCs#%id(85XxzsL8}206)yy8C-TJJ?JI}yk=BM`w>` zb%gW-k5As?ZW3joQZdW-(HKQywg6FhPkt0frD zr9<p&v>eXa$q+^EJ#+F8@{88WcqU+bW zT`th~+JcM`BfJbvdpO!>W#2z}F9E8(G{>hzKluDPEXYudoJ~TXzH&=$Id3|zY>8ltTlCI(QKFXoKO2lCH5#Chcm>j> zNX(;<`F2wwo`f`C&fQchWV>%|+fR`G*hEQ?fOUbW@Mnv=N7UC7Jy<9jy}DpW9d}3^ zDNGnjr+k~sCCuyTy(F)xNShEgD+eh}=LnnT{5(K^VxSVPL7DsrtsBmp0O2E?DE89Q ztl#hRnmjQWv$JFMg23pRm>JotCU~-X!^W-4#BLe3^0wl114;}TKKQK=Am`-*&FW8b zPUF%!Tvt1otlkLNu~z!nT3hJgXs4_U=R~5fU-hh{3h|^k;(2jyZStNxzoFZENc-&3 zkfAAi){i)ba4U=qWN`>~2IEgAzYEjYEwtCCwkHhrQ;o}^eiky8 zJeR@Pb`+mX4*xQ?nVTS)_eW*vh4h;ee-rkX5wxe2QG1slOn0Ecj>?>-9+VM8&Cj08c%e|1xDxnBi+DOEZK8x$jR5$NXBa8?MUKY zjzzVR;NknQX<4Mw&1uy?Asj#YaDaAlmz?z7w6J!`3! zPd@gx1~rJXNdaKfbDEHzcQhX9MnxXdS)w8gaOnDK=nz^~ZGie`oe@7%biE@o@ho-n zwxdO~kHu8hx-Xw=#bmO72^Gn;klvDl(t(fI5PnSW-0n*Yl2+xKSlBa64W50^cd4^YduFGUu5*IdY9sVir` z@pkkMenc%e`s5b`rOZ!Px~*1C4I9r1SJ2aRB!r@CA^aUPaW27Q;*}2F>H4pU?DEm( zdkTw+Tp#kc5lyD~Vno)hoGS8$4Jz(Y;N3BpaYR-UwljXu(b=0UaI;J z+|ENaRo+nK2}+)_;U_`UX(^Wpjft0xzIdzXqHmVkh=)_^vUdB5_!n_qBp#&q!AP!N zUeAX#e}3cfv)any(!9R={yhN8!}cXg=iX8PTAs{&pBS6j06FYiedo1 z6iHV!-j*LZT1L1ha+~yC0T&fz|97>9Bffif`cOle@?f#Jgiri3qNC02ro35Qnm2|! ze!a`aYXS4{AUvVPPsi-t^peyE5RWl`cms1Qt*O;ALb} zB}B4c3cm7xFrhSvs6Q~P0XBPFczWYuxF6}yk3t$bX)WMU`g(7fQGD?-Obr?-k9VBD zz9*{x6MJbBQVmMmV;_|;`SOvt2LCbC69?!T#Pv~vYoaWSadn+rtDmodY%2!&)l zmBbhM)x@T&B(rB0j#zZG6~4oSgOmDE=klbPiiT_g_ppyFmtW*847P ziI&32LgJB_wS4K)Gw{o@Zew@dE12czs0$#19gH}Q%y1ab3uXNn#AooqjAFBW18 zK^2J!Hr_!RJE*<7F!zx|3kr#saDxL8NjzoD-#^>(t3EBC<77UIgB9X&#i}jA2Cbb) z_EGjr!WUB($HP^2?K}GE+7W++^Q>bKZ>0JnwFo0XrF_lx20Qow|E%cgUvkeCe9iwtjdt3-5%}l8B(!do)RljFJhD)qxy4hMj|;7xD78Ut_+D z{e7nr62j?S9J9K@nBB9c!FC^+4SQ2*Zr@d3>~MM!H-{znQ9wIS)f~8+-04WYFY)Q} zE#>fwCT*TVp;xTe{mk4^CL-ysbiWgD#I>03kY;w}N-Gq{*&c%@io;t}1S5fL_G2p4 z*Y6E4;c_Mod5n?#LctdEW{EHz{^5n3Nb5!IT3FLbzN9Pf;5g@e?MPX7VV#{6W>i3T zfs*s}Ks=#p|A5_mLij^8(l7nAd_Yvo4P0g&RbyD-oik5SeZp) zuF_wFy+$nO^Z$woP^R9uATVqCG>(^zmLcXLW|z4JrRAr0#3-Ko*t!Qt=oTQzOa&ww zp}_d(QI@gV(V7;|qZM+qny0~{s599NFYP-P=`z|vb=UmGJ^LIlI{crop)yWaw-<^> zvhVLT%;)Y6C$@YWlcD&>X($a!!`~K8c4JU6CuyS=K7)vva8DG9r%i~-2in#2G#aO^ z$##HUi7Ww^klxkaIxLJfCDvTYv)wEpFlFY)_kW!a#mFYpt={Y+rfYAqh;z78bL_U= zEOBBrW|F8r+Wd(u#Cje_GVQTZQ-K^3VJ%_b9NA+^TUa=IPbgk)#i*|aLd3?*K9AJH z=!4d8Va^GLzndh8kn);kAuW$U@xay0>Es@uCOjN!bj?*!vz1Vjcl|yY0gV#x+{+ps zhMusA^lxwNM7rGv?zhh>J}be+DKozR`xr!+w?e90dogGxukY?o%9dBXd9FSOad*!s zIux}Vsfx--j;vR0=wYZX8{gZ+&5(V71k z&(b&5pcPZOr&It4IU{M0QvBz27=rop|84Dmz5*G_=Ck+y!M!|8HWdGO!ff19*S|Vr z8xqoQE~o6+e?X4DZGkUl{qa^SA^fv7#K&jZy$hm{Ou5lLev+NQdNz0k>h_AKuIYXo zGyCNViqrX+nss~OBgt=z@@rLij}vq{v${aH*!=T?Vk9cR1vG<*0uW{L6ThE5IvHk# zaIi+~k4>N9T^|c7S1sN(-!-u5_x@kRljj+^0A<|4)Q5kB5npDhXHcY&vC-$l%vf20;L zrI~N@9G~EfXyaOH|D&*ma9pC&HzTltYnsn8$lvfn&PKy6aXEMedJek|Wo@Jy>?4Wl zBX0Y(zGN_zF^YjLAXalItEocVI>2qB&(j-|hok!nqfxwXgIf8s{&X1-6=s0BJqC%0 z4~P;ymG|df>jt4mQd`J;l)R?H#%>k)DB{TTb#k z@AaTaa`McH)~oh07@vV|rJ?3-d`uxxaMZfW==P|kS?VP|L$3ksD!gT^&2~QNnG;-w zFhOs;ko1^t$qr})=Ut+n5WUJi-ybwuellNWK@cc|ybz*HFL7}occ+(8Nmpa4z-1xO z%wDhVNZ!D(e!?%)PkKqV)eQBcdZdfZ^Ks5brV*T&_{OwL@)zY*r2-D-Yytkbp1gFo>SoJFS7 z%r92JOY-F$y(WtTmI-EWWOiM_lCNw*)vWW4?IyP7Z49K0(L7Jwr(u2@ z;(@xGdx_^57P{*k_Rc?}ngTC9;qUV2MsDUpK*UFWJqeY<7;N&CicZsP_&*Y(0<6yM zfe}=Cd3sYTP`}?NB&9*?R}H!mK{*LU_2a!sWYM0FS7{5w9a}0PCC;U#U`}J4(E#&~ z*p9tPqWRajHl8e={cd9kS}g(}@wb`dZDD@3njGXDloeZP&YHlk^tB(pC9|vSw28Gg zp^18HA6u9r#|yv)@+ZL^Q4MKS2leWA(ISp3nDT^tV-u@!eK$ZA9PI~9taXt2nOT5{vikC)%XVru^rbuaWA{8SZZLz%8|Jk8Ymb4Nd$*E=eKrP zmGxYGfE#DxNZNCV@BxS5BEDZ1;a$AKFMW^uyh`r_*KPvh(<>D4ZuO`er*+_F2Pe>Z z%CDX{aN=6~LCM~!(&1_g;~^+4kHKWV0VDpD+j#MiytoiDuJk7b5>L5l zb9K{IXEy%F)>%ns=#cvnQES(ig&u(FCRQj=&a74P+MC^3Dqcgc!XNdzxA8S zi1rno(LP>%FOA{5V1aSET66(?ANHaGt{)z-nE6A&A5!;tWNwy5hkRWcF;Gz>3h!yB zC-YGkG(X&_RUEhhY|$jk3zK7z7m^`1;9j+dBP-G}W#Xk+5w^kkcMJh&FXPm1cr3D{ zm_Gec&87^SjcwxoO3{nOjde*xHcYy=3ZPcF&eh^=1(qqT!cYHf48m_tS zx$pYl7@V%pU4%T0@UbV`TmEWF;bkEP`diWj6d zbjhE)JS7fgjd7ZsM$Il(YuS%asm-W8U9>p9!e0#iW{w!Ri zL}BF3cAMOD!);znX29{oV~0g!`8njvNxWDA&Fc(c5CxqE{`9KIM_b)JFFUm`iAiyY zy8T&GoM4&lE}q>rDp5VzCZX+?$u&j_gk80_hy(R@cM~aogX65}nUEwSj+S-zZ`)Xq zDsp(#eqqrXY(EsPORmfYf6Q4jzDNEYkjA*D$Z9_#F9gY z;`fQEnW8`S+${a-GdwK8>Bg5zM-x4{vtD}vARAc-c_+hh;1G6I>k-E+{j3r%ZA;jN zlo$E_TtPyMP*c7VK}iOu;*N&U-;wr&4FfL^3<#&KWV@Off6X_s4`VQGEG8nR0H_a| zKhi<+SYAo+{a(kg>K=`jLlEfuL)Kg?DSB26-iVi{I7T}lZZ(mqgwwKVL=U^FjhxmF zLJ^SH%p20DNa+oZqcWKHLn8TKEUT*M9o z;Hc7SOs)Oeiokw;77}XL&aYgTon5q~Au01x^7Am7&1(@+E78&-E2;W}AstTb=$Dy0 zn8YzsCwL7LGc{!SxvIIb<$9c^Q8s|Q^c0Fu^#r)~_9cNSoGG$7xGL-tsOC-!6Kv)H z2SE90s61l;j(l&PJ+Cb@&4Qf%7yU=*tn)aF`>OJnC}VkNqeZk6;Zzvzfa^0cnHdx3 zT76Z{Uz{c!QDwJrM|kxc>cmjwSH~-Yzv!C8v`;iiT{#n+{J_V*kLBT8aKEwE;^s-I zKbvk!mSb^f3TJ4n;kjyzZd(qYe8`W^jSZjvyyM?#N8vCBmkejBmloELMZI;(Xs=eg z(PGlR93E~j^@ZiE-^^pOr?(uGhw&X~=+0C;cdrTZHbumDzk<{sIWOysZ}>McKi9Wv#AvJIY+E49|snSANqCKbyWtIgmije^j={H9@ z6|8tAGr24tX*s>n*LX=a#(t9D6dmYXMV$%b$}a2%XLmoE_uE%l&61 ztbW!d_+;KB=8xMXwLHFi=-qyFq(%WBFHIDpc#j+-uvaF=9E4R(*uAI6eT3C3FqXgV zuOE%aE^5{bCqOU&&!;1Pn>Fpo=+lN+dioXT{~z@*7CFD%xbR7p0#mZdsNt?B2NNMmMdT%$#^#AdAX6r zr@8Uv&hvh;XDl79-VPQ9I=8xQdSWBsape`Jl{N}Bc%<-(;L$&sS1r3dg5V)g%;UEZ zX%_wbUN6+1$z(`SEHw{zIL=7Sl%U+}EgIlZfgN+hIhCRbzu*Ztm8Ujjbpbuw>>9#t z@J;~0zDgXzB+z0^eKh59b^pp>>Zex!AW#3-8)Jr7hsOqqjO84*uy;B-Z7y&Pd%0i*-rUH=y?qnA1k|Nug6qx7X;5de5%0( z?f(+Ot2T_-!1<8eyX=f(jJTe89}!itfK7_PsB65YwB>s#$8!MK{POuR&bQJM;WXiX z{8FI;ACIT^bAJIQo&=P#=??zMu>s*;@S{(0(J3~T{kiG~4M~L&cKEsbR;o?Lcj~es z1q=1PPM5)Wmnv!9o6jw|nCnDO_V(wfSBiH$62wW1(OVBJ>H-svL)+4>-#|+%!L@wTZ%$zOa3k2oze3rtm=M znvR?XS@HCYuAL0qow~{~XdNgl?i@iTW802Jd#|H4wfG(`nLud=s|_Yh_qjBGns`fx zC^;cy%;`@phyXQ}xqx>LezEXXLZRP=3?fSW&r*Weg4dP|(co}_UE*v=jg7tel}vU(ulYJQXfZ9eL0} zhWlS+g!^`x+o370_jJ5{d>9x;H=CqbCebc&>eoB!F>$p}gM=OGQXgmH6R{I^b9ND+2UlS3Bub&b8!;xQ&{NEVK#x0GM zCE)6;(_f^zCbUqF*-kN4wDBOgz&%q&bP1Q;9R>N;0>(enLoohK;HT#a21VvYjdFrS z?1Q}}nL_&mpT>K0{zaCDc?g>Ax*yLvvvEE)+MuD`!}sQ;hqQr*@PZl^U%*c z)h0Zo6?5VNdASd+f`aJ=t{j~@bZbKq(+t`V^aZG@V}Eg`|8}k8rn&w=os}>ZX>r2r zXBtQNZ8Qc~fwmgH);YZdDO<>G#cJn%F#D~*q$U>Q$??#g8zrQMrfTc^I^lKxewokZ zY{eY{Vz(3W@Zo*s6RiZ*Ql1?b*{KQ#*6BavQGbl~V{ifzlt`0xnUmK^C$epoAD+gKaQ>m1uda`6DG4SM4@CoN z=9S$bHw!7{*swwUYq_D6=HS|&k7bj!Np&{1DSU`7na$dn^dBMA#)3EF#fM-wZ{{O9 zoEqDhY&H8Tn_mm=P?1;x5*5sbHVYTRvPQ#q^Qur}@3vk)`(SBT4y>@jBC(bPeAojvt&<$NH|eJ|6WKTah*zg|zh#oaa;I?k;11xI;@(=Wat&*vApNumsV zT;+x{fqdNQ24ak9t5vDDE>*de-Xl0ONR__3w-@R+>d|nx-$V7=H&^={I(6|Fu(= z08}pj4`4@+cZ~yF<1xXaHrsP&bL+Rovzc`5&2=Ry0dQJXt0$4|(eDk?*j;`kM3n|o z{&X^<5{kHP5wU&tIIrw3fm08V?`_0Wq^<_+U|4bd# zn2uH#N)F!YaZDmFTTr9kipfKWfN>%{8;JM+!4qc67*U{ZKix+R%uz$NEUN&8-|1YR zO(RUQ`+s3oM@vRu82?~n)W!c|V^6kg@@9_Vzpa44E$i5$faI?(BbwdJzfOEt`cJ$^ zO0)Fj8961 z-2z|KjmR8(%@{5ShBEmI&JZ`#td|?pUuj)o#aLAtd2?R&{TJ>l5`vPEY;_+!rKt;qB|3^b*vb}h`?DC| zg|Lj5)Mx!&=Ij;Nfd$ID&^p+ zj%T(UF5BBxJXiOzTov(<)#w6N`)u~YT)bezzyZb!bb zOLo~C&HT9OelPUW?8s>}D~ z%8}ppl?ckKS5%a9_`RXM@^^P=iFLlu9G_#Wl&k=Dg>ydUG=a2G31=?BLb(*nnvFlO zV_f>_KMwH(8`E_-*<$;a_>r`g=Q>#a|0#{of$6zopQQ8fZkwB6WoHuO0SbW^B_|5Y z0Y`6G9NxVm_T8AYUeb{Y4V0WLv3PWue4#&8sP@LiZbM8-x--d*pC}`uVf?4`$AjhM z$6iPk++APPpoe+M)!bFixF-r;sQ_m09>8fm>|ZVb(*#g@xSze4x_DQVMI@>#)qC5t1 ze)n+pLpk7x>dgkoYxW*#p-1PHkK*yee-IAIJh=C5l#LtGUQexIbv%qz1Tv_ zX&d@)95d^FB)e3?@w#yKmtKk71*87(L1;JuwjkAj;v#*aA)Cj9cee`3h3m(h9n2OZ zf|K(03*zXRFk%KRPrexHq1{1gZ8t_=&QRivp`7(C8h4*PZZrZK#B{4yGE$r$K2B5& zrIoR`9Ci)up9CW)N|4p~s=+6P&&0eTczS{moSc=!NP7S76YU-?y|=l-&sYFE1yrSW zJi%NE=kb0F*#x|Me$kQ*q>5V<2Q1~B#r3E0BpFQ*U`{AvSYSTY5eZv+Tu7!BQ)QG ztg>(VB*RkP0e)`_1Tuj|5eynKBY`9=-T&J%-_XloDaN5D*=?*1|NSn+Dr&1cVEiir zA4Ej;AC$9%ZmPo~DnyDqyun4f`$4ble=x9||G>a1vY7tCz}|4IEZy}{O00~B-5qPP zW13BvmED!)fD4KwqCMPG{Xnl>w>9HeE(&{W&*EzH zmip1OtnTN%6mr~WR#!?NfDoaLNmRvsr?sy%)Ti&IW$zxuINKCHgHydikb+HZD>ei0 zDF3C-{YJ179k7GKBih*>*BV#b9qprnB*BVPwa9k0FS@imzZnlU5oo5iwc2Mz9UhW1 z#7Pk%PWKRUo8R{MUH5Asm_RSbH>O?j1}VsczVJrk2h??Fd0tlXBG(qEdn&L+roX%2 zC{@(U_~?jNeR}DMGNE3MqgI0(t{b}bmrW!RluT*%=E#)VYqo)5-YtZEer?v{T@EQQ zc&}&I&3(Da6Q%Cv+9&2&r2nI+IxDi8cyT4|vTc?hE^NfRFdd6^*ASnH@WKi1zpI1@ z<`py)0HRqe*W=m3m|RbF_mt(*DGAk0*J!#oxuoJg!#n-AlEpl9f2ZR8&J;?13ZDgYO!4h+Wcf!I ztoc$2`Lo~Bz4lCYORhSt@@(2JaDU5G-cDVzYR3S*NVx@}=v6Tfzx$t&FPtLB2BjRx z`y3F_ei`b9Fq&D~kZ%$v-(k_TR)4XtxPdllrAR$&y_b0HWx<~AY_Duk7C5!lyM zP(J0ckc45xvy;=7H_Hg!7$w7Do0&qmP?7)m4P5pURy|YVf zaM?0xBQ%u%34!H}xqrx)%ZzxSaF25f{C5{23M^~~%EO{(tuu>psgo%h)r@%;swDp` zBm&3+rGEVlC|dsz`{y-Ch1{EPN*G&)d$&>S73TjeIkO_2EdL0=g6JQ|Y%Jdr_{Y6| z@9+oLhFWH?-Ew0X^lRODk7}6^6mCa#9`H1?EPT+_wrdI(QJ#vu#)M!}5dN|&hbc`$ zBqi6N=eIk{U#F&LLSAnAT=SIzeO^4)oEK1W<*P_t#9y^?cdGKdN95nLEk084()p{n zBZVF=++TWJ_Yk<|=TsEZYgW=QH1K*ffd?VFPvkR&h91?Tt!f?K(}Cg%mtsz%@CA+@ zzS%%C$CgD9zrmD8!)AxY$@z8z;>(n-)m-bES~u`=jmCKWmx6bY#QrIo`)}4NRi%q* zP+co9;eQvu#YJ~kr!Po{wwf{^a)?{6^g<@b-LR+oR4{mF+r8>yZ&rT}u-SpSp?PXZ z^GMHI11g!vV#~F7O=X~HwRz>9HlTj#M|2b*zf~8RQ2ic3nKdD0HF7fBpUDSU`9~;l z0q*zx-mqP3k&~|&2&XwxsQs1d;sA_YkP7+J7;mQR=g25CFY4`^@Bho!XABL*f;#01AF*IBnJnahn}D z5~^tSQrEv#hx$BA&^k8R7`nbWOhJ%%S2oi<@ENr>hs%u2&Ja3=v4?zW4Ek3_0xz6Y z4w*Bk!e31WK;VbVu1+}9BtIc1ho+M#(!Sq?pCAAU%#Xr(K{y{NGijxSDPFvP|L)y; z{tzih@E76NQRMHRWId(36E0Q}w;<07h!(*TkvcIMY!!O(`dz;*A?4kDD*LXmsjKPn z$x0I+s7YCuq#>#MbN#x{NLKa?5*!|umjFNwEf}U^>wSy?Qmb_;35YL&x2r48eaI{T z@tLU~QqL%&D7;!~_ge6Ahd%ls=#|9ZgrA?b3hC#08*Dl9_`XQTbxCUpwjh~c3y!_DB z+)#%kz7}hwB;*7ZBhjro_u{V?bJ`ZG8+u}aX1gSA5~UmF(R&e1`LUom4*&~N%Z$f3*w``qU=|ukDUT zwpcKr@%JL<#ABBuS8lFDLJ88V5;KPi+^R}QN0K?@8Pd9GvYT$X?Y~p3&$n~b3k?Rmg7DuNN?J;k8|_c& zGi?=8(dsEJ7U*x!q-SMZuLa-L=LXoWr_2xX#C}0vEZ_n?R8L3Z+8!aFNu1Pk6d!ya zN&Iv}N_4Zc$f(_?GMs=Y4^`J{rg-226rjcay7wr%OI3U$tPb!sW&)#g+#I|Bhu!sn zrrW%55Y;yOBn)+edmMNw*?K)D-TrXHMRM!LFun6?GjwylVTVdif(5SQuh9jfhG9A$ zFnhx}RP7`{t^sG(*y?EGpqjm0^t|u)sz0{7(nvB!dW0Nk5`YV5nJtVOyWR%thtqFm zSij8-0ogB&wr`)Xn>}0m0S{)C@vDGtc0O52ZA>wq2HvY4wz}Vi8?=tq3r^!8?Tz=& zbL`4|5ZlqH2eKdawoeBFg|0fRSYK%kjiK;Kw+ga@e7u-|0%Ykr7ALzeSv@sUSK+@} zky&;@7?m#F#xA?0QnXA8EGD||l$0f_w^FN~-m9;NEDH)7)q5rG!9&AAx6p#Q%iUDd z{;5eWu5A@=cW;}-iE4s6wLnaxLfND16 z(_*7;=q*9y`tNo{5|@33dwaDX7>h`qoXsa^;u6ENa`EejEuZgtM|SdLGCHdVVk_we z_V6uXs-Z*h1R1 zyN!mmrEoe&c35v}Ba3mgt;5DwYUe8YLt4eE0!SuG>kMUbT#N*(PsPSUnTa}*!T^W!Vq#_^IprV{r)2*o!p6rURIe3bP<~L`? z5(3dfqwFh2-Gy|eZ3`jmM(G`s6SX>=QE{=tmgynM2_hn&sRKG)cg7@g z+b<7;JPVlSPEx>g5WQ-x^QRThKXj~g-k2Y8zD?qb%Pa|ZhwU-M%cpkfakh*NFE$%* z(>vUk+Mi6sr-m!Pxm`hXv213uG^Vk%7&N#aVgi+3=5&noOZ`%COya+@k&yk;8QlCe z%%_a*D&!er9+5%{vXj^m{C;Gscu4^}jvR&;TQPU#BUAX+e98ywq@H(lcCvl5;^vLK znAZBXdW=@Z+Sta%LAdiFfN58gaFzT@AsqE605n=NjefeFs06$*dS2EtO*c-!e!e~V zxulMUtR{ffevPkG>STzoYjGpH%E^2D(kKY_L+SD3R(=Ee{ySx$Ag!;j@1rNwTciw$ zHXt=OC(jghLOsLz?+paJhWs@j(#fz<6YM_T_w%xadp~Ao^^mj1G~;q^th15Y;yO7U z7|hW~TG^3+=S1@S%;K=)75pL~B>mamatRYr;2lN|G0wwOzZ*7;Zd@se-Lnz-urKOu zTor+PMqV0eK1u5NG~vw%^(ua6V&SuWc3*nl?ej~SvK);(cPz(%aYQG-lAk+qEl=+( z!`HOYoL>5Nc&ryTa!g;hH`aU={=s5(O*)yLX3qOPaotixMTj7omNwkv>L&l~UF6vt z9r|V{E-47>auj?)AbtYc*)U>)#ZO_-P6OQvO?h`ICRlO3qhutuG(KymO#Cc*n7{^i zga&Xrpa?m0`mC}-^=F&D7>=G8fUB|R>W?LmTCf5bENEnAh&MmQryt(1zvYb!!?fCW zJqSLTt^+nXF`F5cJ5U|crl`Y2j7exC> z9`1U1qT$pi>uQCO-Q|8Ed=Jz4`i~e7%Olm^v)g=3;9)_M?qcX}aI;%bMuV8)=JF$a z`oRq&DenH@N*4J5>K|Tvb|d2HRFoahUGWdF;wl=CCP`5ZFTdKCixC@bVtDoeGf{_i zI80Ur*$0_Dp<9?ux5zWcJR|;zCEfm{TLs~}RhL!+M|#Yq4}|y0QKa-eRAS`2GM9^g!+xkfCx;A<6E-$R==1wp}S$puhYXTYCGp^kw8Xg!j@=< z_utT_CvNcCeUej?C+dp63VDAS%E$7`G$#H!HGHE%kIvwJ%H25+ z-oXUK2t|ao~sNxU`LRWwrI4S6LRd*HnU#vgJLN7PyFC_qS?@_cb zyzPZD%jz$&yPlIdfe(F575enne~y?h@z#Pxk!jIy1a4pNLyl616$c?V#lMVuqhTd| zn<+1kg$CZjUq)s$L1(prL*UiwyYZ%}E^+Bi2hDM_CbXgiY49`VgtL-2;c2Mo#y?UI zhOjq5+bzMwfPOi0RAlX=I^Rz_MelZwoby);zqayc3)OkwCzHbDCF}IzA3#7ysGmQI zPlEyqy6!NB<4T_D4S7BzDphYbtRS_A5XMRowuMz^@>~>Ss=y+2hkvdXcQn#7ARXl0 z*$D3KbGrDs%o`WOs&V^Dn2P>G7*5H~R9XJ^$y=FOBT9PySg|hRSsBG$Z!Bi_9M82bnD$&M8XqRq9A$JCG&(}Gv?^UJl47+ zCdis{+OJG$!}Apij$$Lqjf9e4jNx{e_XTk>0+#Pl9taZPNclVV+rTFh7&6!NG6QDs zZa+_i-}j@@B}mQGHsgVu*w2+OOw38+FPPoMju*P(EJSY|)I1~7(6%qe+YSZ1^NcZi zX}7O*DpD>QFRYGU$F;si+PW5s8q9-A_TObvgclR9W%fr#U~D;9ONha?J>zG5=zLx< z+LDUbGS@)3@LHf$78%L=80_ZOb{r{!rWR7qEln&zahl^t6{Vn2HRl%gQZuFlYM6XB ziuFsrtVS=SAG2^GkMyUz6^S!-NX}dpl%IX<2JQM?vC)s-o#mOiwT?Vjqv03c&6kK6 z=9i@2i6mtZYJb1;y>uQ{@@q3C1mU!VJ~fcR_mP7UA&Wk*O#d9p&~{q2`d=(jX0$sE zT~UFU#P!WD-`uIbGNz(=t+12kS(^+_Qazu$-&T3xY`HzTc+I9FbA7UrUR ziy!h!pGG^B6>jeY1spDpye5!_9m(_rEM$KSRIj)uFmDSPosr0tq~c1J+j@&@(Aq^QqeT~zz$GiP)Z$(m}lWwy%eSYqI^R||tO8>;LTv3PgN!(LP;O0V7uiF8z4}S6q1xDBTk$0;Q6BlV`zw|=$)Kf;7-Br*++X?4a;qW`)IKqRfIu7;btFykB3?ku-UV(X!dQ^=4$kTcM z!_N#wjR-}ThGigJbqF%7^9$iS@Q~FA!z;ZS2rItNboMH~vOFQr+?sjLS8{J>94*Px zelo^_hlm)t`F>-=$WWW-l6bH{3SXPenYkG0&tHv~1}+~1(;k5XkuCRM^bggT!_ysF zZ?+ft6(?X>L0&8r5i$gT*MJ|igw<~i%GjL+^_d1aw=<1|gw$LxE+oMh08Te>!0xM{< zB7|vVP&Q1&d<=ho?6l}WLC&2XxY6g!U&BM{gKvClewSi)PHyTE_BV$a50$5n7MpX^{lT@X38i?(e+8b0nwZi581tPajd^8i{Li zv8xfH1ZjkQo z7`nT=yBmg>*`q!_-}mnQZh!Ctk7Jm7t#z-p&bZF&AtKnq8=GVebBRBNAN0WjT+70@ zyJ_R(rGWcY6z8xRd!_nN>#S=AQ%ubO_}p8NB=1MDXse4+|1_aUW5Low^0;lU)dU(R zJ#yn={>dQ2&2RjGO^{9kuG{G@Y-Gss-tE0#LN%V)-tlp;SQq%RhJu7U9=j~WUB=rWFha3w zg-}*XoSk0!eRk*FQ}Z-kM}!!0)Dqj*j#7qf-GgtsX&Mc4-nig);^}%=)~#0rPR8Sx zrBTrn@(@-z~j(C{7KZo;W^m6DEOlwp>G-KAlB)+*j0^(ZpUeSTbD{ugj>)J*kdR z7?Kd!yWnVDQlb&KrlrYn41sEypG{fRp>y@p<1Uds+ZOgo84gad5r4*2F#N32Vm37l z4QENz^pq`ebuyRy=!TLb`$#eETrNO&rcz_G`PstdiLTs;$^vM7s!Mz17dU^%-n$Ep zJC7iEtJA<3Z2t8br_x)+;qfDmxBZfh)3ZwL!NV%1jsstN)rdUD>{Ul!ADm4&{_-U? zy*ANP{;(;i#`I!(Wd*W=(E<=p`WW;&h6PwE=tso;CueM2pS-XhpHp8M{LBs-%`n(x z`dHwa)2&0nHx#JQ3In}%+!qtUCoBY@sBr~-5p^ye?fK$v<7up*zNOefxuGaj_qDf> z)H7wr&Q`X2B)?VV{vyu!S#<(lo%4nSYZ^q$+xDT%yYBct|NME*}^1|9rG`q1@pUAvx(t0z8Lhwt8HF1JZWKr@@D z9N9A}e~~3$9-2Sd*&`^*_qm_DGUA+YC|;Ks#F>zDxW$2HJyOkpv8>|}JH z>R2eBryEWz`si{#Bz2%dRLU1s4WQr3ywC`6H31s&jX}CjZ)BkBp*~Dg$$;wG0-1Zr z%LlpA+@?6p3Bd3p^pHZZiwj0~>@h1K?E)Y4R{$vJ8BsCm$XLi?-^65WB>_A=&Sagj zu%oHQ|3JmYpe36zW3e zFuSyeNFDF`iDpR6XYgMJT+A|QtpHLP`Vm7R|Dm)A9g(2*CMODU zaNoYR%%ii{lYui~d)pXG+hq;K%`k<@*kc$O2Jozr)}+nAp+456C92KDqv#Sp%fS(CACXWuQNQqY;#+F_1?+Iwto?+kg zTt*oJ*OZ40Qi+%7DJSF!avV4WN)k{#ui|GYPz* zaZxGv%U!oAFXPE`5x?Elqg%@Zbs7S~FW;tVauRl(%WH1jYfAvS#zdXNBBfWaptAfaN=P_(YKyRDM>mZHpK#)3(@SMbTZMxJB)NY8{zT0SqT$3F{yNxK)+Wwh}$ ziRzOSl+g%UsM^Yaw3YmQi$FZ;i|wBv!hyfG5ibp6>|R~%tz|WzD1$}gj);^ilMP{i zQ+;5++YoMae$TL9p7YgfPmAyQV38aB%c*yI)Y#I+kytTj3Z#KYc)gN z6Io|v&17H|cu*;BsoXzCp*4-mbq2xlXH9ky9?2KFo5BNu!>5E+<+SNJep7H;%9rJ= zBrbyqRg28}8=@_DM4lKYblQ`G;2tsGT3~TrQAO$&Q*(ylxRw{wJ?UC{v*D`*it;vi;c)|nkcWR0r|NQ)Ny_?X} z26OUNcIOQZhqSg}EM_-3A7srX` z@3{vnUK_6@zpa%8e1gw=v$-a|*Q5BH(OFy&Ahq37VR@p`X-}pE5$>LC$QQkU&*;t_ zO{@a{)*AXz@#x38|C{uJDS_Tg4G|+eci*sNBeLe)BGhc-J0ziXr}8;UIvbX0GxwIf zrr>~(TI-G1<@q!V9{QX;;k`n;jNIdU;VG*}cPRr;`luV3pA&y8))2A3$RYhYx$?*Q z`q%{kgiBG1h=^Hq|xKZFxQc|#>!&IpKk3EI6WYxi~YSCY{s|m{75CCjwjBC-rZT7-!GTT zCXBW0&2`t#Y(OA}=(<(^VTYkkr$qX$>?V>?>zB|O=q{^MEI-+$E$h8{NH`R1EUH6t zv;vv?;N^*j$kRNzI)-I%TjlZ~c-u!%dFkPkRQ>Y2AAFyf+c5|Fst;u& zvn*Yew5_;@)jmA7Sn>GGXw{&D`xt=B3idq4X&VXkHP_o4Q7lI#U%z-P$TPA#XxG4| zUG40lz3IK>wRfRCD-G%RCRpnQf^+pv@q{&8G2yNj)1df)#!6)=Rz@Oyn*_!!#eswKsA8vi+0cg zu0&S3h5|Fkojc|z)R)3$uGH7A3kkoh4&A)uq@m*#RKtVyhlB#&S@Z!1>Q2i(Y35+cB+@kgM^rbW}OVxWU zbWrL^@AaiP*N8Dwk-_gN2pW2QN6_upAw6{9#X`f=)H*^F#!zVm@!JqFrmGW-MY?JN zSGXNJyw+%Y!@8D$g_m(D z;OI-0ilwZe39{jOyR%x>YIJv4`^dWg%j8WrI~^2A^k&^0H^%yYV2BrT&#t(& z{wC=fN=i^>t7pn$O|-a~1&s;!ld9(-J-3yf_KCQjZ zksW_NPHdru!<8eOB6VAMUKxGsJ!kEiX`R@r8;;iP#aopVe%a|Bp{Evd^b~@fF;crL z)RGnZR76JAAVmItS%NXcqd83HVhK5ZEMmY@3<}&_B_%b^%$u=}FhJBw1C4YVCgN{4 zWhP=YmzZ7xKVd4ESd%?RhXMm&S(-V@kqBfo;jLbC)#a5*Zgrv%xUJ z6xVR6Ph0yw&5qQRhEPfX@+=es=ER`XS`yDv&wS3@p zw!amR=B8#VywGmxd&ma713nRS%;odlEnUw>q1WQCQ6|KnwCUt#;pa^_=*Ti!nSq-s z$XspfyyV_zqaZeRPh>tJzUyw($0433(cgox6XoLa5|>1A$KyMpu7y)B!a1_(5c%o3;*r~T1&io2}(OMDvwH#)W;qAAMjEqka-xb6U^Ec~%(KB*7A|bt- z_lY3@@*C*9R2I96j)}beGO?qtGAJE_Tw-_y2i$kb_;RkCG|_gr=o=KIC+>;*+w z!B}_%K(7zTqV(y1U@`^-CfjBC3ThB)X;)H))l!+4bu5k~B$J`X8B}omi>G_brk!iQ)A-kWr5$-TByYZ!Wcl3p+u-&! z0y2TQt|~Gw87C%$_hcEr;^9v7C>StcWEj6HUUcxZL15q_(OcN1B0K`FZ*BS3t0G$= z>|!@@-ODD8J(-Wi-)FJ!bVT9{Rc(r-m=JTQ9gVBUkzL4(BQNyg<%eH?i683VMcdZN zh_jD638*r=y!^z)dY)Nl0|$#_CUKfYlsW`EZDlZ;x4wADc(_1qrcK-lkX%6zEmF7F z9rL+1U-Nr7Wi8lQ3BHvk6i1E#oM?NAKr)OQf0m0}iLzD*cJvlwFz}yv?ZMgqCq`CZ zgXCuICd4=1$4Nf>{1>2FWFheXA~en1zX&by!&%sGUs1!HkzZxY{Hj>9i4zsiK%lwo z>XZ9oxfFg|;P^5Vz3$$~H_nVpsgWaZ7hjm-wHH6t`0QxG%@zv=QbBNPby=*W0b?7F zQEDKKA4hOc2l?~F(L-H)a0|{K%JnGP2hR959@$q7+WYKn--Z*flTWK?A}IjfM7 zOq?_7y`VWG&Qm1U+E~on_FBR8)*lM`Fy4wb z<8YLEQTkN%+UTtVJ5Gp|^YuGnwIs%MbkGvbywZdZ`r{t``Ldrk zG&k!iXHJY6{<^VyvcB(PNSV}3%Vj$*>J{H=B-cz0ByBHgrGr+dG9q#L(ql6lyZ-k1 zK;?>xdG#qA5OdRiMfOj_CP*z!xD}c#nEl|VR@+T2dhquTJ1k3Wk0kQ&NmSN!t{Y(+ z9-nDR0lZ??oD`wqwS>7E{2e z$dt_jaD3LA0U@`9s-f%{eB7p{#{=)l$q5XD>OVn+!77nb6r%jG*$Kl$yW>j6({1u! ze?V7-MN>Eq>0zCBt;tjjIV4Nt6O-sDky8ywpTe$K2aIhL(yW-6m9iALWrx!LlPp3V z8~RZroo@4hKlJp#GSP(tE5;_Pkg&E%+7x8D`htuE5}RtA6}xtHhgo9DlBcaGhJM$( z<|h8z&kh-Kh=DNTrE)!Ym)mZY_2wB_a(mvmES~s-C-zx@O14|8*a7c8tLROz-etrF z`GFV6v-9S8*_+P+*B|$G<%c6Z{6=ZWmfs|AqyuPj% z53Wa?iF-gwuKymv)sU$ri^sg#fce!2<57jt)ExIF!!;akaHkcg(U0CE4XTUJI3SPN zH~m(aa^{!!`-+us zlJJJ)CWDgiMmF%$y^C>Jk6AKhH=lgYlIpHs3_!v|5wWBw6P&GKh|zNzwY72dbMFjNO$47``H((HhOPhT@B4uz2wPZ0NUG|sIa22r zAF5pweI~}*q4NFjAiZGfRKrs2-R|;WzxcQ&{x`1#>$B+J$$?Dw-`@(Ni~i&Egt$(F zo2L{k#*Iba*gs6i5$Mt+8;EVayGkV5_jQabA|bkY95Dh_1lUF<`2AjXpF8i%b0IHc zDC;XY?{Gj$-S(Bp*9G($Ncpq^B@Xrby^34UI1zyu*Y37U(N9OSKJBwXPc5w9Td0-! z-G0`AhiBp$CI+-MtDeP)OOHfcKTo$w_kga^1Wp4kBDa0$RQWuyHPH~W@ z&t{nMkav-E$WjKpSe&gLv5CdE;w9el2SscYJtx$bkMf>}&i77`DaI9(C=TjcwW_6@ zY9D3M41lt(GL02A>8*hAWBD>B4^?kcpT({O0O+ArzaJ*hj#3pT{@QkRDx;pOugV}P zYOe1g-i6Ps(%z{zomN4iiczI#5+a%0=$&Vpn!5v-7mtfm7i&{pX;7jIcK48HlEIa9>@yk+m&rVe^kn@|8-kItxQ-k(bh7_H{OTUOf-xCI zXeR}48OFovKKA*;v~Yf9A1G=(3F)y_#aAO*tZ^haF{C=Mz$zhO^|c3xZ4i#fHx+jU zjcYb|Z~yUufxW3yc>ruu<_n=3#a)4nO8(Dczo!6FW$IoR2p-S>ti|aQdF@4>k&*G{ zI+ZP^Eg3l!uQj+|f(6NZXJhPsz-Rtgqkr1f^mFCKPh(4G!rDl)7vmeNg^0J3CX7yw z(&_j>lycb9z5U}iRpWYlMr7CdjU{{}l1;Vj+H3d&_j5n-7}@>!rLo>L-*n#{YOHEEv3m>eQKxiSZ==01B0)8n0bLoP^^R%2 zcdc@V)+!O~XZmeSd2d5|M$P|)NA@luWz!l%D8QQ)lDyWB`>6BDEh; zM67fxL&?Cm7ks2&f|@Xf*Ayy$4|#UwIgzmz+ji79V&t z_hgL$#jFe1y3S_5-3M?zxC-=9CFUZ$I5eLt9jJ-|A^P@iD2=c&7ATQ;#;AKTRjjf~ zB*2HqxA1T_;vFg}mzAT$z#Zx*#b zV1wHRO9Ij1o{+&khjz~cp3Auxfcna{mmM*Judt6>xl!m zW0IuqP4?KO^t?iY{s|m(L=5$ygE{mc1#1iCBTz_2WN~EnisNR8C9)GgKU`F+geRxzdo({vpW3TU<87m@tz%C*ZFDpf&6p7P zv=zOsR7a(&p@l{o-FYM$q9TQT;ED4=reRICJm`{+dW)na~DJ@u7)`-~o zp>9*Wkx_svi#8ni!&MUhi8>F>4EOG3;Bs9MqO~X9vjp7J;dEy!sOui?HnR=pjP;|j z)^2bc_6WgDI|2+rxlGGb&7(Gh|9?R#J}K)+g^Xl0IyL6IKEAamY0AKslZi;LB#4Q% z^E9zDNW9jg8xkh6wN6gpK`_&DVkM(oNJ3YJ{9F;i+1(>Gv-u47{{?a?QN8}RTR0VZ zyKnLPAK8BI2-K;eAA?iGWsk8HiIamTxt}B-;N&7Qio7dp5J2{Hcxn-ii2K z7FpL`-Q7f45)pzdlfhyPJ2?H8Cgumjdlq&uI2bvc?b9LF{-xm^-(MkpR;!|T2jHkz#+8z4EzJAYz^5vt+d;JB4`PX7B(W`(bN6OL4;gYBw`JFDuK_R z*d+guWPViazbn!HUKIXq#M((UxZY-}e}`!sGyBg4hb;7`pTipt7%xo(Ps^1j`{v3y zkcw^cV!Ql|D#UH!_jhr#!hh?ihA*jB#p z!pzxmvp4!PaOW#(^Qox-3Df&S``2Jh6P<$f&Xo1DuJc35^HA31d>;m4e`$U}h@D@s zUFmh;_mG>cTmmDlZ+M97V@g9qYrEQsiBO1D>mxGjMLwi7`ok#Ws+YHa1_Po1R878r zd&!u1$!L@wuwHsTwHB$9PAbH;|A^lWejUJs01mVin_qzM{{g+UF_m$J5&jbGj2%j6 zrk!SM!+?D7HB-32qrlv${!^RCM#hB;CcOueu9pAmS=WA>tsaz-)(?v>&QHb3FthSOO98(x z<&ccJ!NDM(#%jGNM2Evy3`pPWmFBCUXOF)lCK>DYdCGPm;+^m6>RmS4gW^a(+T&^tmqK9l{?9EMCwmO7%70Z2OU z&fYN|G+u>oB}pfs9-}`y_U222lYzeOcZYwlG2IHzj;?FJoMf0n`L zgg!FKTb%ln;Pi;Q>P=x}LHqOQCwTPU(9eN1MT{yJ|Fd+aYf#4Pc&}a2HIxI^>N^M5 zhP)UOAuh|~S7H1CcZg4((|hBt@JQg3(MO7GhHs0oMVc28jd;?^G}a58^0sern%KW( z!@Bgpz<5vhSk@P_V=Hc<;PsvmdZ~6UdbnnLX)%EfOf35%*Fjc+bz38{{U4wVZwRa` zMTUNCzl!*#%u)iz%LBu!LgK^6hhyGwY?xH(DU$5Az!Lzzh2bE2_sbBG$W6YxsgvrN zfGL8y7y!2iBp1vX=;zY)INR%Mz8-cV)HvvHK^L^AeY8ko5U0Bbn%(CHx?1z;<$u$G zNzqtG@ym@@1eVtuQ`$~`vOBE3`Lk0&U?LtT{|i)Td%o|wU4!6HOR>;V35bN#OS+n3 z283DzuwfWTN6-m^Z{K5Cuzj!3@T<0bJ85g#4c+@}Ph#;?*7p?*7ys)3@OK`J?YPX) zJ(O=7ye>RbckI#V;`r1v~jxdG+}Z?mT7ut851Oz3Cb7Ml~E;Tc0V#a{f@c`AXLl{(<})M1pn4C;#UQ z4y)Hw6ex`yzY$b=v(zNVj~D+$KJX{+wc)OW?3JJr@q+34!W}uv?_=#3rY%AtedYb4 z10DYNCtNVRhj3eeJ`56o`!@sCkL-VyHnzb1kDlo~wffX-5Tcs@PU_JOrlX^yMC0;< z5b;-#D$D`|OJKuD@1nVzQ~ddBN{*1)-RNH+03eRD!}PFZcXk+oVtA;D%u)Mb$;XxU zT86kGZ(wQeU)}-4Jt^{^O5=~&G!!U0ab)5?Rf3kZ0{xi^xeh1I4bKDncSZsPT84vWfRUIOZa5I_w@eSaaL zx42>aF2C&cKh;LLu-bXvJ|y>sd-r%JRW$Lq5KU+M# zM&Cv3OY?v-6yE%ioN^OrL(%g03c3pjg};kz45keDJWj|8QQBA>hXj=W)Y7o>cTM7* zp+y^w`L>ENc}P*qZ_Qy4{TIN8o5@s0f}HtVJ)~^yil$-RzwO9x!EeaOt`_QNs#fwG zhC<18%--^yS*T{f!-C20CAt{k8650irdImrL6%33KdB}ECD_!QIIyNpd>jh=W2EWQ z_g5m%vB1VpHMyw{XCw2@Tndt!J;}m<&|4fW@4|&ChXXZUjG>~N^JL}S5&1C(mWY-W zRkKP7MaeA&&#txd#t|UiuGolBV=P^gGx5@ZvxXhP@(i{?t?J>wJN>oHSN@DJrl=?` z-Tx(*F9z zb(-qvS-@tT+SW-iqM_N?AC>kW%Eu%lBmq%8yF0j_Oap2~vJ)D$7QJIjP`M@x7NJm* zpZ4!R(f64M+e)^n9UT3k3VxBILs93cBpyq>LC!_m-WAd4+7o}|2+Mg61usvEa?V!1Esg(2Zf)Ncx6GCrd~R%CV}#Xc=KKlsKcu=Sy*QouU&R5Q49U8wEr!6gsC-)`ATyu>*Q)Wkx({s^ICr*a$*7$NsA{M3-S-3Bcs%t+*xv z7M!?zHTepQg~rSg)y~)U&Zpz7nWbPc@YApd{)aUGqnP}y8A=QeE25!uX`eo z^_QyucKt+I_)xN%9M-^@-Z;OF1`KqAk^IGN7yYxh$fLPN`n5B$rPE!MuD)J#Eyh(? zKZ7XcnIlj79u4fA;7LUyM=pnKok_l3v2B&lkWzWB#ImL|54I<`@ZPkQ8L+ zs_-%6>*hLkdZ^l46urs7hvWNuM5k2Q=A@d1>3m5_X9MSB@}_Y#VLFtuviTSh1qF&; zbeo{?EWtJQ{$6Y-Zz`)N6{o_(u*kqP|iSWh?pqU2mdL z5Q&C0BZ7-N((Nmyg0NAviS)M0<1E34`wQjvWT={k&Z z-O)6SIH6Gdxc6%0&_AG#`2C#ugRs?LF}y~&v_*c?o|-fzfy#p5$Z23QX=l7g*I{C*}S?3fC6G+!}4IZfA720 ztXxRBrS{l1_%m~W$3RzpO?4ocryG=AxxE_V{Ej-D#l4X~>^(N4TfZJGs%G~>s-2qk z?N>f;&Tn4j-XaBUo15+@-x{EON-==0makl$$;zbhYFQH3cMQ!o-g57+ScB0s+{a=u zMxvg@0tZ!SOo7M)R%z!B952q16wJz|}yIJWaOzWQa-yTH%y z(Zb$422l%eYZQ^v`La30PU7z{3l<(thwiK99;#>*Ey5e*C`~Y()-x#`;(vv=lTA+P zm!^-l9|eIvlTAdnic5{KAKmdBxyoFo*N$qOxy>z}HQz2;R)08@Ft}> z(+U`f7QFlHp7_vG&1$^PoCC&eF0ULY`bSXc7B;a^SaslC^Vup6r){t{m)1{n-noyF zGa&>sg8L3+Wv}*x%+hP3rr3{WS34;a*%V+8@+kLDEqjvY74+@CgQ>SWaog0fu1K6e zTzI%rW4Omv0k;Z;Q@GA|V?XBYNJuR=*$8_%>D;L?g6MZSXM;LKOnl=#tOohMxYVn)dsb4`;UGtAZ}~6lDnmHwoom^X^(?fkKgG-C<7il1A96)~ZhxoM_-RpeIE^s3~lr)v)<*?f-{W?(f(IsA;phZD&onf~v&*OIHU z!MYz$mgzn;KFF%jg>723iK~}cc*!5G{aCPR-BN`a1d=;g^WxQi^fUFO{Sdg+lOQ>V zk*2xe)p{p~?alPs`GtZy30oKmlXTIZZe#`WYyIhd(5rffPnyXiJ-$ckXs!^)xF|m0 zj%ZHj`fy8Vls~`f*@_7(=j!IJRc-mvwFRIn`8|u*kk1vhoFtFY)D%|K!R0!os}H(b zjmsD&ACaMw;z>c;6$j%3>V9u(=52#0d8D;c;+m4!R(-=mxe}qE??tEtnYeK1%U|yg z)ua4OMraRa(uwQOQc9JJpy>r}5ntS7Mkj9wN{h0Flbk?nS7 z!!^TCF+#LSbtzKyIKV41S%)N65wlX()CZ2#>g-Ou+ev!9ry-{F4A$tjwxtFy5k+sH z$qQcVj#BY--XPYb(Q8j{C>vz%!Gm1J*c{KH?r|H&dqB^nEyL{7htv$o)64$KDt5Gb zPfqzcCMu@;NmDCa<~13^PCHg$*7mg455L26!j`~@3{b6Ci8-?!woQF&J5F_it+@3_ z=D=1WD|J}Km?4#D7D$5Ec+?miDtBwii(7Gy@!i><(O%cOlsgpR#4URjSho-llBK=V@I49NXhnWsH&6;cqcbNWJUX8&0qfdE zWeI?44v=_I4i;Am^CmiN_2mQ~5OyjMx>z5(OCd=bPA)%hCuY7U4~EZ@H(PmN^d3M& zWdq|2>`g=@c@zBT=}`77Z;)#9#}Uw8shknCCJkGAWLxVEnH{YcZ%Nd4oE!aoy5k}t z2z_1`6*w01&aNkdHucu@Aw8{&*xshM^>k1+1jjb-TxW0wLM3%6x%e8y1OufVhpFso zfCxYtpPH(<$XH8koo~N(<5vhu{9RNyX{Mgru3A6n-WuEpn#kggo^i8wRawC6Rv{b7 zG4P7<>2|e+6dDb>XucyP747-f^JQ47T65C=HWIq5a3yH^ z1V2Doz$;;3ZFwx2&UApbFq37EX#(f!Bh6w4wmT}^HbJG<=Y9%ynxqhZud&s`<^T!1 zxY6V1W1%=tR$KYZwu{2aHVGN)4co&nMusSq^+ee<(j+fW$VD2Hfg;*qzQK#7^Cv7* z_BW0^QNz>KR+{dKo0M)-9rD0y+8yA;H`%p>i?P+==s;2}@i7YK4Hj3W?7#Rnh zM$C%p-B}&<*yvMmIrx&B&}J>?6+voA?Ki259^?{^&GyJ3QWwKcIjsoK(M5ZaWt!P3 z_Zxk)KBjOl=lGY6U-#GzI~Xw60~4}Qejm242B(`0Rw*3kJbH=l-c=~VEy6gNtcR+) z0Ncfe)jZ>wD7|^;hz`y>+}zfbh2I_2X*j@=Xyp(*#j5LQ>o|GPQ2#;IsyzJ z)5dQ~hP95kfdC;;nxW9{n~?+)djFhb`;^R3W7UsYfX@jtFEK3T0qulg&hq_HoG0Dr zN%Ka$W2_|5#Hh^n{ggirS5pN!D|A@4bFQbc@PqB9(Y3>76R- z&LQSWdFr-rz(6W@IC+S>9UEJ?WPXJ0wui~ghM0sM>+%{O=1FnR29eg{P zPZgF=x?XXHi=!t--&0$`y4xLEZ%sV%eUp7RBxk9u{!)&LBFz#Z)R=pY$TI z_ggh8thUZI7^f9EPKMu-L>e>aX*@8e3_Gu+$wjXnKpU!ytbl12NaXPA(+dqDU3&{i zeTbTwJyg7#%9DndTh$XIv9^muMO$w#&JK&+!)29k$+ISAA2cU_HWts`^eYcD96sF1 zhp&l6=^7)(9xGOD*LQ0ri!sh}Xsm8d7agR&q+N38Nj9*aMW}O>kzKbz{p`iF@sl#| z{`8Z2mH9}ddd$A9Ip>*8aPfl0V&GN1k$H#@6T(oplhU8-WM<)5)Q6#wpK4XzvzZ-< z?qLp!id^>#t5+|-v?L89FZioSpS7ruy{wNPE#Pfw5zO+q0VUw6Pi8*Opjr|=UDQiJ zT4qe-U@O1P?i&~j;|dwR8z|rZxH9;*xCP!TeOCDk+kSdwDy_>(=H_KikBc7o7Na6q(Hr4IGUm|A4_fv;we+BM%5O57y% zJWerOB!7)i*=!sBJpY}xx&o_L4acLql8qsI18_@_z7QxX(zy9F*$z^klojeLZ+g;5 zeOk6$gs{ZSjbtkJ6nNOHN zgbt-Lrvo5TeM2IEGHv3W{>DrQyN;b|nr>8;%dKd__-z>4wZ)ErB6ts%k0)|z;<4eu z#)a7rGFJ+d<=b1+K)e<@@|tkjiSl|=?Y%1}*aZ7DmtFsG7f$X?J=2CGZq(8Yi#{fw zm=D?8_je8W-1BzV3BBeJgmXYopgzmXZPnGBenc2=DNry8ISr3oL)$2 zKd#&=7^GXj<8u7u{vr9;DEF3TFm5m5$4&W9FMKX9Z$FBYUsSc7vN`#U79mJNnM|Pke)wP);R#OV_A$%+JD{^AY-ni-Mk+24U)TN!{;p&Y;i=k)PP=DsH}k$NgC+eA+g~o-DfHxV>cVR<=TzIL zN)TuPoxi+Qva}diaWQo7j?3EDi<7od94F@Le627WPM!CW`NzuAmKn}ZCctRI#t`;- z@KBmfxW4f;u0=S2f#UWk;{GwQ5(#XJ#}*suWDhMa*CW=FA*W)c3-f_{wxU@Z z_v-z_S7spQqnA|oy_R;L&0f)&%jL=k+C%BIxqxL={;ETi&FeOoA2*1dj+$I}6fbBr zZq35@Sif&CQnJTWprw@6Qo*7_G(k#X58S z5+%NjqgR?)X?3tntc(S~Qsa$vlPv>4J|ZDihx6)un6Zs_SC@NJACo)eO*S{pah1(z zh;!9NE*j?M%jubtS=zrd=;N5m!t3_jet}Yd?ema&Me8L|C^j7& zI@@?KG>P!nTw&2&>J-)EodZt&7AH5Zr~|tF)m4NboWzgyv+$MvaEZJi#7(8qwZV&@ zh-ppSF*RUJcBxLNUl7>m6BeYr*>=w-S5(Gr!TH|w@&Vu!cS1%yVH0?rkw}(ud+Eo( z7Z(7;_u~Tr$V!_DF9%>&g{=Zk-AvLFULsKX7MiFv&P?11mX zwSCu8E(eh}>{OSUm|Dl=Tn`SNciwV~&nJI=A4C@Y`TYvzj;wbj*B79PZ;5%!xMFA1 z&Y4SFHfp#E_I$ldyujFk-Hsfg!Cu7rX$oVdu!v53Ru~*?7K+b{aXtOLZ`tK$>W%3H{AsW7=mY~$ic0WpL2?l9YoH#y zPzn_J1tgIw>8PHh%Pl@tf3;$~PcdMZ@OH#4&GYVA5ays+_0qqB?Vs(lcj&|P07^4HW= zC0fF#z-MP6wlyQi!@CdCRC#I?ys)<8TFa57wIcdOXHMBypjMwyCESNb$a{uch>)bS{JGoVI;FV!e6 zY@AiG^Jpu&7^N^unlTR!75juq=VgCGxvICf*s7Ekt$+JkP`b_D-$SA%tNHp*^IDD# z!!Xk(hK2+4M@L)=f2aDI4Yrp_NjQ$hYdqlKh)XPZR-E_FcM#NvuAr|in4w}_Lgs7? z$t(Q()-5Ey{%}%?9jw%WWLg~(VE>a1Y$_c`tM|+iD+)eM3wlo`kECvy5?!nsepUbjD0aCrOYcZwX&mx0*=4osHAWv@lgM8WrfZ$-`~ z_~&2w<%8|4e$enM>}^Q~Q?r^I()X<1d@CyQ_q7i;)9V^=R04fugb1Hs=WoXiHp{(w zAGz=c#gRabp^xa`UmKqiuegcDNHQ07ZS^!d0B!3sRr-yRF^(c$zjV zqAmK;MHN&_J%ne?bST)+ehg}|m#+SfsJCX5eX4 zZ?qY>F(nY%U9<&Dwf6Y9u@n6@U3K@WH5@a;4gFP>hoYgOsW@$jC07Rk3chiPiBV|N zI|4!m=O`yqI&h~%CJ@OuW@;eHNP zl!J0h>1Gt49d6-$V#oA_TZ-35)URTP;k67&W$C-xw$B+ATxaQE#`iTuM`P;#nh|xP z#HYTBU&Xee-uz!`LtYt$=nHNV|zDzdP*BH=o;#K^f+=UF8DSm>f7l8KaOjP1OW zVE?!Q(;+POOf063zdTXZvG$JF2~*5#JsC73+M<+k?S(GUS3UeZ zeV|cSpnM?<#uIiuf)t>>cT9SoVUMc1Gr!xn`F?L_wB@KSe^y;`sV#RWp%&SS!Pt0hVIhgOCdCT~Q>-?-!nT{qMFGIpOuyju)^Wirt70MBoj3x64EuSo z9nJk}d2K!~`I5eYA(~^Y$3sFN(ux>haZAfhT;MXn6S39h;}_R?76bEjHU&40mm>wJ7=v892yA zA#9e3TRZcAhhc^}rZdw8J(-bj`+KBv+TB$){Hr?YYo;tTK zAEX(#S+?+e=^vfrC0(^_0!(k$u#Wf(c|=ls`@q)FTihP5ksI^l0v zhU7+z#Bh+Rp#d>vB-#QRJQf0@z7|zEXk7_r6<(5{AAJ?k)d=Hn^I%Kaw!=DLQMB$2 zZ6@H`BqVlpHtb5X@< zUc;`97(`2DCa3ZUnriME-gb1b!WR)vx_bIs`zlz5P@2kP|A`g+?iGEumpzV;O=c$k zSJqiA?G8S*#p!oQ%i+QNljf+levnbM_5m@6i?6Q&tJ>ha|Ht~jfgw12$;Y!_3z5lr zkBUlDM~8FEmt|H|KnOP36emZu$*jflp|rdSB$hJDhZqAOJIYKd^u+B^z+F`Jp8m<1 z5nr`k%vCbY_?DAqlTo>*z=i=SrJo5?Oj`q2_lgh^0(%oZs_^ zY6SA0cA*>Ft7KyLE5Z0T?o_;lKiooWpSvf(X0Ki)YwZ^WcLG9>?17X+`+aW-0^D`H zW6n)e_ScoHzn?dl>zYm=Z5~?CyFg=kmbSIX0GCMzzCSK3`F6SO>n_}mVOeL?F?gZL zj4-qd&h9W9hN^Lw<4LCm9(KZ`O|-mR+V4=NamG6-)bz+hI2(1pD@7YY8vIdg*NT{S>H8!&rq_xif#N9o?RKx zUpV|qRSXlj=8Y)+UfA2;Q@fm{GOm^-TKJ;1^1vRmF#CqAcyvnGGh|Pd1@wShgdEu#PcK9x?d)9f&H>Rl*0Gg@(@owsD6b9TR<`rE%W+n=G~vRt3p zc{+rj9@hkTNN|+j_x|N=#N`=?=ySH=fAEe4c#V6ZiGrFD7jA9^u0d;<%B#=P3&_Li z=A-SOV_VE3YZ{*({w2XTXJk{_BqPs7Wo}Kl%-g){pf459NICiu{a~c0*NfI^oNT3d}d)%4UA=}>` zSfphO^?1zw!GwNIe3S= z?*6qd6*E$`LJLC#ooqq{E{Rjr_ZAR(@$wZcSYCgwjsc$tH87&t;vH(bQ?oXx{%Pa6 z=q<<~T%X2?;dD>A=d%#q@yQcHF!mORZxzwnT|TzSsC4iZ9V;T=eQ|TMTZVE$rqD}r zXz7Gp6V;fjF@GrFGJe(Xhd5MC`>W-IAl>nKdbIwAayulc0`!6^0W`*=0J*2|blhd# zn4Z}shYL8s{||8?Q|o)YD|?>m3#UAq(2w9!YC1nl7 zuNb+XC9he6%|o$)EdF^iDT;&jE2c?MIjS{s%`Q{9fV*LW787&9g}Kd2zaNnY=ma}V zQf$zQ9=&FEsQQ12Ric(cZyX1m`b4IWC&<5ENW7>4saV%%!rv4&ecZujG_JMTSv)Kw^J^rh$1Sr@klwp(0w^rkxLnhwm>ze-oh;u9T}cz6K(LtF~xS-wWo5NWhK zuieK}&r1f5{oYA1%Z0y{lqFhm4N5|;P+|NHMIDncHPQse4Dhfu*(2wl$r{tPBbxM0uuXC75xCE9%wErl{cA7 z!a=p^>IXaOzfN;n3g4R8IU2ZMkmvWUt@C#bAy}#?h3f$NI%FWNGlEB?Z1_VCwC0Hc2s@~0xVU+_-{CE$;K z9@ep67-IZQhQ?$+(4LmpGKtNX8V{>go@58jcp@vs0%*yEJX4-u;*b6Y`n!kXgI}JG z74HtExAUO=_B~>-Qk|x;W{SneP8q`zgcBjAbjW3`wH{1cEky?rXhK#c<-ko0qn;p( zMyg!ipbD<}>I2S^%Fl4M3cWmL=DwrDxr?@6E4d4qbvA>4mk@m8A;TI9J>&6^d@B;^ zb}ryVCw>lq4%@Y{E4Dr7oh#Fyafc4RSPlp@I)EpkGL$|ogJXwD_0n7p)SG7!Qafx* z)oH+EM;1%-t2ie~{`CVd)ePfDsWuJaMs=8)0FotWQefXQNc~sc7)x{JD0t~Mqds$l z0e#@-sdXGZ9&=HhTchodt_zOuZ%;TXMSRax)gn7%?ih1K*3_Y{0b5bGGE6wYayM2x zySe-C?5rvbHH2P{htbXKmaEiCY0XS*y%8$<+JAbEnu5>xJXBCEl_G-gNaJ@Y0DEVt zh(B--HAW2Z3L1rFnIJ-`vu&*1-CsnVMM+a;D}_(b)t*TooRlH|khdk9%sOw#{S


I+M7TnYg*;R1m)mRSLg-afM&- zR!jsCSNb*PUXGej(G=_KUKy(}@jtYfv|6|j!WgW6k=)gJ_(UAI{-v{LZRS9yF~JUg z<>VH=UaRe}@~$|)+gSZ?T6%9Fj0mLQxW(z7Hz70MZ$A^p z?7upb`8>IXye+ddJ0_l95U`naWn^6c+fZvI>0}BDvPX4cimN;DnybsG^B#>!mRCEH z2$ZzX*-tw|Vy`O!cm9C^fGwE*PBNWG=xVuAg^ZAh^YdrsbAiY~u_w)fwpA}dg$vTy zpB`fmWFFmbl>+}*BX!u$|7l@1ly-4A2!vjlv7~5%HkpNODks8+as>v`wp*<_Sp3rY z)``A()&Ck~8cs@Lzf6`m%0t&28779d=c%G)TZ1EOFdqtfq6dafz}XVG1Z`AzU{FQQeBmWLNNGr@bRZx2FH`uWgmRx3?+WUzbmmOy+7{mG0&!>XQY( zSVG(#V?@i016XYv%3g9MH}npoE`N0i*^3dpU-@EYeB(IFfM~**Rd%B+V7jY5v(=+K z`Iug~Uhx%nUDR{?>AhxMsn(ottL!8+0rRy>deW;=w=WIflPq?Q*J9?r4Y4?3n*g8M z2CD6#lBI~6=8AEl{PjATQ30e=tLdY?*>UWz(;_tFj7N4!09mow$cGt!cL|$4qb71n zT=NqE3aZomi(4QRi(2Nzk&!PoQ9)8*4jh*5@KG(p9C|8uTLPH05pSL;Goyv5bxHwv zP`F0~Lo~}H7E`wCs^Xc?WhH9;$T%lNUX3rSrloo)4ZI8!5Zad+_ANdZCoSC>{y=L| zn$=+Fb3u}<(CRG?@_B?^DMr9|i(MbU2ts4hiAp!CcDKUk&Z*=OVg3t|1zRSL$(G{rza>5Xh@jw1gWK5hPieJjs_@{UIaOWfp;JS?y~5>>ouEk{>eu(7zsmN`Mo)_5lv1frVBcmvuCmGi zZ7XUQw|5~kBi~Q~1ghpzngg)`d1R!>R@xgz=o5~r7eNRH8m(0Ms=4H5Ock>S;hTwG z7}c_4!_M8ke;tqia~5u zojiyu-7VS$<|um%+5&;8_%Dc`Ee~Nxe0GW)Z@X5~ZLsEY(N?Y_329bMhAmbLZ>O%< z4|wgZ6~7vu%v&7&&&H>tQP&n;X_P#~u!TDJwm$amPnI(%kFvSqN$aP*x#q)bcTen) zh)O10hF#BQM2ju-fI*c1W!`^9ecD9?O_ghlm)pvFaLO+?3o40lLG8ZJn1z^K;F;?R ziyB!`U(+jTOKs`F^<$C8yPnANbG-BMLMWfH_LbjlQUKYFd$G3}M}rvP){#;@M)jSd^_kX z0?yt!iBMp~-Br$|xstfG!C_n$SuOYhLjJ+bQMykLLq#a6P+R7s%ndw)oA30WAn zdaCttItMZqnot8rIK6N$+hg8JD2;5dtq(v!93K1_4x z3Upk|DXBLaLOl!4VGwEFfwF%vT+%gXXfSI0-wKR1v&7XvTEPQMI*jvfN>1E|aZ-%Z zKfGmk7oa<)F%hm_V*-x6Db?m`R(jv@PVWU0Tk8H^=ijpR&>L_WO!&I)KHG~+Oymy; v(a?zH)V#iTUDE_pl>evVh+X#kdWOrkiKUwOU6pygijSwMs;5$~WE1^A1DQmn literal 0 HcmV?d00001 diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/CMakeLists.txt new file mode 100644 index 0000000000000..c5dad6896dde4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/CMakeLists.txt @@ -0,0 +1,19 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + _test_main.cpp + rectrace.cpp + select_signals.cpp + stacktrace.cpp + suicide.cpp + test.cpp +) + +set(HEADERS + test.hpp +) + +if(SOURCES OR HEADERS) + devkit_add_object(devkit_third_party_backward-cpp_test) +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/_test_main.cpp b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/_test_main.cpp new file mode 100644 index 0000000000000..68211e030fd29 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/_test_main.cpp @@ -0,0 +1,241 @@ +/* + * _test_main.cpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "test.hpp" +#include +#include + +#ifdef _WIN32 +#include +#define strcasecmp _stricmp +#else +#include +#include +#endif + +#if defined(__has_include) && __has_include() +#include +#else +#include + +#ifdef _WIN32 +char argv0[MAX_PATH]; +inline const char *getprogname() { + return GetModuleFileName(NULL, argv0, sizeof(argv0)) ? argv0 : NULL; +} +#elif !defined(__APPLE__) +// N.B. getprogname() is an Apple/BSD-ism. +// program_invocation_name is a GLIBC-ism, but it's also +// supported by libmusl. +#define getprogname() program_invocation_name +#endif + +void error(int status, int errnum, const char *format, ...) { + fflush(stdout); + fprintf(stderr, "%s: ", getprogname()); + + va_list args; + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + + if (errnum != 0) { + fprintf(stderr, ": %s\n", strerror(errnum)); + } else { + fprintf(stderr, "\n"); + } + if (status != 0) { + exit(status); + } +} +#endif + +using namespace test; + +bool run_test(TestBase &test, bool use_child_process = true) { + if (!use_child_process) { + exit(static_cast(test.run())); + } + + printf("-- running test case: %s\n", test.name); + + fflush(stdout); + + test::TestStatus status = test::SUCCESS; + +#ifdef _WIN32 + char filename[256]; + GetModuleFileName(NULL, filename, 256); // TODO: check for error + std::string cmd_line = filename; + cmd_line += " --nofork "; + cmd_line += test.name; + + STARTUPINFO si; + PROCESS_INFORMATION pi; + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + if (!CreateProcessA(nullptr, const_cast(cmd_line.c_str()), nullptr, + nullptr, FALSE, 0, nullptr, nullptr, &si, &pi)) { + printf("unable to create process\n"); + exit(-1); + } + + WaitForSingleObject(pi.hProcess, INFINITE); + + DWORD exit_code; + GetExitCodeProcess(pi.hProcess, &exit_code); + switch (exit_code) { + case 3: + status = test::SIGNAL_ABORT; + break; + case 5: + status = test::EXCEPTION_UNCAUGHT; + break; + case EXCEPTION_ACCESS_VIOLATION: + status = test::SIGNAL_SEGFAULT; + break; + case EXCEPTION_STACK_OVERFLOW: + status = test::SIGNAL_SEGFAULT; + break; + case EXCEPTION_INT_DIVIDE_BY_ZERO: + status = test::SIGNAL_DIVZERO; + break; + } + printf("Exit code: %lu\n", exit_code); + + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + + if (test.expected_status == test::ASSERT_FAIL) { + // assert calls abort on windows + return (status & test::SIGNAL_ABORT); + } + +#else + + pid_t child_pid = fork(); + if (child_pid == 0) { + exit(static_cast(test.run())); + } + if (child_pid == -1) { + error(EXIT_FAILURE, 0, "unable to fork"); + } + + int child_status = 0; + waitpid(child_pid, &child_status, 0); + + if (WIFEXITED(child_status)) { + int exit_status = WEXITSTATUS(child_status); + if (exit_status & ~test::STATUS_MASK) { + status = test::FAILED; + } else { + status = static_cast(exit_status); + } + } else if (WIFSIGNALED(child_status)) { + const int signum = WTERMSIG(child_status); + printf("!! signal (%d) %s\n", signum, strsignal(signum)); + switch (signum) { + case SIGABRT: + status = test::SIGNAL_ABORT; + break; + case SIGSEGV: + case SIGBUS: + status = test::SIGNAL_SEGFAULT; + break; + case SIGFPE: + status = test::SIGNAL_DIVZERO; + break; + default: + status = test::SIGNAL_UNCAUGHT; + } + } + +#endif + + if (test.expected_status == test::FAILED) { + return (status & test::FAILED); + } + + if (test.expected_status == test::SIGNAL_UNCAUGHT) { + return (status & test::SIGNAL_UNCAUGHT); + } + + return status == test.expected_status; +} + +int main(int argc, const char *const argv[]) { + +#ifdef _WIN32 + _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT); +#endif + + if (argc == 3 && strcmp("--nofork", argv[1]) == 0) { + // Windows has no fork, so we simulate it + // we only execute one test, without forking + for (test_registry_t::iterator it = test_registry().begin(); + it != test_registry().end(); ++it) { + TestBase &test = **it; + if (strcasecmp(argv[2], test.name) == 0) { + run_test(test, false); + + return 0; + } + } + return -1; + } + + size_t success_cnt = 0; + size_t total_cnt = 0; + for (test_registry_t::iterator it = test_registry().begin(); + it != test_registry().end(); ++it) { + TestBase &test = **it; + + bool consider_test = (argc <= 1); + for (int i = 1; i < argc; ++i) { + if (strcasecmp(argv[i], test.name) == 0) { + consider_test = true; + break; + } + } + if (!consider_test) { + continue; + } + + total_cnt += 1; + if (run_test(test)) { + printf("-- test case success: %s\n", test.name); + success_cnt += 1; + } else { + printf("** test case FAILED : %s\n", test.name); + } + } + printf("-- tests passing: %zu/%zu", success_cnt, total_cnt); + if (total_cnt) { + printf(" (%zu%%)\n", success_cnt * 100 / total_cnt); + } else { + printf("\n"); + } + return (success_cnt == total_cnt) ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/rectrace.cpp b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/rectrace.cpp new file mode 100644 index 0000000000000..10a38f475a029 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/rectrace.cpp @@ -0,0 +1,98 @@ +/* + * test/rectrace.cpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "backward.hpp" +#include "test/test.hpp" +#include + +using namespace backward; + +typedef StackTrace stacktrace_t; + +void end_of_our_journey(stacktrace_t &st) { + if (!st.size()) { + st.load_here(); + } +} + +int rec(stacktrace_t &st, int level) { + if (level <= 1) { + end_of_our_journey(st); + return 0; + } + return rec(st, level - 1); +} + +namespace toto { + +namespace titi { + +struct foo { + + union bar { + NOINLINE static int trampoline(stacktrace_t &st, int level) { + return rec(st, level); + } + }; +}; + +} // namespace titi + +} // namespace toto + +TEST(recursion) { + { // lexical scope. + stacktrace_t st; + const int input = 3; + int r = toto::titi::foo::bar::trampoline(st, input); + + std::cout << "rec(" << input << ") == " << r << std::endl; + + Printer printer; + // printer.address = true; + printer.object = true; + printer.print(st, stdout); + } +} + +int fib(StackTrace &st, int level) { + if (level == 2) { + return 1; + } + if (level <= 1) { + end_of_our_journey(st); + return 0; + } + return fib(st, level - 1) + fib(st, level - 2); +} + +TEST(fibrecursive) { + StackTrace st; + const int input = 6; + int r = fib(st, input); + + std::cout << "fib(" << input << ") == " << r << std::endl; + + Printer printer; + printer.print(st, stdout); +} diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/select_signals.cpp b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/select_signals.cpp new file mode 100644 index 0000000000000..57e6ebe0877c1 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/select_signals.cpp @@ -0,0 +1,51 @@ +/* + * test/segfault.cpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "backward.hpp" + +#include "test/test.hpp" +#include +#include + +using namespace backward; + +void badass_function() { + char *ptr = (char *)42; + *ptr = 42; +} + +TEST_SEGFAULT(pprint_sigsev) { + std::vector signals; + signals.push_back(SIGSEGV); + SignalHandling sh(signals); + std::cout << std::boolalpha << "sh.loaded() == " << sh.loaded() << std::endl; + badass_function(); +} + +TEST_SEGFAULT(wont_pprint) { + std::vector signals; + signals.push_back(SIGABRT); + SignalHandling sh(signals); + std::cout << std::boolalpha << "sh.loaded() == " << sh.loaded() << std::endl; + badass_function(); +} diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/stacktrace.cpp b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/stacktrace.cpp new file mode 100644 index 0000000000000..47084fe7da01f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/stacktrace.cpp @@ -0,0 +1,57 @@ +/* + * test/stacktrace.cpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "backward.hpp" +#include "test/test.hpp" +#include +#include + +using namespace backward; + +void collect_trace(StackTrace &st) { st.load_here(); } + +TEST(minitrace) { + Printer printer; + + StackTrace st; + collect_trace(st); + + printer.print(st, std::cout); +} + +void d(StackTrace &st) { st.load_here(); } + +void c(StackTrace &st) { return d(st); } + +void b(StackTrace &st) { return c(st); } + +NOINLINE void a(StackTrace &st) { return b(st); } + +TEST(smalltrace) { + Printer printer; + + StackTrace st; + a(st); + + printer.print(st, std::cout); +} diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/suicide.cpp b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/suicide.cpp new file mode 100644 index 0000000000000..e694c6fb46166 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/suicide.cpp @@ -0,0 +1,89 @@ +/* + * test/suicide.cpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "backward.hpp" + +#include "test/test.hpp" +#include + +#ifndef _WIN32 +#include +#endif + +using namespace backward; + +void badass_function() { + char *ptr = (char *)42; + *ptr = 42; +} + +TEST_SEGFAULT(invalid_write) { badass_function(); } + +int you_shall_not_pass() { + char *ptr = (char *)42; + int v = *ptr; + return v; +} + +TEST_SEGFAULT(invalid_read) { + int v = you_shall_not_pass(); + std::cout << "v=" << v << std::endl; +} + +void abort_abort_I_repeat_abort_abort() { + std::cout << "Jumping off the boat!" << std::endl; + abort(); +} + +TEST_ABORT(calling_abort) { abort_abort_I_repeat_abort_abort(); } + +// aarch64 and mips does not trap Division by zero +#if !defined(__aarch64__) && !defined(__mips__) +volatile int zero = 0; + +int divide_by_zero() { + std::cout << "And the wild black hole appears..." << std::endl; + int v = 42 / zero; + return v; +} + +TEST_DIVZERO(divide_by_zero) { + int v = divide_by_zero(); + std::cout << "v=" << v << std::endl; +} +#endif + +// Darwin does not allow RLIMIT_STACK to be reduced +#ifndef __APPLE__ +int bye_bye_stack(int i) { return bye_bye_stack(i + 1) + bye_bye_stack(i * 2); } + +TEST_SEGFAULT(stackoverflow) { +#ifndef _WIN32 + struct rlimit limit; + limit.rlim_max = 8096; + setrlimit(RLIMIT_STACK, &limit); +#endif + int r = bye_bye_stack(42); + std::cout << "r=" << r << std::endl; +} +#endif diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/test.cpp b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/test.cpp new file mode 100644 index 0000000000000..1a148f12cc2e2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/test.cpp @@ -0,0 +1,63 @@ +/* + * test/test.cpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "test/test.hpp" +#include +#include +#include + +TEST(empty_test) {} + +TEST_FAIL_ASSERT(fail_assert) { ASSERT(1 == 2); } + +TEST_FAIL_ASSERT(fail_assert_ge) { ASSERT_GE(4, 5); } + +TEST_UNCAUGHT_EXCEPTION(uncaught_exception) { + throw std::runtime_error("some random runtime error"); +} + +TEST_UNCAUGHT_EXCEPTION(uncaught_exception_int) { throw 42; } + +TEST_SEGFAULT(segfault) { + char *a = 0; + char b = a[42]; + std::cout << "result: " << b << std::endl; +} + +TEST_ABORT(abort) { abort(); } + +TEST(catch_int) { + ASSERT_THROW({ throw 42; }, int); +} + +TEST_FAIL_ASSERT(fail_catch_int) { ASSERT_THROW({}, int); } + +TEST_FAIL_ASSERT(fail_no_throw) { + ASSERT_NO_THROW({ throw 42; }); +} + +TEST(any_throw) { + ASSERT_ANY_THROW({ throw 42; }); +} + +TEST_FAIL_ASSERT(fail_any_throw) { ASSERT_ANY_THROW({}); } diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/test.hpp b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/test.hpp new file mode 100644 index 0000000000000..dc77c627a16da --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test/test.hpp @@ -0,0 +1,183 @@ +/* + * test/test.hpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#pragma once +#ifndef H_54E531F7_9154_454B_BEB9_257408429470 +#define H_54E531F7_9154_454B_BEB9_257408429470 + +#include +#include +#include +#include +#include +#include + +namespace test { + +struct AssertFailedError : std::exception { + ~AssertFailedError() throw() {} + + AssertFailedError(const char *filename, int _line, const char *_errmsg) + : basename(_basename(filename)), line(_line), errmsg(_errmsg) {} + + const char *what() const throw() { + if (!_what.size()) { + std::ostringstream ss; + ss << "assertion failed (" << basename << ":" << line; + ss << ") " << errmsg; + _what = ss.str(); + } + return _what.c_str(); + } + + const char *basename; + int line; + const char *errmsg; + + mutable std::string _what; + + static const char *_basename(const char *filename) { + const char *basename = filename + strlen(filename); + while (basename != filename && *basename != '/') { + basename -= 1; + } + return basename + 1; + } +}; + +enum TestStatus { + SUCCESS = 0 << 0, + FAILED = 1 << 0, + + ASSERT_FAIL = FAILED | 1 << 1, + EXCEPTION_UNCAUGHT = FAILED | 2 << 1, + SIGNAL_UNCAUGHT = FAILED | 3 << 1, + SIGNAL_SEGFAULT = SIGNAL_UNCAUGHT | 1 << 3, + SIGNAL_ABORT = SIGNAL_UNCAUGHT | 2 << 3, + SIGNAL_DIVZERO = SIGNAL_UNCAUGHT | 2 << 3, + + STATUS_MASK = 0x1F +}; + +struct TestBase { + const char *name; + TestStatus expected_status; + + virtual ~TestBase() {} + TestBase(const char *, TestStatus); + virtual void do_test() = 0; + + TestStatus run() { + try { + do_test(); + return SUCCESS; + } catch (const AssertFailedError &e) { + printf("!! %s\n", e.what()); + return ASSERT_FAIL; + } catch (const std::exception &e) { + printf("!! exception: %s\n", e.what()); + return EXCEPTION_UNCAUGHT; + } catch (...) { + printf("!! unknown exception\n"); + return EXCEPTION_UNCAUGHT; + } + } +}; + +typedef std::vector test_registry_t; +inline test_registry_t &test_registry() { + static test_registry_t reg; + return reg; +} + +inline TestBase::TestBase(const char *n, TestStatus s) + : name(n), expected_status(s) { + test_registry().push_back(this); +} + +} // namespace test + +#define _TEST_STATUS(name, status) \ + struct TEST_##name : ::test::TestBase { \ + TEST_##name() : TestBase(#name, status) {} \ + void do_test(); \ + } TEST_##name; \ + void TEST_##name::do_test() + +#define TEST(name) _TEST_STATUS(name, ::test::SUCCESS) +#define TEST_FAIL(name) _TEST_STATUS(name, ::test::FAILED) +#define TEST_FAIL_ASSERT(name) _TEST_STATUS(name, ::test::ASSERT_FAIL) +#define TEST_UNCAUGHT_EXCEPTION(name) \ + _TEST_STATUS(name, ::test::EXCEPTION_UNCAUGHT) +#define TEST_UNCAUGHT_SIGNAL(name) _TEST_STATUS(name, ::test::SIGNAL_UNCAUGHT) +#define TEST_SEGFAULT(name) _TEST_STATUS(name, ::test::SIGNAL_SEGFAULT) +#define TEST_ABORT(name) _TEST_STATUS(name, ::test::SIGNAL_ABORT) +#define TEST_DIVZERO(name) _TEST_STATUS(name, ::test::SIGNAL_DIVZERO) + +#define ASSERT(expr) \ + (expr) ? static_cast(0) \ + : throw ::test::AssertFailedError(__FILE__, __LINE__, #expr) + +#define _ASSERT_BINOP(a, b, cmp) \ + (!(a cmp b)) ? static_cast(0) \ + : throw ::test::AssertFailedError( \ + __FILE__, __LINE__, "because " #a " " #cmp " " #b) + +#define ASSERT_EQ(a, b) _ASSERT_BINOP(a, b, !=) +#define ASSERT_NE(a, b) _ASSERT_BINOP(a, b, ==) +#define ASSERT_LT(a, b) _ASSERT_BINOP(a, b, >=) +#define ASSERT_LE(a, b) _ASSERT_BINOP(a, b, >) +#define ASSERT_GT(a, b) _ASSERT_BINOP(a, b, <=) +#define ASSERT_GE(a, b) _ASSERT_BINOP(a, b, <) + +#define ASSERT_THROW(expr, e_type) \ + do { \ + try { \ + expr \ + } catch (const e_type &) { \ + break; \ + } \ + throw ::test::AssertFailedError(__FILE__, __LINE__, \ + "expected exception " #e_type); \ + } while (0) + +#define ASSERT_ANY_THROW(expr) \ + do { \ + try { \ + expr \ + } catch (...) { \ + break; \ + } \ + throw ::test::AssertFailedError(__FILE__, __LINE__, \ + "expected any exception"); \ + } while (0) + +#define ASSERT_NO_THROW(expr) \ + try { \ + expr \ + } catch (...) { \ + throw ::test::AssertFailedError(__FILE__, __LINE__, \ + "no exception expected"); \ + } + +#endif /* H_GUARD */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test_package/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test_package/CMakeLists.txt new file mode 100644 index 0000000000000..56de8b2232c59 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test_package/CMakeLists.txt @@ -0,0 +1,13 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + main.cpp +) + +set(HEADERS +) + +if(SOURCES OR HEADERS) + devkit_add_object(devkit_third_party_backward-cpp_test_package) +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test_package/conanfile.py b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test_package/conanfile.py new file mode 100644 index 0000000000000..e509dd5a00c49 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test_package/conanfile.py @@ -0,0 +1,14 @@ +from conans import ConanFile, CMake +import os + +class TestBackward(ConanFile): + settings = 'os', 'compiler', 'build_type', 'arch' + generators = 'cmake' + + def build(self): + cmake = CMake(self) + cmake.configure(defs={'CMAKE_VERBOSE_MAKEFILE': 'ON'}) + cmake.build() + + def test(self): + self.run(os.path.join('.', 'bin', 'example')) diff --git a/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test_package/main.cpp b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test_package/main.cpp new file mode 100644 index 0000000000000..98ca96a43f287 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon/third_party/backward-cpp/test_package/main.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include + +using namespace backward; + +class TracedException : public std::runtime_error { +public: + TracedException() : std::runtime_error(_get_trace()) {} + +private: + std::string _get_trace() { + std::ostringstream ss; + + StackTrace stackTrace; + TraceResolver resolver; + stackTrace.load_here(); + resolver.load_stacktrace(stackTrace); + + for (std::size_t i = 0; i < stackTrace.size(); ++i) { + const ResolvedTrace trace = resolver.resolve(stackTrace[i]); + + ss << "#" << i << " at " << trace.object_function << "\n"; + } + + return ss.str(); + } +}; + +void f(int i) { + if (i >= 42) { + throw TracedException(); + } else { + std::cout << "i=" << i << "\n"; + f(i + 1); + } +} + +int main() { + try { + f(0); + } catch (const TracedException &ex) { + std::cout << ex.what(); + } +} diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon_language/CMakeLists.txt new file mode 100644 index 0000000000000..041d72c3c91a4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/CMakeLists.txt @@ -0,0 +1,48 @@ +cmake_minimum_required(VERSION 3.12) +project(kodi_addon_language) + +option(BUILDSWIG "Build swig modules." ON) +option(BUILDSWIGPYTHON3 "Build swig python 3 modules." ON) +option(BUILDSWIGPYTHON4 "Build swig python 4 modules." ON) +option(BUILDSWIGNODE "Build swig node modules." ON) +option(BUILDSWIGJAVA "Build Java API." ON) +option(BUILDSWIGLUA "Build Lua API." ON) + +if(NOT BUILDSWIG) + set(BUILDSWIGPYTHON3 OFF) + set(BUILDSWIGPYTHON4 OFF) + set(BUILDSWIGNODE OFF) + set(BUILDSWIGJAVA OFF) + set(BUILDSWIGLUA OFF) +endif() + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/../../cmake) + +include_directories(${PROJECT_SOURCE_DIR}/src + ${PROJECT_SOURCE_DIR}/../../include/kodi) + +if(BUILDSWIG) + cmake_policy(SET CMP0078 NEW) + cmake_policy(SET CMP0086 NEW) + find_package(SWIG REQUIRED) + include("${SWIG_USE_FILE}") + + if(SWIG_FOUND) + add_definitions(-DSWIG) + SET(CMAKE_SWIG_FLAGS -c++) + + set_source_files_properties(kodidevkit.i PROPERTIES SWIG_FLAGS "-I${CMAKE_BINARY_DIR}/swig") + if(BUILDSWIGPYTHON) + add_subdirectory(swig/python) + endif() + if(BUILDSWIGJAVA) + add_subdirectory(swig/java) + endif() + if(BUILDSWIGLUA) + add_subdirectory(swig/lua) + endif() + if(BUILDSWIGNODE) + add_subdirectory(swig/javascript) + endif() + endif() +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/FindNodejs.cmake b/xbmc/addons/kodi-dev-kit/src/addon_language/FindNodejs.cmake new file mode 100644 index 0000000000000..f1fa1ca900b85 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/FindNodejs.cmake @@ -0,0 +1,97 @@ + # Macro to add directory to NODEJS_INCLUDE_DIRS if it exists and is not /usr/include + macro(add_include_dir dir) + if (IS_DIRECTORY ${dir} AND NOT ${dir} STREQUAL "/usr/include") + set(NODEJS_INCLUDE_DIRS ${NODEJS_INCLUDE_DIRS} ${dir}) + endif() +endmacro() + + +find_program (NODEJS_EXECUTABLE NAMES node nodejs + HINTS + $ENV{NODE_DIR} + PATH_SUFFIXES bin + DOC "Node.js interpreter" +) + +include (FindPackageHandleStandardArgs) + +# If compat-libuv package exists, it must be at start of include path +find_path (UV_ROOT_DIR "uv.h" PATHS /usr/include/compat-libuv010 NO_DEFAULT_PATH) +if (UV_ROOT_DIR) + # set (NODEJS_INCLUDE_DIRS ${UV_ROOT_DIR}) + add_include_dir(${UV_ROOT_DIR}) +endif() + +# Now look for node. Flag an error if not found +find_path (NODE_ROOT_DIR "include/node/node.h" "include/src/node.h" "src/node.h" + PATHS /usr/include/nodejs /usr/local/include/nodejs /usr/local/include) +if (NODE_ROOT_DIR) + add_include_dir(${NODE_ROOT_DIR}/include/src) + add_include_dir(${NODE_ROOT_DIR}/src) + add_include_dir(${NODE_ROOT_DIR}/include/node) + add_include_dir(${NODE_ROOT_DIR}/include/deps/v8/include) + add_include_dir(${NODE_ROOT_DIR}/deps/v8/include) + add_include_dir(${NODE_ROOT_DIR}/include/deps/uv/include) + add_include_dir(${NODE_ROOT_DIR}/deps/uv/include) +else() + unset(NODEJS_INCLUDE_DIRS) + message(ERROR " - node.h not found") +endif() + +# Check that v8.h is in NODEJS_INCLUDE_DIRS +find_path (V8_ROOT_DIR "v8.h" PATHS ${NODEJS_INCLUDE_DIRS}) +if (NOT V8_ROOT_DIR) + unset(NODEJS_INCLUDE_DIRS) + message(ERROR " - v8.h not found") +endif() + +# Check that uv.h is in NODEJS_INCLUDE_DIRS +find_path (UV_ROOT_DIR "uv.h" PATHS ${NODEJS_INCLUDE_DIRS}) +if (NOT UV_ROOT_DIR) + unset(NODEJS_INCLUDE_DIRS) + message(ERROR " - uv.h not found") +endif() + +find_package_handle_standard_args (Nodejs DEFAULT_MSG + NODEJS_EXECUTABLE + NODEJS_INCLUDE_DIRS +) + +if (NODEJS_EXECUTABLE) + execute_process(COMMAND ${NODEJS_EXECUTABLE} --version + OUTPUT_VARIABLE _VERSION + RESULT_VARIABLE _NODE_VERSION_RESULT) + execute_process(COMMAND ${NODEJS_EXECUTABLE} -e "console.log(process.versions.v8)" + OUTPUT_VARIABLE _V8_VERSION + RESULT_VARIABLE _V8_RESULT) + if (NOT _NODE_VERSION_RESULT AND NOT _V8_RESULT) + string (REPLACE "v" "" NODE_VERSION_STRING "${_VERSION}") + string (REPLACE "." ";" _VERSION_LIST "${NODE_VERSION_STRING}") + list (GET _VERSION_LIST 0 NODE_VERSION_MAJOR) + list (GET _VERSION_LIST 1 NODE_VERSION_MINOR) + list (GET _VERSION_LIST 2 NODE_VERSION_PATCH) + set (V8_VERSION_STRING ${_V8_VERSION}) + string (REPLACE "." ";" _V8_VERSION_LIST "${_V8_VERSION}") + list (GET _V8_VERSION_LIST 0 V8_VERSION_MAJOR) + list (GET _V8_VERSION_LIST 1 V8_VERSION_MINOR) + list (GET _V8_VERSION_LIST 2 V8_VERSION_PATCH) + # we end up with a nasty newline so strip everything that isn't a number + string (REGEX MATCH "^[0-9]*" V8_VERSION_PATCH ${V8_VERSION_PATCH}) + else () + set (NODE_VERSION_STRING "0.10.30") + set (NODE_VERSION_MAJOR "0") + set (NODE_VERSION_MINOR "10") + set (NODE_VERSION_PATCH "30") + set (V8_VERSION_MAJOR "3") + set (V8_VERSION_MINOR"14") + set (V8_VERSION_PATCH "5") + set (V8_VERSION_STRING "3.28.72") + message ("defaulted to node 0.10.30") + endif () + string (REGEX REPLACE "\n" "" NODE_VERSION_STRING ${NODE_VERSION_STRING}) + string (REGEX REPLACE "\n" "" V8_VERSION_STRING ${V8_VERSION_STRING}) + message ("INFO - Node version is " ${NODE_VERSION_STRING}) + message ("INFO - Node using v8 " ${V8_VERSION_STRING}) + mark_as_advanced (NODEJS_EXECUTABLE) +endif () + diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/global.i b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/global.i new file mode 100644 index 0000000000000..d8c938df3096e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/global.i @@ -0,0 +1,13 @@ +%define ATTR_DLL_LOCAL +%enddef +%define __INTRODUCED_IN_KODI(api_level) +%enddef +%define __DEPRECATED_IN_KODI(api_level) +%enddef +%define __REMOVED_IN_KODI(api_level) +%enddef + +%ignore KODI_ADDON_INSTANCE_INFO; + +%include +%apply bool & INOUT { bool & bar }; diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/CMakeLists.txt new file mode 100644 index 0000000000000..ac5ed8ca403d0 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/CMakeLists.txt @@ -0,0 +1,128 @@ +find_package(Java) +find_package(JNI) + +if(NOT Java_FOUND) + message(WARNING "Java package not found, Java Support not possible to create!") + return() +elseif(NOT JNI_FOUND) + message(WARNING "JNI package not found, Java Support not possible to create!") + return() +else() + message(STATUS "Java support becomes included") +endif() + +include(UseJava) + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/manifest.txt.in + ${CMAKE_CURRENT_BINARY_DIR}/manifest.txt) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/pom.xml.in + ${CMAKE_CURRENT_BINARY_DIR}/kodidevkit-${VERSION_SHORT}.pom) + +if (PERIPHERALMAN) + # Override the JNI include directory for Android Things since these + # will require an Android-friendly jni.h + set(JAVA_INCLUDE_PATH "${ANDROID_SYSROOT}/usr/include") +endif() + +include_directories ( + ${JAVA_INCLUDE_PATH} + ${JAVA_INCLUDE_PATH2} + ${CMAKE_CURRENT_SOURCE_DIR}/.. +) + +# SWIG treats SWIG_FLAGS as a list and not a string so semicolon seperation is required +set_source_files_properties( + ${PROJECT_SOURCE_DIR}/swig/java/kodi_addon.i + PROPERTIES SWIG_FLAGS ";-package;kodi;-I${CMAKE_BINARY_DIR}/src" + CPLUSPLUS ON +) +set_source_files_properties( + ${PROJECT_SOURCE_DIR}/swig/java/kodi_addon.i + ${PROJECT_SOURCE_DIR}/swig/kodi_addon.i + ${PROJECT_SOURCE_DIR}/swig/global.i + PROPERTIES CPLUSPLUS ON +) +set_source_files_properties( + ${PROJECT_SOURCE_DIR}/swig/java/kodi_gui_dialogs_TextViewer.i + ${PROJECT_SOURCE_DIR}/swig/java/kodi_gui_dialogs_YesNo.i + PROPERTIES SWIG_FLAGS ";-package;kodi.gui.dialogs;-I${CMAKE_BINARY_DIR}/src" + CPLUSPLUS ON +) + +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive -DJAVACALLBACK") +set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DJAVACALLBACK") + +if (NOT DEFINED ENV{JAVA_HOME_NATIVE}) + if (NOT DEFINED ENV{JAVA_HOME}) +# message (WARNING "Neither JAVA_HOME nor JAVA_HOME_NATIVE are set, falling back to '/usr' path") + set(JAVA_HOME "/usr") + + set(JAVA_HOME_NATIVE $ENV{JAVA_HOME}) + set(JAVAC ${JAVA_HOME}/bin/javac) + set(JAR ${JAVA_HOME}/bin/jar) + else() + set(JAVA_HOME_NATIVE $ENV{JAVA_HOME}) + set(JAVAC $ENV{JAVA_HOME}/bin/javac) + set(JAR $ENV{JAVA_HOME}/bin/jar) + endif() +else () + set (JAVAC $ENV{JAVA_HOME_NATIVE}/bin/javac) + set (JAR $ENV{JAVA_HOME_NATIVE}/bin/jar) +endif () + +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}kodidevkit-java) +#else() + #set(OUTPUT_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}kodidevkit-java-${ARCH}) +#endif() + +swig_add_library( + kodidevkit-java-base + TYPE OBJECT + LANGUAGE java + NO_PROXY + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR} + SOURCES ${PROJECT_SOURCE_DIR}/swig/java/kodi_addon.i +) +set_property(TARGET kodidevkit-java-base PROPERTY POSITION_INDEPENDENT_CODE ON) +swig_add_library( + kodidevkit-java-gui-dialogs + TYPE OBJECT + LANGUAGE java + NO_PROXY + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/gui/dialogs + SOURCES ${PROJECT_SOURCE_DIR}/swig/java/kodi_gui_dialogs_TextViewer.i + ${PROJECT_SOURCE_DIR}/swig/java/kodi_gui_dialogs_YesNo.i +) +set_property(TARGET kodidevkit-java-gui-dialogs PROPERTY POSITION_INDEPENDENT_CODE ON) + +add_library(kodidevkit-java SHARED $ + $) + +#swig_link_libraries(kodidevkit-java kodidevkit dl ${JAVA_LIBRARIES}) +set_target_properties(kodidevkit-java PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${DEVKIT_OUTPUT_DIRECTORY}/java + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${DEVKIT_OUTPUT_DIRECTORY}/java + OUTPUT_NAME ${OUTPUT_NAME} PREFIX "") + + +add_custom_command(TARGET kodidevkit-java + POST_BUILD + COMMAND cmake -E echo "Compiling java.." + COMMAND ${JAVAC} *.java gui/dialogs/*.java -d ${CMAKE_CURRENT_BINARY_DIR} + COMMAND cmake -E echo "Creating jar" + COMMAND ${JAR} cvmf manifest.txt kodidevkit.jar kodi/* + COMMAND cmake -E copy ${CMAKE_CURRENT_BINARY_DIR}/kodidevkit.jar ${CMAKE_BINARY_DIR}/${DEVKIT_OUTPUT_DIRECTORY}/java + COMMAND cmake -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/kodi ${CMAKE_BINARY_DIR}/${DEVKIT_OUTPUT_DIRECTORY}/java/kodi +) + +#kodidevkit_create_install_pkgconfig (kodijava.pc ${LIB_INSTALL_DIR}/pkgconfig) + +#install (TARGETS kodijava LIBRARY DESTINATION ${LIB_INSTALL_DIR}) +#install (FILES ${CMAKE_CURRENT_BINARY_DIR}/kodidevkit.jar DESTINATION ${LIB_INSTALL_DIR}/../lib/java) diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/kodi_addon.i b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/kodi_addon.i new file mode 100644 index 0000000000000..207e6b803c29a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/kodi_addon.i @@ -0,0 +1,115 @@ +%module (docstring="Java interface to libkodidevkit") kodi + +%feature("autodoc", "3"); + +%define __INTRODUCED_IN_KODI(api_level) +%enddef +%define __DEPRECATED_IN_KODI(api_level) +%enddef +%define __REMOVED_IN_KODI(api_level) +%enddef + +%include ../kodi_addon.i + +/* This tells SWIG to treat char ** as a special case when used as a parameter + in a function call */ +%typemap(in) char ** (jint size) { + int i = 0; + size = jenv->GetArrayLength($input); + $1 = (char **) malloc((size+1)*sizeof(char *)); + /* make a copy of each string */ + for (i = 0; iGetObjectArrayElement($input, i); + const char * c_string = jenv->GetStringUTFChars(j_string, 0); + $1[i] = static_cast(malloc((strlen(c_string)+1)*sizeof(char))); + strcpy($1[i], c_string); + jenv->ReleaseStringUTFChars(j_string, c_string); + jenv->DeleteLocalRef(j_string); + } + $1[i] = 0; +} + +/* This cleans up the memory we malloc'd before the function call */ +%typemap(freearg) char ** { + int i; + for (i=0; iFindClass("java/lang/String"); + + while ($1[len]) len++; + jresult = jenv->NewObjectArray(len, clazz, NULL); + /* exception checking omitted */ + + for (i=0; iNewStringUTF(*result++); + jenv->SetObjectArrayElement(jresult, i, temp_string); + jenv->DeleteLocalRef(temp_string); + } +} + +/* These 3 typemaps tell SWIG what JNI and Java types to use */ +%typemap(jni) char ** "jobjectArray" +%typemap(jtype) char ** "String[]" +%typemap(jstype) char ** "String[]" + +/* These 2 typemaps handle the conversion of the jtype to jstype typemap type + and vice versa */ +%typemap(javain) char ** "$javainput" +%typemap(javaout) char ** { + return $jnicall; + } + +%inline %{ + +bool Init(unsigned int api, char **argv) +{ + int argc = 0; + while (argv[argc]) + { + argc++; + } + + if (!kodi::dl::LoadDll(argc, argv)) + return false; + + KODI_IFC_HDL hdl = kodi::dl::api.kodi_init(api, argc, argv, nullptr, false, false); + if (!hdl) + return false; + + kodi::dl::hdl = hdl; + + return true; +} + +void Log(const ADDON_LOG loglevel, const char* fmt, ...) +{ + va_list arg; + va_start(arg, fmt); + char *errorStr; + if (vasprintf(&errorStr, fmt, arg) >= 0) + { + kodi::dl::api.kodi_log(loglevel, errorStr); + free(errorStr); + } + va_end(arg); +} + + +%} + + +%constant int KODI_API = __KODI_API__; + +%pragma(java) jniclasscode=%{ + static { + System.loadLibrary("kodidevkit-java"); + } +%} diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/kodi_gui_dialogs_TextViewer.i b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/kodi_gui_dialogs_TextViewer.i new file mode 100644 index 0000000000000..b453418cdfcd6 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/kodi_gui_dialogs_TextViewer.i @@ -0,0 +1,11 @@ +%include global.i + +%module TextViewer + +%import(module="kodi") "AddonBase.h" + +%{ +#include "gui/dialogs/TextViewer.h" +%} +%include "std_string.i" +%include "gui/dialogs/TextViewer.h" diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/kodi_gui_dialogs_YesNo.i b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/kodi_gui_dialogs_YesNo.i new file mode 100644 index 0000000000000..72872cc115f1a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/kodi_gui_dialogs_YesNo.i @@ -0,0 +1,14 @@ +%include global.i + +%module YesNo + +%include +%apply bool & INOUT { bool & bar }; + +%import "kodi_addon.i" + +%{ +#include "gui/dialogs/YesNo.h" +%} +%include "std_string.i" +%include "gui/dialogs/YesNo.h" diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/manifest.txt.in b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/manifest.txt.in new file mode 100644 index 0000000000000..e6717b11084f1 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/manifest.txt.in @@ -0,0 +1,7 @@ +Manifest-version: 1.0 + +Name: kodidevkit/ +Specification-Title: kodidevkit +Specification-Version: @VERSION_SHORT@ +Package-Title: kodidevkit +Package-Version: @VERSION_SHORT@ diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/pom.xml.in b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/pom.xml.in new file mode 100644 index 0000000000000..7ec311f814503 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/java/pom.xml.in @@ -0,0 +1,38 @@ + + + 4.0.0 + + tv.kodi.javaaddon + kodidevkit + @VERSION_SHORT@ + jar + + kodidevkit + Library who bring interface between a addon and Kodi + + + + + GPL2 + + + + + + + + + Kodi - Open Source Home Theater Software + https://kodi.tv + + + + + + + + + + diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/CMakeLists.txt new file mode 100644 index 0000000000000..d4b582f90ae55 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/CMakeLists.txt @@ -0,0 +1,132 @@ +find_package(Nodejs) + +if(NOT Nodejs_FOUND) + message(WARNING "JavaScript support not possible to create!") + return() +else() + message(STATUS "JavaScript support becomes included") +endif() + +include_directories ( + ${NODEJS_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR}/.. +) + +# SWIG treats SWIG_FLAGS as a list and not a string so semicolon seperation is +# required. This hardcodes V8_VERSION to be <10 but I assume that's not going +# to be a problem for a little while! SWIG uses a padded SWIG_V8 version which +# we hack together from our findnode module. +set (V8_VERSION_HEX 0x0${V8_VERSION_MAJOR}${V8_VERSION_MINOR}${V8_VERSION_PATCH}) +string (LENGTH "${V8_VERSION_HEX}" V8_VERSION_HEX_length) +while (V8_VERSION_HEX_length LESS 8) + set (V8_VERSION_HEX "${V8_VERSION_HEX}0") + message (STATUS "INFO - Padded V8 version to match SWIG format") + string (LENGTH "${V8_VERSION_HEX}" V8_VERSION_HEX_length) +endwhile () + +set_property (SOURCE kodidevkitjs.i PROPERTY SWIG_FLAGS "-node" + "-I${CMAKE_BINARY_DIR}/src" "-DV8_VERSION=${V8_VERSION_HEX}") +set_source_files_properties (kodidevkitjs.i PROPERTIES CPLUSPLUS ON) + +if (CMAKE_VERSION VERSION_LESS "3.8") + swig_add_module (kodidevkitjs javascript kodidevkitjs.i) +else () + swig_add_library (kodidevkitjs LANGUAGE javascript SOURCES kodidevkitjs.i) +endif () +swig_link_libraries (kodidevkitjs kodidevkit) + +set_target_properties (kodidevkitjs PROPERTIES + COMPILE_FLAGS " -DBUILDING_NODE_EXTENSION -DSWIGJAVASCRIPT=${SWIG_FOUND}" + PREFIX "" + OUTPUT_NAME kodidevkit + SUFFIX ".node" +) + +message (STATUS "INFO - swig Version ${SWIG_VERSION}") +message (STATUS "INFO - CXX compiler Version ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}") + +if (${V8_VERSION_MAJOR} GREATER 3) + message (STATUS "INFO - Using V8 version > 3 so requiring C++11 compiler") + # Node 0.12.x V8 engine major version is '3'. + # Node 2.1.0 V8 engine major version is '4'. + set_property (TARGET kodidevkitjs PROPERTY CXX_STANDARD 11) + set_property (TARGET kodidevkitjs PROPERTY CXX_STANDARD_REQUIRED ON) + if (CMAKE_VERSION VERSION_LESS "3.1") + message (WARNING "Need to use CMAKE version 3.1+, but it is ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}, using a workaround.") + if (CMAKE_COMPILER_IS_GNUCXX) + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7") + message (FATAL_ERROR "GNU gcc compiler is also too old (need 4.7+, but ${CMAKE_CXX_COMPILER_VERSION}) and does not support C++11 standard.") + endif () + set (KODIDEVKIT_CXX11_WORKAROUND_OPTION "-std=gnu++11") + else () + set (KODIDEVKIT_CXX11_WORKAROUND_OPTION "-std=c++11") + endif () + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${KODIDEVKIT_CXX11_WORKAROUND_OPTION} ") + endif () +endif () + +# If a CMAKE_INSTALL_PREFIX has NOT been provided, set NODE_MODULE_INSTALL_PATH +# base on the NODE_ROOT_DIR. +if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set (NODE_MODULE_INSTALL_PATH ${NODE_ROOT_DIR}/lib/node_modules/kodidevkit/) +# If a CMAKE_INSTALL_PREFIX has been provided, set NODE_MODULE_INSTALL_PATH +# relative to the provide install directory. +else (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set (NODE_MODULE_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/lib/node_modules/kodidevkit/) +endif (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) +message (STATUS "INFO - install NODE modules to ${NODE_MODULE_INSTALL_PATH}") + +macro (kodidevkit_CREATE_INSTALL_PACKAGE_JSON generated_file install_location) + configure_file (${generated_file}.cmake ${CMAKE_CURRENT_BINARY_DIR}/${generated_file} @ONLY) + install (FILES ${CMAKE_CURRENT_BINARY_DIR}/${generated_file} DESTINATION ${install_location}) +endmacro (kodidevkit_CREATE_INSTALL_PACKAGE_JSON) +kodidevkit_create_install_package_json (package.json ${NODE_MODULE_INSTALL_PATH}) + +macro (kodidevkit_CREATE_BINDING_GYP generated_file) + set (kodidevkit_LIB_SRCS_GYP "") + set (kodidevkit_NPM_SRCS ${kodidevkit_LIB_SRCS_NOAUTO}) + foreach (srcfile ${kodidevkit_NPM_SRCS}) + file (RELATIVE_PATH rel ${CMAKE_SOURCE_DIR} ${srcfile}) + set (kodidevkit_LIB_SRCS_GYP "'${rel}',\n${kodidevkit_LIB_SRCS_GYP}") + endforeach (srcfile) + foreach (includedir ${kodidevkit_LIB_INCLUDE_DIRS}) + file (RELATIVE_PATH rel ${CMAKE_SOURCE_DIR} ${includedir}) + set (kodidevkit_LIB_INCLUDE_DIRS_GYP "'${rel}',\n${kodidevkit_LIB_INCLUDE_DIRS_GYP}") + endforeach (includedir) + configure_file (${generated_file}.cmake ${CMAKE_CURRENT_BINARY_DIR}/${generated_file} @ONLY) +endmacro (kodidevkit_CREATE_BINDING_GYP) +kodidevkit_create_binding_gyp (binding.gyp) + +add_custom_target (npmpkg) +add_custom_command (TARGET npmpkg POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_BINARY_DIR}/kodidevkitjsJAVASCRIPT_wrap.cxx ${CMAKE_SOURCE_DIR}/src + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_BINARY_DIR}/src/version.c ${CMAKE_SOURCE_DIR}/src + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_BINARY_DIR}/package.json ${CMAKE_SOURCE_DIR} + COMMAND sed -i "'s/kodidevkit.node/build\\/Release\\/kodidevkit.node/'" + ${CMAKE_SOURCE_DIR}/package.json + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_BINARY_DIR}/binding.gyp ${CMAKE_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_SOURCE_DIR}/docs/npm.md ${CMAKE_SOURCE_DIR}/READMEFIRST) +add_dependencies (npmpkg kodidevkitjs) + +if (BUILDDOC) + find_package(Yuidoc) + if (YUIDOC_FOUND) + add_custom_target(jsdoc ALL + COMMAND ${CMAKE_SOURCE_DIR}/doxygen2jsdoc/docgen.js -m kodidevkit -i xml/ -o jsdoc -c ${CMAKE_CURRENT_SOURCE_DIR}/doxygen2jsdoc_custom.json --strict + COMMAND ${YUIDOC_EXECUTABLE} -C --no-sort --helpers ${CMAKE_SOURCE_DIR}/doxygen2jsdoc/generators/yuidoc/tmpl/kodidevkit/helper.js --themedir ${CMAKE_SOURCE_DIR}/doxygen2jsdoc/generators/yuidoc/tmpl/kodidevkit -o html/node jsdoc/yuidoc/kodidevkit + COMMAND ${CMAKE_SOURCE_DIR}/doxygen2jsdoc/tolower.js -i html/node + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + DEPENDS doc + COMMENT "Generating API documentation with Yuidoc" VERBATIM + ) + else () + message (STATUS "INFO - Failed to find Yuidoc. node.js API doc will not be generated") + endif () +endif () + +install (TARGETS ${SWIG_MODULE_kodidevkitjs_REAL_NAME} + DESTINATION ${NODE_MODULE_INSTALL_PATH}) diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/binding.gyp.cmake b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/binding.gyp.cmake new file mode 100644 index 0000000000000..60d25e65049ab --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/binding.gyp.cmake @@ -0,0 +1,42 @@ +{ + 'targets': [ + { + 'target_name': 'kodidevkit', + 'sources': [ + @kodidevkit_LIB_SRCS_GYP@ + 'src/version.c', + 'src/kodidevkitjsJAVASCRIPT_wrap.cxx' + ], + 'include_dirs': [ + @kodidevkit_LIB_INCLUDE_DIRS_GYP@ + ], + 'variables': { + "v8_version%": " /dev/null || echo node` -e 'console.log(process.versions.v8)' | sed 's/\.//g' | cut -c 1-5)", + "arch%": " /dev/null || echo node` -e 'console.log(process.arch)')" + }, + 'cflags_cc!': [ '-fno-rtti', '-fno-exceptions' ], + 'cflags!': [ '-fno-exceptions' ], + 'conditions' : [ + ['OS=="android"', { + 'sources' : [ 'src/glob/glob.c' ], + 'include_dirs' : [ 'src/glob' ], + }], + [ 'arch=="x64" or arch=="ia32"', { + 'defines' : [ 'X86PLAT=ON' ], + }], + [ 'arch=="arm"', { + 'defines' : [ 'ARMPLAT=ON'], + }], + ], + 'defines' : [ + 'SWIG', + 'SWIGJAVASCRIPT', + 'FIRMATA=ON', + 'ONEWIRE=ON', + 'BUILDING_NODE_EXTENSION=1', + 'SWIG_V8_VERSION=0x0<(v8_version)', + 'V8_VERSION=0x0<(v8_version)' + ] + } + ] +} diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/doxygen2jsdoc_custom.json b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/doxygen2jsdoc_custom.json new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/kodidevkitjs.i b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/kodidevkitjs.i new file mode 100644 index 0000000000000..62fe00e88c288 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/kodidevkitjs.i @@ -0,0 +1,5 @@ +%module (docstring="Javascript interface to libkodidevkit") kodidevkit + +%feature("autodoc", "3"); + +%include ../kodidevkit.i diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/package.json.cmake b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/package.json.cmake new file mode 100644 index 0000000000000..e5e3469f53555 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/javascript/package.json.cmake @@ -0,0 +1,19 @@ +{ + "name" : "kodidevkit", + "description": "Library who bring interface between a addon and Kodi". + "keywords":["kodi", "kodidevkitjs"], + "homepage": "https://kodi.tv", + "main" : "./kodidevkit.node", + "engines": { + "node": ">= 0.10.x" + }, + "bugs": { + "url" : "" + }, + "license": "MIT", + "version": "@VERSION@", + "authors": "". + "scripts": { + "test": "node -p -e 'require(\".\").getVersion()'" + } +} diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/kodi_addon.i b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/kodi_addon.i new file mode 100644 index 0000000000000..e61cc70c6513b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/kodi_addon.i @@ -0,0 +1,31 @@ +%include global.i + +%module kodi + +%rename("%s") ADDON_STATUS; + +%{ +#include "c-api/version.h" +#include "c-api/addon_base.h" +#include "AddonBase.h" + +using namespace kodi; + +kodi_api_1 kodi::dl::api; +KODI_IFC_HDL kodi::dl::hdl = nullptr; +KODI_DLL_HDL kodi::dl::dll = nullptr; +kodi::addon::CAddonBase* kodi::addon::CAddonBase::addonBase = nullptr; +kodi::addon::IInstanceInfo kodi::addon::CAddonBase::firstInstance; +KODI_ADDON_HDL kodi::addon::CAddonBase::globalSingleInstance = nullptr; + +ADDON_STATUS kodi::addon::CAddonBase::ADDONBASE_create(const struct KODI_ADDON_INSTANCE_INFO* first_instance, KODI_ADDON_HDL* hdl) +{ + return ADDON_STATUS_NOT_IMPLEMENTED; +} + +%} + +%include "std_string.i" +%include "c-api/version.h" +%include "c-api/addon_base.h" +%include "AddonBase.h" diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/lua/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/lua/CMakeLists.txt new file mode 100644 index 0000000000000..28517f7525348 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/lua/CMakeLists.txt @@ -0,0 +1,20 @@ +find_package(Lua) + +if(NOT Lua_FOUND) + message(WARNING "Lua Support not possible to create!") + return() +else() + message(STATUS "Lus support becomes included") +endif() + +set_source_files_properties (kodidevkitlua.i PROPERTIES CPLUSPLUS ON) +set_source_files_properties (kodidevkitlua.i PROPERTIES SWIG_FLAGS "-I${CMAKE_BINARY_DIR}/src") + +swig_add_library (kodi-lua LANGUAGE lua SOURCES kodidevkitlua.i) +swig_link_libraries (kodi-lua ${LUA_LIBRARIES} kodidevkit) + +target_include_directories(${SWIG_MODULE_kodi-lua_REAL_NAME} + PUBLIC + "${CMAKE_CURRENT_SOURCE_DIR}/../.." + "${LUA_INCLUDE_DIR}" +) diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/lua/kodidevkitlua.i b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/lua/kodidevkitlua.i new file mode 100644 index 0000000000000..bed9aa5b0a2f9 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/lua/kodidevkitlua.i @@ -0,0 +1,5 @@ +%module (docstring="Lua interface to libkodidevkit") kodi + +%feature("autodoc", "3"); + +%include ../kodidevkit.i diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/python3/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/python3/CMakeLists.txt new file mode 100644 index 0000000000000..74c92cc1677bd --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/python3/CMakeLists.txt @@ -0,0 +1,30 @@ +set_source_files_properties (kodidevkit3.i PROPERTIES CPLUSPLUS ON) +set_source_files_properties (kodidevkit3.i PROPERTIES SWIG_FLAGS "-I${CMAKE_BINARY_DIR}/src") + +message ("PYTHON3 attempting to build!") + +if (CMAKE_VERSION VERSION_LESS "3.8") + swig_add_module (python3-kodidevkit python kodidevkit3.i) +else () + swig_add_library (python3-kodidevkit LANGUAGE python SOURCES kodidevkit3.i) +endif () +swig_link_libraries (python3-kodidevkit ${PYTHON3_LIBRARIES} kodidevkit) + +target_include_directories(${SWIG_MODULE_python3-kodidevkit_REAL_NAME} + PUBLIC + "${CMAKE_CURRENT_SOURCE_DIR}/../.." + "${PYTHON3_INCLUDE_DIR}" +) + +set_target_properties (${SWIG_MODULE_python3-kodidevkit_REAL_NAME} PROPERTIES + OUTPUT_NAME _kodi + COMPILE_FLAGS "${CMAKE_C_FLAGS} -DSWIGPYTHON=${SWIG_FOUND} -DSWIGPYTHON3=${SWIG_FOUND}" +) + +install (TARGETS ${SWIG_MODULE_python3-kodidevkit_REAL_NAME} + DESTINATION ${CMAKE_INSTALL_PREFIX}/${PYTHON3_PACKAGES_PATH} +) + +install (FILES ${CMAKE_CURRENT_BINARY_DIR}/kodidevkit.py + DESTINATION ${CMAKE_INSTALL_PREFIX}/${PYTHON3_PACKAGES_PATH} +) diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/python3/kodidevkit3.i b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/python3/kodidevkit3.i new file mode 100644 index 0000000000000..7dd9522b055e2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/python3/kodidevkit3.i @@ -0,0 +1,3 @@ +%module(docstring="Python 3 interface to Kodi") kodi + +%include ../kodidevkit.i diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/python4/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/python4/CMakeLists.txt new file mode 100644 index 0000000000000..b2c62d828f9a8 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/python4/CMakeLists.txt @@ -0,0 +1,30 @@ +set_source_files_properties (kodidevkit4.i PROPERTIES CPLUSPLUS ON) +set_source_files_properties (kodidevkit4.i PROPERTIES SWIG_FLAGS "-I${CMAKE_BINARY_DIR}/src") + +message ("PYTHON4 attempting to build!") + +if (CMAKE_VERSION VERSION_LESS "3.8") + swig_add_module (python4-kodidevkit python kodidevkit4.i) +else () + swig_add_library (python4-kodidevkit LANGUAGE python SOURCES kodidevkit4.i) +endif () +swig_link_libraries (python4-kodidevkit ${PYTHON4_LIBRARIES} kodidevkit) + +target_include_directories(${SWIG_MODULE_python4-kodidevkit_REAL_NAME} + PUBLIC + "${CMAKE_CURRENT_SOURCE_DIR}/../.." + "${PYTHON4_INCLUDE_DIR}" +) + +set_target_properties (${SWIG_MODULE_python4-kodidevkit_REAL_NAME} PROPERTIES + OUTPUT_NAME _kodi + COMPILE_FLAGS "${CMAKE_C_FLAGS} -DSWIGPYTHON=${SWIG_FOUND} -DSWIGPYTHON4=${SWIG_FOUND}" +) + +install (TARGETS ${SWIG_MODULE_python4-kodidevkit_REAL_NAME} + DESTINATION ${CMAKE_INSTALL_PREFIX}/${PYTHON4_PACKAGES_PATH} +) + +install (FILES ${CMAKE_CURRENT_BINARY_DIR}/kodidevkit.py + DESTINATION ${CMAKE_INSTALL_PREFIX}/${PYTHON4_PACKAGES_PATH} +) diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/python4/kodidevkit4.i b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/python4/kodidevkit4.i new file mode 100644 index 0000000000000..7dd9522b055e2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/python4/kodidevkit4.i @@ -0,0 +1,3 @@ +%module(docstring="Python 3 interface to Kodi") kodi + +%include ../kodidevkit.i diff --git a/xbmc/addons/kodi-dev-kit/src/addon_language/swig/test.i b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/test.i new file mode 100644 index 0000000000000..05387a893bbdc --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_language/swig/test.i @@ -0,0 +1,34 @@ +%module kodi + +%rename("%s") ADDON_STATUS; + +%define ATTR_DLL_LOCAL +%enddef + +%ignore KODI_ADDON_INSTANCE_INFO; + +%{ +#include "c-api/version.h" +#include "c-api/addon_base.h" +#include "AddonBase.h" + +using namespace kodi; + +kodi_api_1 kodi::dl::api; +KODI_IFC_HDL kodi::dl::hdl = nullptr; +KODI_DLL_HDL kodi::dl::dll = nullptr; +kodi::addon::CAddonBase* kodi::addon::CAddonBase::addonBase = nullptr; +kodi::addon::IInstanceInfo kodi::addon::CAddonBase::firstInstance; +KODI_ADDON_HDL kodi::addon::CAddonBase::globalSingleInstance = nullptr; + +ADDON_STATUS kodi::addon::CAddonBase::ADDONBASE_create(const struct KODI_ADDON_INSTANCE_INFO* first_instance, KODI_ADDON_HDL* hdl) +{ + return ADDON_STATUS_NOT_IMPLEMENTED; +} + +%} + +%include "std_string.i" +%include "c-api/version.h" +%include "c-api/addon_base.h" +%include "AddonBase.h" diff --git a/xbmc/addons/kodi-dev-kit/src/addon_runner/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon_runner/CMakeLists.txt new file mode 100644 index 0000000000000..8f34b3b38d7cc --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_runner/CMakeLists.txt @@ -0,0 +1,36 @@ +# Add-on helper executable to launch an add-on library as executable in Kodi +# + +cmake_minimum_required(VERSION 3.5) +project(kodi_addon_runner) + +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() + +set(SOURCES main.cpp) + +set(DEVKIT_LAUNCH_EXE ${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX} CACHE STRING "Launch executable used for dev-kit") + +add_executable(${PROJECT_NAME} ${SOURCES}) +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 ${DEVKIT_LAUNCH_EXE} 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() + +target_link_libraries(${PROJECT_NAME} PUBLIC dl) +target_include_directories(${PROJECT_NAME} PRIVATE ${LIBDWARF_INCLUDE_DIRS} ../../include) +target_compile_definitions(${PROJECT_NAME} PRIVATE APP_NAME="${PROJECT_NAME}") + +set(LIBRARY_FILES ${LIBRARY_FILES} ${CMAKE_BINARY_DIR}/${DEVKIT_OUTPUT_DIRECTORY}/${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX} CACHE STRING "" FORCE) diff --git a/xbmc/addons/kodi-dev-kit/src/addon_runner/cxxopts.hpp b/xbmc/addons/kodi-dev-kit/src/addon_runner/cxxopts.hpp new file mode 100644 index 0000000000000..2dd4da6b73d10 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_runner/cxxopts.hpp @@ -0,0 +1,2714 @@ +/* + +Copyright (c) 2014, 2015, 2016, 2017 Jarryd Beck + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +#ifndef CXXOPTS_HPP_INCLUDED +#define CXXOPTS_HPP_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__GNUC__) && !defined(__clang__) +# if (__GNUC__ * 10 + __GNUC_MINOR__) < 49 +# define CXXOPTS_NO_REGEX true +# endif +#endif + +#ifndef CXXOPTS_NO_REGEX +# include +#endif // CXXOPTS_NO_REGEX + +// Nonstandard before C++17, which is coincidentally what we also need for +#ifdef __has_include +# if __has_include() +# include +# ifdef __cpp_lib_optional +# define CXXOPTS_HAS_OPTIONAL +# endif +# endif +#endif + +#if __cplusplus >= 201603L +#define CXXOPTS_NODISCARD [[nodiscard]] +#else +#define CXXOPTS_NODISCARD +#endif + +#ifndef CXXOPTS_VECTOR_DELIMITER +#define CXXOPTS_VECTOR_DELIMITER ',' +#endif + +#define CXXOPTS__VERSION_MAJOR 3 +#define CXXOPTS__VERSION_MINOR 0 +#define CXXOPTS__VERSION_PATCH 0 + +#if (__GNUC__ < 10 || (__GNUC__ == 10 && __GNUC_MINOR__ < 1)) && __GNUC__ >= 6 + #define CXXOPTS_NULL_DEREF_IGNORE +#endif + +namespace cxxopts +{ + static constexpr struct { + uint8_t major, minor, patch; + } version = { + CXXOPTS__VERSION_MAJOR, + CXXOPTS__VERSION_MINOR, + CXXOPTS__VERSION_PATCH + }; +} // namespace cxxopts + +//when we ask cxxopts to use Unicode, help strings are processed using ICU, +//which results in the correct lengths being computed for strings when they +//are formatted for the help output +//it is necessary to make sure that can be found by the +//compiler, and that icu-uc is linked in to the binary. + +#ifdef CXXOPTS_USE_UNICODE +#include + +namespace cxxopts +{ + using String = icu::UnicodeString; + + inline + String + toLocalString(std::string s) + { + return icu::UnicodeString::fromUTF8(std::move(s)); + } + +#if defined(__GNUC__) +// GNU GCC with -Weffc++ will issue a warning regarding the upcoming class, we want to silence it: +// warning: base class 'class std::enable_shared_from_this' has accessible non-virtual destructor +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wnon-virtual-dtor" +#pragma GCC diagnostic ignored "-Weffc++" +// This will be ignored under other compilers like LLVM clang. +#endif + class UnicodeStringIterator : public + std::iterator + { + public: + + UnicodeStringIterator(const icu::UnicodeString* string, int32_t pos) + : s(string) + , i(pos) + { + } + + value_type + operator*() const + { + return s->char32At(i); + } + + bool + operator==(const UnicodeStringIterator& rhs) const + { + return s == rhs.s && i == rhs.i; + } + + bool + operator!=(const UnicodeStringIterator& rhs) const + { + return !(*this == rhs); + } + + UnicodeStringIterator& + operator++() + { + ++i; + return *this; + } + + UnicodeStringIterator + operator+(int32_t v) + { + return UnicodeStringIterator(s, i + v); + } + + private: + const icu::UnicodeString* s; + int32_t i; + }; +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + + inline + String& + stringAppend(String&s, String a) + { + return s.append(std::move(a)); + } + + inline + String& + stringAppend(String& s, size_t n, UChar32 c) + { + for (size_t i = 0; i != n; ++i) + { + s.append(c); + } + + return s; + } + + template + String& + stringAppend(String& s, Iterator begin, Iterator end) + { + while (begin != end) + { + s.append(*begin); + ++begin; + } + + return s; + } + + inline + size_t + stringLength(const String& s) + { + return s.length(); + } + + inline + std::string + toUTF8String(const String& s) + { + std::string result; + s.toUTF8String(result); + + return result; + } + + inline + bool + empty(const String& s) + { + return s.isEmpty(); + } +} + +namespace std +{ + inline + cxxopts::UnicodeStringIterator + begin(const icu::UnicodeString& s) + { + return cxxopts::UnicodeStringIterator(&s, 0); + } + + inline + cxxopts::UnicodeStringIterator + end(const icu::UnicodeString& s) + { + return cxxopts::UnicodeStringIterator(&s, s.length()); + } +} + +//ifdef CXXOPTS_USE_UNICODE +#else + +namespace cxxopts +{ + using String = std::string; + + template + T + toLocalString(T&& t) + { + return std::forward(t); + } + + inline + size_t + stringLength(const String& s) + { + return s.length(); + } + + inline + String& + stringAppend(String&s, const String& a) + { + return s.append(a); + } + + inline + String& + stringAppend(String& s, size_t n, char c) + { + return s.append(n, c); + } + + template + String& + stringAppend(String& s, Iterator begin, Iterator end) + { + return s.append(begin, end); + } + + template + std::string + toUTF8String(T&& t) + { + return std::forward(t); + } + + inline + bool + empty(const std::string& s) + { + return s.empty(); + } +} // namespace cxxopts + +//ifdef CXXOPTS_USE_UNICODE +#endif + +namespace cxxopts +{ + namespace + { +#ifdef _WIN32 + const std::string LQUOTE("\'"); + const std::string RQUOTE("\'"); +#else + const std::string LQUOTE("‘"); + const std::string RQUOTE("’"); +#endif + } // namespace + +#if defined(__GNUC__) +// GNU GCC with -Weffc++ will issue a warning regarding the upcoming class, we want to silence it: +// warning: base class 'class std::enable_shared_from_this' has accessible non-virtual destructor +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wnon-virtual-dtor" +#pragma GCC diagnostic ignored "-Weffc++" +// This will be ignored under other compilers like LLVM clang. +#endif + class Value : public std::enable_shared_from_this + { + public: + + virtual ~Value() = default; + + virtual + std::shared_ptr + clone() const = 0; + + virtual void + parse(const std::string& text) const = 0; + + virtual void + parse() const = 0; + + virtual bool + has_default() const = 0; + + virtual bool + is_container() const = 0; + + virtual bool + has_implicit() const = 0; + + virtual std::string + get_default_value() const = 0; + + virtual std::string + get_implicit_value() const = 0; + + virtual std::shared_ptr + default_value(const std::string& value) = 0; + + virtual std::shared_ptr + implicit_value(const std::string& value) = 0; + + virtual std::shared_ptr + no_implicit_value() = 0; + + virtual bool + is_boolean() const = 0; + }; +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + class OptionException : public std::exception + { + public: + explicit OptionException(std::string message) + : m_message(std::move(message)) + { + } + + CXXOPTS_NODISCARD + const char* + what() const noexcept override + { + return m_message.c_str(); + } + + private: + std::string m_message; + }; + + class OptionSpecException : public OptionException + { + public: + + explicit OptionSpecException(const std::string& message) + : OptionException(message) + { + } + }; + + class OptionParseException : public OptionException + { + public: + explicit OptionParseException(const std::string& message) + : OptionException(message) + { + } + }; + + class option_exists_error : public OptionSpecException + { + public: + explicit option_exists_error(const std::string& option) + : OptionSpecException("Option " + LQUOTE + option + RQUOTE + " already exists") + { + } + }; + + class invalid_option_format_error : public OptionSpecException + { + public: + explicit invalid_option_format_error(const std::string& format) + : OptionSpecException("Invalid option format " + LQUOTE + format + RQUOTE) + { + } + }; + + class option_syntax_exception : public OptionParseException { + public: + explicit option_syntax_exception(const std::string& text) + : OptionParseException("Argument " + LQUOTE + text + RQUOTE + + " starts with a - but has incorrect syntax") + { + } + }; + + class option_not_exists_exception : public OptionParseException + { + public: + explicit option_not_exists_exception(const std::string& option) + : OptionParseException("Option " + LQUOTE + option + RQUOTE + " does not exist") + { + } + }; + + class missing_argument_exception : public OptionParseException + { + public: + explicit missing_argument_exception(const std::string& option) + : OptionParseException( + "Option " + LQUOTE + option + RQUOTE + " is missing an argument" + ) + { + } + }; + + class option_requires_argument_exception : public OptionParseException + { + public: + explicit option_requires_argument_exception(const std::string& option) + : OptionParseException( + "Option " + LQUOTE + option + RQUOTE + " requires an argument" + ) + { + } + }; + + class option_not_has_argument_exception : public OptionParseException + { + public: + option_not_has_argument_exception + ( + const std::string& option, + const std::string& arg + ) + : OptionParseException( + "Option " + LQUOTE + option + RQUOTE + + " does not take an argument, but argument " + + LQUOTE + arg + RQUOTE + " given" + ) + { + } + }; + + class option_not_present_exception : public OptionParseException + { + public: + explicit option_not_present_exception(const std::string& option) + : OptionParseException("Option " + LQUOTE + option + RQUOTE + " not present") + { + } + }; + + class option_has_no_value_exception : public OptionException + { + public: + explicit option_has_no_value_exception(const std::string& option) + : OptionException( + !option.empty() ? + ("Option " + LQUOTE + option + RQUOTE + " has no value") : + "Option has no value") + { + } + }; + + class argument_incorrect_type : public OptionParseException + { + public: + explicit argument_incorrect_type + ( + const std::string& arg + ) + : OptionParseException( + "Argument " + LQUOTE + arg + RQUOTE + " failed to parse" + ) + { + } + }; + + class option_required_exception : public OptionParseException + { + public: + explicit option_required_exception(const std::string& option) + : OptionParseException( + "Option " + LQUOTE + option + RQUOTE + " is required but not present" + ) + { + } + }; + + template + void throw_or_mimic(const std::string& text) + { + static_assert(std::is_base_of::value, + "throw_or_mimic only works on std::exception and " + "deriving classes"); + +#ifndef CXXOPTS_NO_EXCEPTIONS + // If CXXOPTS_NO_EXCEPTIONS is not defined, just throw + throw T{text}; +#else + // Otherwise manually instantiate the exception, print what() to stderr, + // and exit + T exception{text}; + std::cerr << exception.what() << std::endl; + std::exit(EXIT_FAILURE); +#endif + } + + namespace values + { + namespace parser_tool + { + struct IntegerDesc + { + std::string negative = ""; + std::string base = ""; + std::string value = ""; + }; + struct ArguDesc { + std::string arg_name = ""; + bool grouping = false; + bool set_value = false; + std::string value = ""; + }; +#ifdef CXXOPTS_NO_REGEX + inline IntegerDesc SplitInteger(const std::string &text) + { + if (text.empty()) + { + throw_or_mimic(text); + } + IntegerDesc desc; + const char *pdata = text.c_str(); + if (*pdata == '-') + { + pdata += 1; + desc.negative = "-"; + } + if (strncmp(pdata, "0x", 2) == 0) + { + pdata += 2; + desc.base = "0x"; + } + if (*pdata != '\0') + { + desc.value = std::string(pdata); + } + else + { + throw_or_mimic(text); + } + return desc; + } + + inline bool IsTrueText(const std::string &text) + { + const char *pdata = text.c_str(); + if (*pdata == 't' || *pdata == 'T') + { + pdata += 1; + if (strncmp(pdata, "rue\0", 4) == 0) + { + return true; + } + } + else if (strncmp(pdata, "1\0", 2) == 0) + { + return true; + } + return false; + } + + inline bool IsFalseText(const std::string &text) + { + const char *pdata = text.c_str(); + if (*pdata == 'f' || *pdata == 'F') + { + pdata += 1; + if (strncmp(pdata, "alse\0", 5) == 0) + { + return true; + } + } + else if (strncmp(pdata, "0\0", 2) == 0) + { + return true; + } + return false; + } + + inline std::pair SplitSwitchDef(const std::string &text) + { + std::string short_sw, long_sw; + const char *pdata = text.c_str(); + if (isalnum(*pdata) && *(pdata + 1) == ',') { + short_sw = std::string(1, *pdata); + pdata += 2; + } + while (*pdata == ' ') { pdata += 1; } + if (isalnum(*pdata)) { + const char *store = pdata; + pdata += 1; + while (isalnum(*pdata) || *pdata == '-' || *pdata == '_') { + pdata += 1; + } + if (*pdata == '\0') { + long_sw = std::string(store, pdata - store); + } else { + throw_or_mimic(text); + } + } + return std::pair(short_sw, long_sw); + } + + inline ArguDesc ParseArgument(const char *arg, bool &matched) + { + ArguDesc argu_desc; + const char *pdata = arg; + matched = false; + if (strncmp(pdata, "--", 2) == 0) + { + pdata += 2; + if (isalnum(*pdata)) + { + argu_desc.arg_name.push_back(*pdata); + pdata += 1; + while (isalnum(*pdata) || *pdata == '-' || *pdata == '_') + { + argu_desc.arg_name.push_back(*pdata); + pdata += 1; + } + if (argu_desc.arg_name.length() > 1) + { + if (*pdata == '=') + { + argu_desc.set_value = true; + pdata += 1; + if (*pdata != '\0') + { + argu_desc.value = std::string(pdata); + } + matched = true; + } + else if (*pdata == '\0') + { + matched = true; + } + } + } + } + else if (strncmp(pdata, "-", 1) == 0) + { + pdata += 1; + argu_desc.grouping = true; + while (isalnum(*pdata)) + { + argu_desc.arg_name.push_back(*pdata); + pdata += 1; + } + matched = !argu_desc.arg_name.empty() && *pdata == '\0'; + } + return argu_desc; + } + +#else // CXXOPTS_NO_REGEX + + namespace + { + + std::basic_regex integer_pattern + ("(-)?(0x)?([0-9a-zA-Z]+)|((0x)?0)"); + std::basic_regex truthy_pattern + ("(t|T)(rue)?|1"); + std::basic_regex falsy_pattern + ("(f|F)(alse)?|0"); + + std::basic_regex option_matcher + ("--([[:alnum:]][-_[:alnum:]]+)(=(.*))?|-([[:alnum:]]+)"); + std::basic_regex option_specifier + ("(([[:alnum:]]),)?[ ]*([[:alnum:]][-_[:alnum:]]*)?"); + + } // namespace + + inline IntegerDesc SplitInteger(const std::string &text) + { + std::smatch match; + std::regex_match(text, match, integer_pattern); + + if (match.length() == 0) + { + throw_or_mimic(text); + } + + IntegerDesc desc; + desc.negative = match[1]; + desc.base = match[2]; + desc.value = match[3]; + + if (match.length(4) > 0) + { + desc.base = match[5]; + desc.value = "0"; + return desc; + } + + return desc; + } + + inline bool IsTrueText(const std::string &text) + { + std::smatch result; + std::regex_match(text, result, truthy_pattern); + return !result.empty(); + } + + inline bool IsFalseText(const std::string &text) + { + std::smatch result; + std::regex_match(text, result, falsy_pattern); + return !result.empty(); + } + + inline std::pair SplitSwitchDef(const std::string &text) + { + std::match_results result; + std::regex_match(text.c_str(), result, option_specifier); + if (result.empty()) + { + throw_or_mimic(text); + } + + const std::string& short_sw = result[2]; + const std::string& long_sw = result[3]; + + return std::pair(short_sw, long_sw); + } + + inline ArguDesc ParseArgument(const char *arg, bool &matched) + { + std::match_results result; + std::regex_match(arg, result, option_matcher); + matched = !result.empty(); + + ArguDesc argu_desc; + if (matched) { + argu_desc.arg_name = result[1].str(); + argu_desc.set_value = result[2].length() > 0; + argu_desc.value = result[3].str(); + if (result[4].length() > 0) + { + argu_desc.grouping = true; + argu_desc.arg_name = result[4].str(); + } + } + + return argu_desc; + } + +#endif // CXXOPTS_NO_REGEX +#undef CXXOPTS_NO_REGEX + } + + namespace detail + { + template + struct SignedCheck; + + template + struct SignedCheck + { + template + void + operator()(bool negative, U u, const std::string& text) + { + if (negative) + { + if (u > static_cast((std::numeric_limits::min)())) + { + throw_or_mimic(text); + } + } + else + { + if (u > static_cast((std::numeric_limits::max)())) + { + throw_or_mimic(text); + } + } + } + }; + + template + struct SignedCheck + { + template + void + operator()(bool, U, const std::string&) const {} + }; + + template + void + check_signed_range(bool negative, U value, const std::string& text) + { + SignedCheck::is_signed>()(negative, value, text); + } + } // namespace detail + + template + void + checked_negate(R& r, T&& t, const std::string&, std::true_type) + { + // if we got to here, then `t` is a positive number that fits into + // `R`. So to avoid MSVC C4146, we first cast it to `R`. + // See https://github.com/jarro2783/cxxopts/issues/62 for more details. + r = static_cast(-static_cast(t-1)-1); + } + + template + void + checked_negate(R&, T&&, const std::string& text, std::false_type) + { + throw_or_mimic(text); + } + + template + void + integer_parser(const std::string& text, T& value) + { + parser_tool::IntegerDesc int_desc = parser_tool::SplitInteger(text); + + using US = typename std::make_unsigned::type; + constexpr bool is_signed = std::numeric_limits::is_signed; + + const bool negative = int_desc.negative.length() > 0; + const uint8_t base = int_desc.base.length() > 0 ? 16 : 10; + const std::string & value_match = int_desc.value; + + US result = 0; + + for (char ch : value_match) + { + US digit = 0; + + if (ch >= '0' && ch <= '9') + { + digit = static_cast(ch - '0'); + } + else if (base == 16 && ch >= 'a' && ch <= 'f') + { + digit = static_cast(ch - 'a' + 10); + } + else if (base == 16 && ch >= 'A' && ch <= 'F') + { + digit = static_cast(ch - 'A' + 10); + } + else + { + throw_or_mimic(text); + } + + const US next = static_cast(result * base + digit); + if (result > next) + { + throw_or_mimic(text); + } + + result = next; + } + + detail::check_signed_range(negative, result, text); + + if (negative) + { + checked_negate(value, result, text, std::integral_constant()); + } + else + { + value = static_cast(result); + } + } + + template + void stringstream_parser(const std::string& text, T& value) + { + std::stringstream in(text); + in >> value; + if (!in) { + throw_or_mimic(text); + } + } + + template ::value>::type* = nullptr + > + void parse_value(const std::string& text, T& value) + { + integer_parser(text, value); + } + + inline + void + parse_value(const std::string& text, bool& value) + { + if (parser_tool::IsTrueText(text)) + { + value = true; + return; + } + + if (parser_tool::IsFalseText(text)) + { + value = false; + return; + } + + throw_or_mimic(text); + } + + inline + void + parse_value(const std::string& text, std::string& value) + { + value = text; + } + + // The fallback parser. It uses the stringstream parser to parse all types + // that have not been overloaded explicitly. It has to be placed in the + // source code before all other more specialized templates. + template ::value>::type* = nullptr + > + void + parse_value(const std::string& text, T& value) { + stringstream_parser(text, value); + } + + template + void + parse_value(const std::string& text, std::vector& value) + { + if (text.empty()) { + T v; + parse_value(text, v); + value.emplace_back(std::move(v)); + return; + } + std::stringstream in(text); + std::string token; + while(!in.eof() && std::getline(in, token, CXXOPTS_VECTOR_DELIMITER)) { + T v; + parse_value(token, v); + value.emplace_back(std::move(v)); + } + } + +#ifdef CXXOPTS_HAS_OPTIONAL + template + void + parse_value(const std::string& text, std::optional& value) + { + T result; + parse_value(text, result); + value = std::move(result); + } +#endif + + inline + void parse_value(const std::string& text, char& c) + { + if (text.length() != 1) + { + throw_or_mimic(text); + } + + c = text[0]; + } + + template + struct type_is_container + { + static constexpr bool value = false; + }; + + template + struct type_is_container> + { + static constexpr bool value = true; + }; + + template + class abstract_value : public Value + { + using Self = abstract_value; + + public: + abstract_value() + : m_result(std::make_shared()) + , m_store(m_result.get()) + { + } + + explicit abstract_value(T* t) + : m_store(t) + { + } + + ~abstract_value() override = default; + + abstract_value& operator=(const abstract_value&) = default; + + abstract_value(const abstract_value& rhs) + { + if (rhs.m_result) + { + m_result = std::make_shared(); + m_store = m_result.get(); + } + else + { + m_store = rhs.m_store; + } + + m_default = rhs.m_default; + m_implicit = rhs.m_implicit; + m_default_value = rhs.m_default_value; + m_implicit_value = rhs.m_implicit_value; + } + + void + parse(const std::string& text) const override + { + parse_value(text, *m_store); + } + + bool + is_container() const override + { + return type_is_container::value; + } + + void + parse() const override + { + parse_value(m_default_value, *m_store); + } + + bool + has_default() const override + { + return m_default; + } + + bool + has_implicit() const override + { + return m_implicit; + } + + std::shared_ptr + default_value(const std::string& value) override + { + m_default = true; + m_default_value = value; + return shared_from_this(); + } + + std::shared_ptr + implicit_value(const std::string& value) override + { + m_implicit = true; + m_implicit_value = value; + return shared_from_this(); + } + + std::shared_ptr + no_implicit_value() override + { + m_implicit = false; + return shared_from_this(); + } + + std::string + get_default_value() const override + { + return m_default_value; + } + + std::string + get_implicit_value() const override + { + return m_implicit_value; + } + + bool + is_boolean() const override + { + return std::is_same::value; + } + + const T& + get() const + { + if (m_store == nullptr) + { + return *m_result; + } + return *m_store; + } + + protected: + std::shared_ptr m_result{}; + T* m_store{}; + + bool m_default = false; + bool m_implicit = false; + + std::string m_default_value{}; + std::string m_implicit_value{}; + }; + + template + class standard_value : public abstract_value + { + public: + using abstract_value::abstract_value; + + CXXOPTS_NODISCARD + std::shared_ptr + clone() const override + { + return std::make_shared>(*this); + } + }; + + template <> + class standard_value : public abstract_value + { + public: + ~standard_value() override = default; + + standard_value() + { + set_default_and_implicit(); + } + + explicit standard_value(bool* b) + : abstract_value(b) + { + set_default_and_implicit(); + } + + std::shared_ptr + clone() const override + { + return std::make_shared>(*this); + } + + private: + + void + set_default_and_implicit() + { + m_default = true; + m_default_value = "false"; + m_implicit = true; + m_implicit_value = "true"; + } + }; + } // namespace values + + template + std::shared_ptr + value() + { + return std::make_shared>(); + } + + template + std::shared_ptr + value(T& t) + { + return std::make_shared>(&t); + } + + class OptionAdder; + + class OptionDetails + { + public: + OptionDetails + ( + std::string short_, + std::string long_, + String desc, + std::shared_ptr val + ) + : m_short(std::move(short_)) + , m_long(std::move(long_)) + , m_desc(std::move(desc)) + , m_value(std::move(val)) + , m_count(0) + { + m_hash = std::hash{}(m_long + m_short); + } + + OptionDetails(const OptionDetails& rhs) + : m_desc(rhs.m_desc) + , m_value(rhs.m_value->clone()) + , m_count(rhs.m_count) + { + } + + OptionDetails(OptionDetails&& rhs) = default; + + CXXOPTS_NODISCARD + const String& + description() const + { + return m_desc; + } + + CXXOPTS_NODISCARD + const Value& + value() const { + return *m_value; + } + + CXXOPTS_NODISCARD + std::shared_ptr + make_storage() const + { + return m_value->clone(); + } + + CXXOPTS_NODISCARD + const std::string& + short_name() const + { + return m_short; + } + + CXXOPTS_NODISCARD + const std::string& + long_name() const + { + return m_long; + } + + size_t + hash() const + { + return m_hash; + } + + private: + std::string m_short{}; + std::string m_long{}; + String m_desc{}; + std::shared_ptr m_value{}; + int m_count; + + size_t m_hash{}; + }; + + struct HelpOptionDetails + { + std::string s; + std::string l; + String desc; + bool has_default; + std::string default_value; + bool has_implicit; + std::string implicit_value; + std::string arg_help; + bool is_container; + bool is_boolean; + }; + + struct HelpGroupDetails + { + std::string name{}; + std::string description{}; + std::vector options{}; + }; + + class OptionValue + { + public: + void + parse + ( + const std::shared_ptr& details, + const std::string& text + ) + { + ensure_value(details); + ++m_count; + m_value->parse(text); + m_long_name = &details->long_name(); + } + + void + parse_default(const std::shared_ptr& details) + { + ensure_value(details); + m_default = true; + m_long_name = &details->long_name(); + m_value->parse(); + } + + void + parse_no_value(const std::shared_ptr& details) + { + m_long_name = &details->long_name(); + } + +#if defined(CXXOPTS_NULL_DEREF_IGNORE) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wnull-dereference" +#endif + + CXXOPTS_NODISCARD + size_t + count() const noexcept + { + return m_count; + } + +#if defined(CXXOPTS_NULL_DEREF_IGNORE) +#pragma GCC diagnostic pop +#endif + + // TODO: maybe default options should count towards the number of arguments + CXXOPTS_NODISCARD + bool + has_default() const noexcept + { + return m_default; + } + + template + const T& + as() const + { + if (m_value == nullptr) { + throw_or_mimic( + m_long_name == nullptr ? "" : *m_long_name); + } + +#ifdef CXXOPTS_NO_RTTI + return static_cast&>(*m_value).get(); +#else + return dynamic_cast&>(*m_value).get(); +#endif + } + + private: + void + ensure_value(const std::shared_ptr& details) + { + if (m_value == nullptr) + { + m_value = details->make_storage(); + } + } + + + const std::string* m_long_name = nullptr; + // Holding this pointer is safe, since OptionValue's only exist in key-value pairs, + // where the key has the string we point to. + std::shared_ptr m_value{}; + size_t m_count = 0; + bool m_default = false; + }; + + class KeyValue + { + public: + KeyValue(std::string key_, std::string value_) + : m_key(std::move(key_)) + , m_value(std::move(value_)) + { + } + + CXXOPTS_NODISCARD + const std::string& + key() const + { + return m_key; + } + + CXXOPTS_NODISCARD + const std::string& + value() const + { + return m_value; + } + + template + T + as() const + { + T result; + values::parse_value(m_value, result); + return result; + } + + private: + std::string m_key; + std::string m_value; + }; + + using ParsedHashMap = std::unordered_map; + using NameHashMap = std::unordered_map; + + class ParseResult + { + public: + class Iterator + { + public: + using iterator_category = std::forward_iterator_tag; + using value_type = KeyValue; + using difference_type = void; + using pointer = const KeyValue*; + using reference = const KeyValue&; + + Iterator() = default; + Iterator(const Iterator&) = default; + + Iterator(const ParseResult *pr, bool end=false) + : m_pr(pr) + , m_iter(end? pr->m_defaults.end(): pr->m_sequential.begin()) + { + } + + Iterator& operator++() + { + ++m_iter; + if(m_iter == m_pr->m_sequential.end()) + { + m_iter = m_pr->m_defaults.begin(); + return *this; + } + return *this; + } + + Iterator operator++(int) + { + Iterator retval = *this; + ++(*this); + return retval; + } + + bool operator==(const Iterator& other) const + { + return m_iter == other.m_iter; + } + + bool operator!=(const Iterator& other) const + { + return !(*this == other); + } + + const KeyValue& operator*() + { + return *m_iter; + } + + const KeyValue* operator->() + { + return m_iter.operator->(); + } + + private: + const ParseResult* m_pr; + std::vector::const_iterator m_iter; + }; + + ParseResult() = default; + ParseResult(const ParseResult&) = default; + + ParseResult(NameHashMap&& keys, ParsedHashMap&& values, std::vector sequential, + std::vector default_opts, std::vector&& unmatched_args) + : m_keys(std::move(keys)) + , m_values(std::move(values)) + , m_sequential(std::move(sequential)) + , m_defaults(std::move(default_opts)) + , m_unmatched(std::move(unmatched_args)) + { + } + + ParseResult& operator=(ParseResult&&) = default; + ParseResult& operator=(const ParseResult&) = default; + + Iterator + begin() const + { + return Iterator(this); + } + + Iterator + end() const + { + return Iterator(this, true); + } + + size_t + count(const std::string& o) const + { + auto iter = m_keys.find(o); + if (iter == m_keys.end()) + { + return 0; + } + + auto viter = m_values.find(iter->second); + + if (viter == m_values.end()) + { + return 0; + } + + return viter->second.count(); + } + + const OptionValue& + operator[](const std::string& option) const + { + auto iter = m_keys.find(option); + + if (iter == m_keys.end()) + { + throw_or_mimic(option); + } + + auto viter = m_values.find(iter->second); + + if (viter == m_values.end()) + { + throw_or_mimic(option); + } + + return viter->second; + } + + const std::vector& + arguments() const + { + return m_sequential; + } + + const std::vector& + unmatched() const + { + return m_unmatched; + } + + const std::vector& + defaults() const + { + return m_defaults; + } + + const std::string + arguments_string() const + { + std::string result; + for(const auto& kv: m_sequential) + { + result += kv.key() + " = " + kv.value() + "\n"; + } + for(const auto& kv: m_defaults) + { + result += kv.key() + " = " + kv.value() + " " + "(default)" + "\n"; + } + return result; + } + + private: + NameHashMap m_keys{}; + ParsedHashMap m_values{}; + std::vector m_sequential{}; + std::vector m_defaults{}; + std::vector m_unmatched{}; + }; + + struct Option + { + Option + ( + std::string opts, + std::string desc, + std::shared_ptr value = ::cxxopts::value(), + std::string arg_help = "" + ) + : opts_(std::move(opts)) + , desc_(std::move(desc)) + , value_(std::move(value)) + , arg_help_(std::move(arg_help)) + { + } + + std::string opts_; + std::string desc_; + std::shared_ptr value_; + std::string arg_help_; + }; + + using OptionMap = std::unordered_map>; + using PositionalList = std::vector; + using PositionalListIterator = PositionalList::const_iterator; + + class OptionParser + { + public: + OptionParser(const OptionMap& options, const PositionalList& positional, bool allow_unrecognised) + : m_options(options) + , m_positional(positional) + , m_allow_unrecognised(allow_unrecognised) + { + } + + ParseResult + parse(int argc, const char* const* argv); + + bool + consume_positional(const std::string& a, PositionalListIterator& next); + + void + checked_parse_arg + ( + int argc, + const char* const* argv, + int& current, + const std::shared_ptr& value, + const std::string& name + ); + + void + add_to_option(OptionMap::const_iterator iter, const std::string& option, const std::string& arg); + + void + parse_option + ( + const std::shared_ptr& value, + const std::string& name, + const std::string& arg = "" + ); + + void + parse_default(const std::shared_ptr& details); + + void + parse_no_value(const std::shared_ptr& details); + + private: + + void finalise_aliases(); + + const OptionMap& m_options; + const PositionalList& m_positional; + + std::vector m_sequential{}; + std::vector m_defaults{}; + bool m_allow_unrecognised; + + ParsedHashMap m_parsed{}; + NameHashMap m_keys{}; + }; + + class Options + { + public: + + explicit Options(std::string program, std::string help_string = "") + : m_program(std::move(program)) + , m_help_string(toLocalString(std::move(help_string))) + , m_custom_help("[OPTION...]") + , m_positional_help("positional parameters") + , m_show_positional(false) + , m_allow_unrecognised(false) + , m_width(76) + , m_tab_expansion(false) + , m_options(std::make_shared()) + { + } + + Options& + positional_help(std::string help_text) + { + m_positional_help = std::move(help_text); + return *this; + } + + Options& + custom_help(std::string help_text) + { + m_custom_help = std::move(help_text); + return *this; + } + + Options& + show_positional_help() + { + m_show_positional = true; + return *this; + } + + Options& + allow_unrecognised_options() + { + m_allow_unrecognised = true; + return *this; + } + + Options& + set_width(size_t width) + { + m_width = width; + return *this; + } + + Options& + set_tab_expansion(bool expansion=true) + { + m_tab_expansion = expansion; + return *this; + } + + ParseResult + parse(int argc, const char* const* argv); + + OptionAdder + add_options(std::string group = ""); + + void + add_options + ( + const std::string& group, + std::initializer_list;qB|3^b*vb}h`?DC| zg|Lj5)Mx!&=Ij;Nfd$ID&^p+ zj%T(UF5BBxJXiOzTov(<)#w6N`)u~YT)bezzyZb!bb zOLo~C&HT9OelPUW?8s>}D~ z%8}ppl?ckKS5%a9_`RXM@^^P=iFLlu9G_#Wl&k=Dg>ydUG=a2G31=?BLb(*nnvFlO zV_f>_KMwH(8`E_-*<$;a_>r`g=Q>#a|0#{of$6zopQQ8fZkwB6WoHuO0SbW^B_|5Y z0Y`6G9NxVm_T8AYUeb{Y4V0WLv3PWue4#&8sP@LiZbM8-x--d*pC}`uVf?4`$AjhM z$6iPk++APPpoe+M)!bFixF-r;sQ_m09>8fm>|ZVb(*#g@xSze4x_DQVMI@>#)qC5t1 ze)n+pLpk7x>dgkoYxW*#p-1PHkK*yee-IAIJh=C5l#LtGUQexIbv%qz1Tv_ zX&d@)95d^FB)e3?@w#yKmtKk71*87(L1;JuwjkAj;v#*aA)Cj9cee`3h3m(h9n2OZ zf|K(03*zXRFk%KRPrexHq1{1gZ8t_=&QRivp`7(C8h4*PZZrZK#B{4yGE$r$K2B5& zrIoR`9Ci)up9CW)N|4p~s=+6P&&0eTczS{moSc=!NP7S76YU-?y|=l-&sYFE1yrSW zJi%NE=kb0F*#x|Me$kQ*q>5V<2Q1~B#r3E0BpFQ*U`{AvSYSTY5eZv+Tu7!BQ)QG ztg>(VB*RkP0e)`_1Tuj|5eynKBY`9=-T&J%-_XloDaN5D*=?*1|NSn+Dr&1cVEiir zA4Ej;AC$9%ZmPo~DnyDqyun4f`$4ble=x9||G>a1vY7tCz}|4IEZy}{O00~B-5qPP zW13BvmED!)fD4KwqCMPG{Xnl>w>9HeE(&{W&*EzH zmip1OtnTN%6mr~WR#!?NfDoaLNmRvsr?sy%)Ti&IW$zxuINKCHgHydikb+HZD>ei0 zDF3C-{YJ179k7GKBih*>*BV#b9qprnB*BVPwa9k0FS@imzZnlU5oo5iwc2Mz9UhW1 z#7Pk%PWKRUo8R{MUH5Asm_RSbH>O?j1}VsczVJrk2h??Fd0tlXBG(qEdn&L+roX%2 zC{@(U_~?jNeR}DMGNE3MqgI0(t{b}bmrW!RluT*%=E#)VYqo)5-YtZEer?v{T@EQQ zc&}&I&3(Da6Q%Cv+9&2&r2nI+IxDi8cyT4|vTc?hE^NfRFdd6^*ASnH@WKi1zpI1@ z<`py)0HRqe*W=m3m|RbF_mt(*DGAk0*J!#oxuoJg!#n-AlEpl9f2ZR8&J;?13ZDgYO!4h+Wcf!I ztoc$2`Lo~Bz4lCYORhSt@@(2JaDU5G-cDVzYR3S*NVx@}=v6Tfzx$t&FPtLB2BjRx z`y3F_ei`b9Fq&D~kZ%$v-(k_TR)4XtxPdllrAR$&y_b0HWx<~AY_Duk7C5!lyM zP(J0ckc45xvy;=7H_Hg!7$w7Do0&qmP?7)m4P5pURy|YVf zaM?0xBQ%u%34!H}xqrx)%ZzxSaF25f{C5{23M^~~%EO{(tuu>psgo%h)r@%;swDp` zBm&3+rGEVlC|dsz`{y-Ch1{EPN*G&)d$&>S73TjeIkO_2EdL0=g6JQ|Y%Jdr_{Y6| z@9+oLhFWH?-Ew0X^lRODk7}6^6mCa#9`H1?EPT+_wrdI(QJ#vu#)M!}5dN|&hbc`$ zBqi6N=eIk{U#F&LLSAnAT=SIzeO^4)oEK1W<*P_t#9y^?cdGKdN95nLEk084()p{n zBZVF=++TWJ_Yk<|=TsEZYgW=QH1K*ffd?VFPvkR&h91?Tt!f?K(}Cg%mtsz%@CA+@ zzS%%C$CgD9zrmD8!)AxY$@z8z;>(n-)m-bES~u`=jmCKWmx6bY#QrIo`)}4NRi%q* zP+co9;eQvu#YJ~kr!Po{wwf{^a)?{6^g<@b-LR+oR4{mF+r8>yZ&rT}u-SpSp?PXZ z^GMHI11g!vV#~F7O=X~HwRz>9HlTj#M|2b*zf~8RQ2ic3nKdD0HF7fBpUDSU`9~;l z0q*zx-mqP3k&~|&2&XwxsQs1d;sA_YkP7+J7;mQR=g25CFY4`^@Bho!XABL*f;#01AF*IBnJnahn}D z5~^tSQrEv#hx$BA&^k8R7`nbWOhJ%%S2oi<@ENr>hs%u2&Ja3=v4?zW4Ek3_0xz6Y z4w*Bk!e31WK;VbVu1+}9BtIc1ho+M#(!Sq?pCAAU%#Xr(K{y{NGijxSDPFvP|L)y; z{tzih@E76NQRMHRWId(36E0Q}w;<07h!(*TkvcIMY!!O(`dz;*A?4kDD*LXmsjKPn z$x0I+s7YCuq#>#MbN#x{NLKa?5*!|umjFNwEf}U^>wSy?Qmb_;35YL&x2r48eaI{T z@tLU~QqL%&D7;!~_ge6Ahd%ls=#|9ZgrA?b3hC#08*Dl9_`XQTbxCUpwjh~c3y!_DB z+)#%kz7}hwB;*7ZBhjro_u{V?bJ`ZG8+u}aX1gSA5~UmF(R&e1`LUom4*&~N%Z$f3*w``qU=|ukDUT zwpcKr@%JL<#ABBuS8lFDLJ88V5;KPi+^R}QN0K?@8Pd9GvYT$X?Y~p3&$n~b3k?Rmg7DuNN?J;k8|_c& zGi?=8(dsEJ7U*x!q-SMZuLa-L=LXoWr_2xX#C}0vEZ_n?R8L3Z+8!aFNu1Pk6d!ya zN&Iv}N_4Zc$f(_?GMs=Y4^`J{rg-226rjcay7wr%OI3U$tPb!sW&)#g+#I|Bhu!sn zrrW%55Y;yOBn)+edmMNw*?K)D-TrXHMRM!LFun6?GjwylVTVdif(5SQuh9jfhG9A$ zFnhx}RP7`{t^sG(*y?EGpqjm0^t|u)sz0{7(nvB!dW0Nk5`YV5nJtVOyWR%thtqFm zSij8-0ogB&wr`)Xn>}0m0S{)C@vDGtc0O52ZA>wq2HvY4wz}Vi8?=tq3r^!8?Tz=& zbL`4|5ZlqH2eKdawoeBFg|0fRSYK%kjiK;Kw+ga@e7u-|0%Ykr7ALzeSv@sUSK+@} zky&;@7?m#F#xA?0QnXA8EGD||l$0f_w^FN~-m9;NEDH)7)q5rG!9&AAx6p#Q%iUDd z{;5eWu5A@=cW;}-iE4s6wLnaxLfND16 z(_*7;=q*9y`tNo{5|@33dwaDX7>h`qoXsa^;u6ENa`EejEuZgtM|SdLGCHdVVk_we z_V6uXs-Z*h1R1 zyN!mmrEoe&c35v}Ba3mgt;5DwYUe8YLt4eE0!SuG>kMUbT#N*(PsPSUnTa}*!T^W!Vq#_^IprV{r)2*o!p6rURIe3bP<~L`? z5(3dfqwFh2-Gy|eZ3`jmM(G`s6SX>=QE{=tmgynM2_hn&sRKG)cg7@g z+b<7;JPVlSPEx>g5WQ-x^QRThKXj~g-k2Y8zD?qb%Pa|ZhwU-M%cpkfakh*NFE$%* z(>vUk+Mi6sr-m!Pxm`hXv213uG^Vk%7&N#aVgi+3=5&noOZ`%COya+@k&yk;8QlCe z%%_a*D&!er9+5%{vXj^m{C;Gscu4^}jvR&;TQPU#BUAX+e98ywq@H(lcCvl5;^vLK znAZBXdW=@Z+Sta%LAdiFfN58gaFzT@AsqE605n=NjefeFs06$*dS2EtO*c-!e!e~V zxulMUtR{ffevPkG>STzoYjGpH%E^2D(kKY_L+SD3R(=Ee{ySx$Ag!;j@1rNwTciw$ zHXt=OC(jghLOsLz?+paJhWs@j(#fz<6YM_T_w%xadp~Ao^^mj1G~;q^th15Y;yO7U z7|hW~TG^3+=S1@S%;K=)75pL~B>mamatRYr;2lN|G0wwOzZ*7;Zd@se-Lnz-urKOu zTor+PMqV0eK1u5NG~vw%^(ua6V&SuWc3*nl?ej~SvK);(cPz(%aYQG-lAk+qEl=+( z!`HOYoL>5Nc&ryTa!g;hH`aU={=s5(O*)yLX3qOPaotixMTj7omNwkv>L&l~UF6vt z9r|V{E-47>auj?)AbtYc*)U>)#ZO_-P6OQvO?h`ICRlO3qhutuG(KymO#Cc*n7{^i zga&Xrpa?m0`mC}-^=F&D7>=G8fUB|R>W?LmTCf5bENEnAh&MmQryt(1zvYb!!?fCW zJqSLTt^+nXF`F5cJ5U|crl`Y2j7exC> z9`1U1qT$pi>uQCO-Q|8Ed=Jz4`i~e7%Olm^v)g=3;9)_M?qcX}aI;%bMuV8)=JF$a z`oRq&DenH@N*4J5>K|Tvb|d2HRFoahUGWdF;wl=CCP`5ZFTdKCixC@bVtDoeGf{_i zI80Ur*$0_Dp<9?ux5zWcJR|;zCEfm{TLs~}RhL!+M|#Yq4}|y0QKa-eRAS`2GM9^g!+xkfCx;A<6E-$R==1wp}S$puhYXTYCGp^kw8Xg!j@=< z_utT_CvNcCeUej?C+dp63VDAS%E$7`G$#H!HGHE%kIvwJ%H25+ z-oXUK2t|ao~sNxU`LRWwrI4S6LRd*HnU#vgJLN7PyFC_qS?@_cb zyzPZD%jz$&yPlIdfe(F575enne~y?h@z#Pxk!jIy1a4pNLyl616$c?V#lMVuqhTd| zn<+1kg$CZjUq)s$L1(prL*UiwyYZ%}E^+Bi2hDM_CbXgiY49`VgtL-2;c2Mo#y?UI zhOjq5+bzMwfPOi0RAlX=I^Rz_MelZwoby);zqayc3)OkwCzHbDCF}IzA3#7ysGmQI zPlEyqy6!NB<4T_D4S7BzDphYbtRS_A5XMRowuMz^@>~>Ss=y+2hkvdXcQn#7ARXl0 z*$D3KbGrDs%o`WOs&V^Dn2P>G7*5H~R9XJ^$y=FOBT9PySg|hRSsBG$Z!Bi_9M82bnD$&M8XqRq9A$JCG&(}Gv?^UJl47+ zCdis{+OJG$!}Apij$$Lqjf9e4jNx{e_XTk>0+#Pl9taZPNclVV+rTFh7&6!NG6QDs zZa+_i-}j@@B}mQGHsgVu*w2+OOw38+FPPoMju*P(EJSY|)I1~7(6%qe+YSZ1^NcZi zX}7O*DpD>QFRYGU$F;si+PW5s8q9-A_TObvgclR9W%fr#U~D;9ONha?J>zG5=zLx< z+LDUbGS@)3@LHf$78%L=80_ZOb{r{!rWR7qEln&zahl^t6{Vn2HRl%gQZuFlYM6XB ziuFsrtVS=SAG2^GkMyUz6^S!-NX}dpl%IX<2JQM?vC)s-o#mOiwT?Vjqv03c&6kK6 z=9i@2i6mtZYJb1;y>uQ{@@q3C1mU!VJ~fcR_mP7UA&Wk*O#d9p&~{q2`d=(jX0$sE zT~UFU#P!WD-`uIbGNz(=t+12kS(^+_Qazu$-&T3xY`HzTc+I9FbA7UrUR ziy!h!pGG^B6>jeY1spDpye5!_9m(_rEM$KSRIj)uFmDSPosr0tq~c1J+j@&@(Aq^QqeT~zz$GiP)Z$(m}lWwy%eSYqI^R||tO8>;LTv3PgN!(LP;O0V7uiF8z4}S6q1xDBTk$0;Q6BlV`zw|=$)Kf;7-Br*++X?4a;qW`)IKqRfIu7;btFykB3?ku-UV(X!dQ^=4$kTcM z!_N#wjR-}ThGigJbqF%7^9$iS@Q~FA!z;ZS2rItNboMH~vOFQr+?sjLS8{J>94*Px zelo^_hlm)t`F>-=$WWW-l6bH{3SXPenYkG0&tHv~1}+~1(;k5XkuCRM^bggT!_ysF zZ?+ft6(?X>L0&8r5i$gT*MJ|igw<~i%GjL+^_d1aw=<1|gw$LxE+oMh08Te>!0xM{< zB7|vVP&Q1&d<=ho?6l}WLC&2XxY6g!U&BM{gKvClewSi)PHyTE_BV$a50$5n7MpX^{lT@X38i?(e+8b0nwZi581tPajd^8i{Li zv8xfH1ZjkQo z7`nT=yBmg>*`q!_-}mnQZh!Ctk7Jm7t#z-p&bZF&AtKnq8=GVebBRBNAN0WjT+70@ zyJ_R(rGWcY6z8xRd!_nN>#S=AQ%ubO_}p8NB=1MDXse4+|1_aUW5Low^0;lU)dU(R zJ#yn={>dQ2&2RjGO^{9kuG{G@Y-Gss-tE0#LN%V)-tlp;SQq%RhJu7U9=j~WUB=rWFha3w zg-}*XoSk0!eRk*FQ}Z-kM}!!0)Dqj*j#7qf-GgtsX&Mc4-nig);^}%=)~#0rPR8Sx zrBTrn@(@-z~j(C{7KZo;W^m6DEOlwp>G-KAlB)+*j0^(ZpUeSTbD{ugj>)J*kdR z7?Kd!yWnVDQlb&KrlrYn41sEypG{fRp>y@p<1Uds+ZOgo84gad5r4*2F#N32Vm37l z4QENz^pq`ebuyRy=!TLb`$#eETrNO&rcz_G`PstdiLTs;$^vM7s!Mz17dU^%-n$Ep zJC7iEtJA<3Z2t8br_x)+;qfDmxBZfh)3ZwL!NV%1jsstN)rdUD>{Ul!ADm4&{_-U? zy*ANP{;(;i#`I!(Wd*W=(E<=p`WW;&h6PwE=tso;CueM2pS-XhpHp8M{LBs-%`n(x z`dHwa)2&0nHx#JQ3In}%+!qtUCoBY@sBr~-5p^ye?fK$v<7up*zNOefxuGaj_qDf> z)H7wr&Q`X2B)?VV{vyu!S#<(lo%4nSYZ^q$+xDT%yYBct|NME*}^1|9rG`q1@pUAvx(t0z8Lhwt8HF1JZWKr@@D z9N9A}e~~3$9-2Sd*&`^*_qm_DGUA+YC|;Ks#F>zDxW$2HJyOkpv8>|}JH z>R2eBryEWz`si{#Bz2%dRLU1s4WQr3ywC`6H31s&jX}CjZ)BkBp*~Dg$$;wG0-1Zr z%LlpA+@?6p3Bd3p^pHZZiwj0~>@h1K?E)Y4R{$vJ8BsCm$XLi?-^65WB>_A=&Sagj zu%oHQ|3JmYpe36zW3e zFuSyeNFDF`iDpR6XYgMJT+A|QtpHLP`Vm7R|Dm)A9g(2*CMODU zaNoYR%%ii{lYui~d)pXG+hq;K%`k<@*kc$O2Jozr)}+nAp+456C92KDqv#Sp%fS(CACXWuQNQqY;#+F_1?+Iwto?+kg zTt*oJ*OZ40Qi+%7DJSF!avV4WN)k{#ui|GYPz* zaZxGv%U!oAFXPE`5x?Elqg%@Zbs7S~FW;tVauRl(%WH1jYfAvS#zdXNBBfWaptAfaN=P_(YKyRDM>mZHpK#)3(@SMbTZMxJB)NY8{zT0SqT$3F{yNxK)+Wwh}$ ziRzOSl+g%UsM^Yaw3YmQi$FZ;i|wBv!hyfG5ibp6>|R~%tz|WzD1$}gj);^ilMP{i zQ+;5++YoMae$TL9p7YgfPmAyQV38aB%c*yI)Y#I+kytTj3Z#KYc)gN z6Io|v&17H|cu*;BsoXzCp*4-mbq2xlXH9ky9?2KFo5BNu!>5E+<+SNJep7H;%9rJ= zBrbyqRg28}8=@_DM4lKYblQ`G;2tsGT3~TrQAO$&Q*(ylxRw{wJ?UC{v*D`*it;vi;c)|nkcWR0r|NQ)Ny_?X} z26OUNcIOQZhqSg}EM_-3A7srX` z@3{vnUK_6@zpa%8e1gw=v$-a|*Q5BH(OFy&Ahq37VR@p`X-}pE5$>LC$QQkU&*;t_ zO{@a{)*AXz@#x38|C{uJDS_Tg4G|+eci*sNBeLe)BGhc-J0ziXr}8;UIvbX0GxwIf zrr>~(TI-G1<@q!V9{QX;;k`n;jNIdU;VG*}cPRr;`luV3pA&y8))2A3$RYhYx$?*Q z`q%{kgiBG1h=^Hq|xKZFxQc|#>!&IpKk3EI6WYxi~YSCY{s|m{75CCjwjBC-rZT7-!GTT zCXBW0&2`t#Y(OA}=(<(^VTYkkr$qX$>?V>?>zB|O=q{^MEI-+$E$h8{NH`R1EUH6t zv;vv?;N^*j$kRNzI)-I%TjlZ~c-u!%dFkPkRQ>Y2AAFyf+c5|Fst;u& zvn*Yew5_;@)jmA7Sn>GGXw{&D`xt=B3idq4X&VXkHP_o4Q7lI#U%z-P$TPA#XxG4| zUG40lz3IK>wRfRCD-G%RCRpnQf^+pv@q{&8G2yNj)1df)#!6)=Rz@Oyn*_!!#eswKsA8vi+0cg zu0&S3h5|Fkojc|z)R)3$uGH7A3kkoh4&A)uq@m*#RKtVyhlB#&S@Z!1>Q2i(Y35+cB+@kgM^rbW}OVxWU zbWrL^@AaiP*N8Dwk-_gN2pW2QN6_upAw6{9#X`f=)H*^F#!zVm@!JqFrmGW-MY?JN zSGXNJyw+%Y!@8D$g_m(D z;OI-0ilwZe39{jOyR%x>YIJv4`^dWg%j8WrI~^2A^k&^0H^%yYV2BrT&#t(& z{wC=fN=i^>t7pn$O|-a~1&s;!ld9(-J-3yf_KCQjZ zksW_NPHdru!<8eOB6VAMUKxGsJ!kEiX`R@r8;;iP#aopVe%a|Bp{Evd^b~@fF;crL z)RGnZR76JAAVmItS%NXcqd83HVhK5ZEMmY@3<}&_B_%b^%$u=}FhJBw1C4YVCgN{4 zWhP=YmzZ7xKVd4ESd%?RhXMm&S(-V@kqBfo;jLbC)#a5*Zgrv%xUJ z6xVR6Ph0yw&5qQRhEPfX@+=es=ER`XS`yDv&wS3@p zw!amR=B8#VywGmxd&ma713nRS%;odlEnUw>q1WQCQ6|KnwCUt#;pa^_=*Ti!nSq-s z$XspfyyV_zqaZeRPh>tJzUyw($0433(cgox6XoLa5|>1A$KyMpu7y)B!a1_(5c%o3;*r~T1&io2}(OMDvwH#)W;qAAMjEqka-xb6U^Ec~%(KB*7A|bt- z_lY3@@*C*9R2I96j)}beGO?qtGAJE_Tw-_y2i$kb_;RkCG|_gr=o=KIC+>;*+w z!B}_%K(7zTqV(y1U@`^-CfjBC3ThB)X;)H))l!+4bu5k~B$J`X8B}omi>G_brk!iQ)A-kWr5$-TByYZ!Wcl3p+u-&! z0y2TQt|~Gw87C%$_hcEr;^9v7C>StcWEj6HUUcxZL15q_(OcN1B0K`FZ*BS3t0G$= z>|!@@-ODD8J(-Wi-)FJ!bVT9{Rc(r-m=JTQ9gVBUkzL4(BQNyg<%eH?i683VMcdZN zh_jD638*r=y!^z)dY)Nl0|$#_CUKfYlsW`EZDlZ;x4wADc(_1qrcK-lkX%6zEmF7F z9rL+1U-Nr7Wi8lQ3BHvk6i1E#oM?NAKr)OQf0m0}iLzD*cJvlwFz}yv?ZMgqCq`CZ zgXCuICd4=1$4Nf>{1>2FWFheXA~en1zX&by!&%sGUs1!HkzZxY{Hj>9i4zsiK%lwo z>XZ9oxfFg|;P^5Vz3$$~H_nVpsgWaZ7hjm-wHH6t`0QxG%@zv=QbBNPby=*W0b?7F zQEDKKA4hOc2l?~F(L-H)a0|{K%JnGP2hR959@$q7+WYKn--Z*flTWK?A}IjfM7 zOq?_7y`VWG&Qm1U+E~on_FBR8)*lM`Fy4wb z<8YLEQTkN%+UTtVJ5Gp|^YuGnwIs%MbkGvbywZdZ`r{t``Ldrk zG&k!iXHJY6{<^VyvcB(PNSV}3%Vj$*>J{H=B-cz0ByBHgrGr+dG9q#L(ql6lyZ-k1 zK;?>xdG#qA5OdRiMfOj_CP*z!xD}c#nEl|VR@+T2dhquTJ1k3Wk0kQ&NmSN!t{Y(+ z9-nDR0lZ??oD`wqwS>7E{2e z$dt_jaD3LA0U@`9s-f%{eB7p{#{=)l$q5XD>OVn+!77nb6r%jG*$Kl$yW>j6({1u! ze?V7-MN>Eq>0zCBt;tjjIV4Nt6O-sDky8ywpTe$K2aIhL(yW-6m9iALWrx!LlPp3V z8~RZroo@4hKlJp#GSP(tE5;_Pkg&E%+7x8D`htuE5}RtA6}xtHhgo9DlBcaGhJM$( z<|h8z&kh-Kh=DNTrE)!Ym)mZY_2wB_a(mvmES~s-C-zx@O14|8*a7c8tLROz-etrF z`GFV6v-9S8*_+P+*B|$G<%c6Z{6=ZWmfs|AqyuPj% z53Wa?iF-gwuKymv)sU$ri^sg#fce!2<57jt)ExIF!!;akaHkcg(U0CE4XTUJI3SPN zH~m(aa^{!!`-+us zlJJJ)CWDgiMmF%$y^C>Jk6AKhH=lgYlIpHs3_!v|5wWBw6P&GKh|zNzwY72dbMFjNO$47``H((HhOPhT@B4uz2wPZ0NUG|sIa22r zAF5pweI~}*q4NFjAiZGfRKrs2-R|;WzxcQ&{x`1#>$B+J$$?Dw-`@(Ni~i&Egt$(F zo2L{k#*Iba*gs6i5$Mt+8;EVayGkV5_jQabA|bkY95Dh_1lUF<`2AjXpF8i%b0IHc zDC;XY?{Gj$-S(Bp*9G($Ncpq^B@Xrby^34UI1zyu*Y37U(N9OSKJBwXPc5w9Td0-! z-G0`AhiBp$CI+-MtDeP)OOHfcKTo$w_kga^1Wp4kBDa0$RQWuyHPH~W@ z&t{nMkav-E$WjKpSe&gLv5CdE;w9el2SscYJtx$bkMf>}&i77`DaI9(C=TjcwW_6@ zY9D3M41lt(GL02A>8*hAWBD>B4^?kcpT({O0O+ArzaJ*hj#3pT{@QkRDx;pOugV}P zYOe1g-i6Ps(%z{zomN4iiczI#5+a%0=$&Vpn!5v-7mtfm7i&{pX;7jIcK48HlEIa9>@yk+m&rVe^kn@|8-kItxQ-k(bh7_H{OTUOf-xCI zXeR}48OFovKKA*;v~Yf9A1G=(3F)y_#aAO*tZ^haF{C=Mz$zhO^|c3xZ4i#fHx+jU zjcYb|Z~yUufxW3yc>ruu<_n=3#a)4nO8(Dczo!6FW$IoR2p-S>ti|aQdF@4>k&*G{ zI+ZP^Eg3l!uQj+|f(6NZXJhPsz-Rtgqkr1f^mFCKPh(4G!rDl)7vmeNg^0J3CX7yw z(&_j>lycb9z5U}iRpWYlMr7CdjU{{}l1;Vj+H3d&_j5n-7}@>!rLo>L-*n#{YOHEEv3m>eQKxiSZ==01B0)8n0bLoP^^R%2 zcdc@V)+!O~XZmeSd2d5|M$P|)NA@luWz!l%D8QQ)lDyWB`>6BDEh; zM67fxL&?Cm7ks2&f|@Xf*Ayy$4|#UwIgzmz+ji79V&t z_hgL$#jFe1y3S_5-3M?zxC-=9CFUZ$I5eLt9jJ-|A^P@iD2=c&7ATQ;#;AKTRjjf~ zB*2HqxA1T_;vFg}mzAT$z#Zx*#b zV1wHRO9Ij1o{+&khjz~cp3Auxfcna{mmM*Judt6>xl!m zW0IuqP4?KO^t?iY{s|m(L=5$ygE{mc1#1iCBTz_2WN~EnisNR8C9)GgKU`F+geRxzdo({vpW3TU<87m@tz%C*ZFDpf&6p7P zv=zOsR7a(&p@l{o-FYM$q9TQT;ED4=reRICJm`{+dW)na~DJ@u7)`-~o zp>9*Wkx_svi#8ni!&MUhi8>F>4EOG3;Bs9MqO~X9vjp7J;dEy!sOui?HnR=pjP;|j z)^2bc_6WgDI|2+rxlGGb&7(Gh|9?R#J}K)+g^Xl0IyL6IKEAamY0AKslZi;LB#4Q% z^E9zDNW9jg8xkh6wN6gpK`_&DVkM(oNJ3YJ{9F;i+1(>Gv-u47{{?a?QN8}RTR0VZ zyKnLPAK8BI2-K;eAA?iGWsk8HiIamTxt}B-;N&7Qio7dp5J2{Hcxn-ii2K z7FpL`-Q7f45)pzdlfhyPJ2?H8Cgumjdlq&uI2bvc?b9LF{-xm^-(MkpR;!|T2jHkz#+8z4EzJAYz^5vt+d;JB4`PX7B(W`(bN6OL4;gYBw`JFDuK_R z*d+guWPViazbn!HUKIXq#M((UxZY-}e}`!sGyBg4hb;7`pTipt7%xo(Ps^1j`{v3y zkcw^cV!Ql|D#UH!_jhr#!hh?ihA*jB#p z!pzxmvp4!PaOW#(^Qox-3Df&S``2Jh6P<$f&Xo1DuJc35^HA31d>;m4e`$U}h@D@s zUFmh;_mG>cTmmDlZ+M97V@g9qYrEQsiBO1D>mxGjMLwi7`ok#Ws+YHa1_Po1R878r zd&!u1$!L@wuwHsTwHB$9PAbH;|A^lWejUJs01mVin_qzM{{g+UF_m$J5&jbGj2%j6 zrk!SM!+?D7HB-32qrlv${!^RCM#hB;CcOueu9pAmS=WA>tsaz-)(?v>&QHb3FthSOO98(x z<&ccJ!NDM(#%jGNM2Evy3`pPWmFBCUXOF)lCK>DYdCGPm;+^m6>RmS4gW^a(+T&^tmqK9l{?9EMCwmO7%70Z2OU z&fYN|G+u>oB}pfs9-}`y_U222lYzeOcZYwlG2IHzj;?FJoMf0n`L zgg!FKTb%ln;Pi;Q>P=x}LHqOQCwTPU(9eN1MT{yJ|Fd+aYf#4Pc&}a2HIxI^>N^M5 zhP)UOAuh|~S7H1CcZg4((|hBt@JQg3(MO7GhHs0oMVc28jd;?^G}a58^0sern%KW( z!@Bgpz<5vhSk@P_V=Hc<;PsvmdZ~6UdbnnLX)%EfOf35%*Fjc+bz38{{U4wVZwRa` zMTUNCzl!*#%u)iz%LBu!LgK^6hhyGwY?xH(DU$5Az!Lzzh2bE2_sbBG$W6YxsgvrN zfGL8y7y!2iBp1vX=;zY)INR%Mz8-cV)HvvHK^L^AeY8ko5U0Bbn%(CHx?1z;<$u$G zNzqtG@ym@@1eVtuQ`$~`vOBE3`Lk0&U?LtT{|i)Td%o|wU4!6HOR>;V35bN#OS+n3 z283DzuwfWTN6-m^Z{K5Cuzj!3@T<0bJ85g#4c+@}Ph#;?*7p?*7ys)3@OK`J?YPX) zJ(O=7ye>RbckI#V;`r1v~jxdG+}Z?mT7ut851Oz3Cb7Ml~E;Tc0V#a{f@c`AXLl{(<})M1pn4C;#UQ z4y)Hw6ex`yzY$b=v(zNVj~D+$KJX{+wc)OW?3JJr@q+34!W}uv?_=#3rY%AtedYb4 z10DYNCtNVRhj3eeJ`56o`!@sCkL-VyHnzb1kDlo~wffX-5Tcs@PU_JOrlX^yMC0;< z5b;-#D$D`|OJKuD@1nVzQ~ddBN{*1)-RNH+03eRD!}PFZcXk+oVtA;D%u)Mb$;XxU zT86kGZ(wQeU)}-4Jt^{^O5=~&G!!U0ab)5?Rf3kZ0{xi^xeh1I4bKDncSZsPT84vWfRUIOZa5I_w@eSaaL zx42>aF2C&cKh;LLu-bXvJ|y>sd-r%JRW$Lq5KU+M# zM&Cv3OY?v-6yE%ioN^OrL(%g03c3pjg};kz45keDJWj|8QQBA>hXj=W)Y7o>cTM7* zp+y^w`L>ENc}P*qZ_Qy4{TIN8o5@s0f}HtVJ)~^yil$-RzwO9x!EeaOt`_QNs#fwG zhC<18%--^yS*T{f!-C20CAt{k8650irdImrL6%33KdB}ECD_!QIIyNpd>jh=W2EWQ z_g5m%vB1VpHMyw{XCw2@Tndt!J;}m<&|4fW@4|&ChXXZUjG>~N^JL}S5&1C(mWY-W zRkKP7MaeA&&#txd#t|UiuGolBV=P^gGx5@ZvxXhP@(i{?t?J>wJN>oHSN@DJrl=?` z-Tx(*F9z zb(-qvS-@tT+SW-iqM_N?AC>kW%Eu%lBmq%8yF0j_Oap2~vJ)D$7QJIjP`M@x7NJm* zpZ4!R(f64M+e)^n9UT3k3VxBILs93cBpyq>LC!_m-WAd4+7o}|2+Mg61usvEa?V!1Esg(2Zf)Ncx6GCrd~R%CV}#Xc=KKlsKcu=Sy*QouU&R5Q49U8wEr!6gsC-)`ATyu>*Q)Wkx({s^ICr*a$*7$NsA{M3-S-3Bcs%t+*xv z7M!?zHTepQg~rSg)y~)U&Zpz7nWbPc@YApd{)aUGqnP}y8A=QeE25!uX`eo z^_QyucKt+I_)xN%9M-^@-Z;OF1`KqAk^IGN7yYxh$fLPN`n5B$rPE!MuD)J#Eyh(? zKZ7XcnIlj79u4fA;7LUyM=pnKok_l3v2B&lkWzWB#ImL|54I<`@ZPkQ8L+ zs_-%6>*hLkdZ^l46urs7hvWNuM5k2Q=A@d1>3m5_X9MSB@}_Y#VLFtuviTSh1qF&; zbeo{?EWtJQ{$6Y-Zz`)N6{o_(u*kqP|iSWh?pqU2mdL z5Q&C0BZ7-N((Nmyg0NAviS)M0<1E34`wQjvWT={k&Z z-O)6SIH6Gdxc6%0&_AG#`2C#ugRs?LF}y~&v_*c?o|-fzfy#p5$Z23QX=l7g*I{C*}S?3fC6G+!}4IZfA720 ztXxRBrS{l1_%m~W$3RzpO?4ocryG=AxxE_V{Ej-D#l4X~>^(N4TfZJGs%G~>s-2qk z?N>f;&Tn4j-XaBUo15+@-x{EON-==0makl$$;zbhYFQH3cMQ!o-g57+ScB0s+{a=u zMxvg@0tZ!SOo7M)R%z!B952q16wJz|}yIJWaOzWQa-yTH%y z(Zb$422l%eYZQ^v`La30PU7z{3l<(thwiK99;#>*Ey5e*C`~Y()-x#`;(vv=lTA+P zm!^-l9|eIvlTAdnic5{KAKmdBxyoFo*N$qOxy>z}HQz2;R)08@Ft}> z(+U`f7QFlHp7_vG&1$^PoCC&eF0ULY`bSXc7B;a^SaslC^Vup6r){t{m)1{n-noyF zGa&>sg8L3+Wv}*x%+hP3rr3{WS34;a*%V+8@+kLDEqjvY74+@CgQ>SWaog0fu1K6e zTzI%rW4Omv0k;Z;Q@GA|V?XBYNJuR=*$8_%>D;L?g6MZSXM;LKOnl=#tOohMxYVn)dsb4`;UGtAZ}~6lDnmHwoom^X^(?fkKgG-C<7il1A96)~ZhxoM_-RpeIE^s3~lr)v)<*?f-{W?(f(IsA;phZD&onf~v&*OIHU z!MYz$mgzn;KFF%jg>723iK~}cc*!5G{aCPR-BN`a1d=;g^WxQi^fUFO{Sdg+lOQ>V zk*2xe)p{p~?alPs`GtZy30oKmlXTIZZe#`WYyIhd(5rffPnyXiJ-$ckXs!^)xF|m0 zj%ZHj`fy8Vls~`f*@_7(=j!IJRc-mvwFRIn`8|u*kk1vhoFtFY)D%|K!R0!os}H(b zjmsD&ACaMw;z>c;6$j%3>V9u(=52#0d8D;c;+m4!R(-=mxe}qE??tEtnYeK1%U|yg z)ua4OMraRa(uwQOQc9JJpy>r}5ntS7Mkj9wN{h0Flbk?nS7 z!!^TCF+#LSbtzKyIKV41S%)N65wlX()CZ2#>g-Ou+ev!9ry-{F4A$tjwxtFy5k+sH z$qQcVj#BY--XPYb(Q8j{C>vz%!Gm1J*c{KH?r|H&dqB^nEyL{7htv$o)64$KDt5Gb zPfqzcCMu@;NmDCa<~13^PCHg$*7mg455L26!j`~@3{b6Ci8-?!woQF&J5F_it+@3_ z=D=1WD|J}Km?4#D7D$5Ec+?miDtBwii(7Gy@!i><(O%cOlsgpR#4URjSho-llBK=V@I49NXhnWsH&6;cqcbNWJUX8&0qfdE zWeI?44v=_I4i;Am^CmiN_2mQ~5OyjMx>z5(OCd=bPA)%hCuY7U4~EZ@H(PmN^d3M& zWdq|2>`g=@c@zBT=}`77Z;)#9#}Uw8shknCCJkGAWLxVEnH{YcZ%Nd4oE!aoy5k}t z2z_1`6*w01&aNkdHucu@Aw8{&*xshM^>k1+1jjb-TxW0wLM3%6x%e8y1OufVhpFso zfCxYtpPH(<$XH8koo~N(<5vhu{9RNyX{Mgru3A6n-WuEpn#kggo^i8wRawC6Rv{b7 zG4P7<>2|e+6dDb>XucyP747-f^JQ47T65C=HWIq5a3yH^ z1V2Doz$;;3ZFwx2&UApbFq37EX#(f!Bh6w4wmT}^HbJG<=Y9%ynxqhZud&s`<^T!1 zxY6V1W1%=tR$KYZwu{2aHVGN)4co&nMusSq^+ee<(j+fW$VD2Hfg;*qzQK#7^Cv7* z_BW0^QNz>KR+{dKo0M)-9rD0y+8yA;H`%p>i?P+==s;2}@i7YK4Hj3W?7#Rnh zM$C%p-B}&<*yvMmIrx&B&}J>?6+voA?Ki259^?{^&GyJ3QWwKcIjsoK(M5ZaWt!P3 z_Zxk)KBjOl=lGY6U-#GzI~Xw60~4}Qejm242B(`0Rw*3kJbH=l-c=~VEy6gNtcR+) z0Ncfe)jZ>wD7|^;hz`y>+}zfbh2I_2X*j@=Xyp(*#j5LQ>o|GPQ2#;IsyzJ z)5dQ~hP95kfdC;;nxW9{n~?+)djFhb`;^R3W7UsYfX@jtFEK3T0qulg&hq_HoG0Dr zN%Ka$W2_|5#Hh^n{ggirS5pN!D|A@4bFQbc@PqB9(Y3>76R- z&LQSWdFr-rz(6W@IC+S>9UEJ?WPXJ0wui~ghM0sM>+%{O=1FnR29eg{P zPZgF=x?XXHi=!t--&0$`y4xLEZ%sV%eUp7RBxk9u{!)&LBFz#Z)R=pY$TI z_ggh8thUZI7^f9EPKMu-L>e>aX*@8e3_Gu+$wjXnKpU!ytbl12NaXPA(+dqDU3&{i zeTbTwJyg7#%9DndTh$XIv9^muMO$w#&JK&+!)29k$+ISAA2cU_HWts`^eYcD96sF1 zhp&l6=^7)(9xGOD*LQ0ri!sh}Xsm8d7agR&q+N38Nj9*aMW}O>kzKbz{p`iF@sl#| z{`8Z2mH9}ddd$A9Ip>*8aPfl0V&GN1k$H#@6T(oplhU8-WM<)5)Q6#wpK4XzvzZ-< z?qLp!id^>#t5+|-v?L89FZioSpS7ruy{wNPE#Pfw5zO+q0VUw6Pi8*Opjr|=UDQiJ zT4qe-U@O1P?i&~j;|dwR8z|rZxH9;*xCP!TeOCDk+kSdwDy_>(=H_KikBc7o7Na6q(Hr4IGUm|A4_fv;we+BM%5O57y% zJWerOB!7)i*=!sBJpY}xx&o_L4acLql8qsI18_@_z7QxX(zy9F*$z^klojeLZ+g;5 zeOk6$gs{ZSjbtkJ6nNOHN zgbt-Lrvo5TeM2IEGHv3W{>DrQyN;b|nr>8;%dKd__-z>4wZ)ErB6ts%k0)|z;<4eu z#)a7rGFJ+d<=b1+K)e<@@|tkjiSl|=?Y%1}*aZ7DmtFsG7f$X?J=2CGZq(8Yi#{fw zm=D?8_je8W-1BzV3BBeJgmXYopgzmXZPnGBenc2=DNry8ISr3oL)$2 zKd#&=7^GXj<8u7u{vr9;DEF3TFm5m5$4&W9FMKX9Z$FBYUsSc7vN`#U79mJNnM|Pke)wP);R#OV_A$%+JD{^AY-ni-Mk+24U)TN!{;p&Y;i=k)PP=DsH}k$NgC+eA+g~o-DfHxV>cVR<=TzIL zN)TuPoxi+Qva}diaWQo7j?3EDi<7od94F@Le627WPM!CW`NzuAmKn}ZCctRI#t`;- z@KBmfxW4f;u0=S2f#UWk;{GwQ5(#XJ#}*suWDhMa*CW=FA*W)c3-f_{wxU@Z z_v-z_S7spQqnA|oy_R;L&0f)&%jL=k+C%BIxqxL={;ETi&FeOoA2*1dj+$I}6fbBr zZq35@Sif&CQnJTWprw@6Qo*7_G(k#X58S z5+%NjqgR?)X?3tntc(S~Qsa$vlPv>4J|ZDihx6)un6Zs_SC@NJACo)eO*S{pah1(z zh;!9NE*j?M%jubtS=zrd=;N5m!t3_jet}Yd?ema&Me8L|C^j7& zI@@?KG>P!nTw&2&>J-)EodZt&7AH5Zr~|tF)m4NboWzgyv+$MvaEZJi#7(8qwZV&@ zh-ppSF*RUJcBxLNUl7>m6BeYr*>=w-S5(Gr!TH|w@&Vu!cS1%yVH0?rkw}(ud+Eo( z7Z(7;_u~Tr$V!_DF9%>&g{=Zk-AvLFULsKX7MiFv&P?11mX zwSCu8E(eh}>{OSUm|Dl=Tn`SNciwV~&nJI=A4C@Y`TYvzj;wbj*B79PZ;5%!xMFA1 z&Y4SFHfp#E_I$ldyujFk-Hsfg!Cu7rX$oVdu!v53Ru~*?7K+b{aXtOLZ`tK$>W%3H{AsW7=mY~$ic0WpL2?l9YoH#y zPzn_J1tgIw>8PHh%Pl@tf3;$~PcdMZ@OH#4&GYVA5ays+_0qqB?Vs(lcj&|P07^4HW= zC0fF#z-MP6wlyQi!@CdCRC#I?ys)<8TFa57wIcdOXHMBypjMwyCESNb$a{uch>)bS{JGoVI;FV!e6 zY@AiG^Jpu&7^N^unlTR!75juq=VgCGxvICf*s7Ekt$+JkP`b_D-$SA%tNHp*^IDD# z!!Xk(hK2+4M@L)=f2aDI4Yrp_NjQ$hYdqlKh)XPZR-E_FcM#NvuAr|in4w}_Lgs7? z$t(Q()-5Ey{%}%?9jw%WWLg~(VE>a1Y$_c`tM|+iD+)eM3wlo`kECvy5?!nsepUbjD0aCrOYcZwX&mx0*=4osHAWv@lgM8WrfZ$-`~ z_~&2w<%8|4e$enM>}^Q~Q?r^I()X<1d@CyQ_q7i;)9V^=R04fugb1Hs=WoXiHp{(w zAGz=c#gRabp^xa`UmKqiuegcDNHQ07ZS^!d0B!3sRr-yRF^(c$zjV zqAmK;MHN&_J%ne?bST)+ehg}|m#+SfsJCX5eX4 zZ?qY>F(nY%U9<&Dwf6Y9u@n6@U3K@WH5@a;4gFP>hoYgOsW@$jC07Rk3chiPiBV|N zI|4!m=O`yqI&h~%CJ@OuW@;eHNP zl!J0h>1Gt49d6-$V#oA_TZ-35)URTP;k67&W$C-xw$B+ATxaQE#`iTuM`P;#nh|xP z#HYTBU&Xee-uz!`LtYt$=nHNV|zDzdP*BH=o;#K^f+=UF8DSm>f7l8KaOjP1OW zVE?!Q(;+POOf063zdTXZvG$JF2~*5#JsC73+M<+k?S(GUS3UeZ zeV|cSpnM?<#uIiuf)t>>cT9SoVUMc1Gr!xn`F?L_wB@KSe^y;`sV#RWp%&SS!Pt0hVIhgOCdCT~Q>-?-!nT{qMFGIpOuyju)^Wirt70MBoj3x64EuSo z9nJk}d2K!~`I5eYA(~^Y$3sFN(ux>haZAfhT;MXn6S39h;}_R?76bEjHU&40mm>wJ7=v892yA zA#9e3TRZcAhhc^}rZdw8J(-bj`+KBv+TB$){Hr?YYo;tTK zAEX(#S+?+e=^vfrC0(^_0!(k$u#Wf(c|=ls`@q)FTihP5ksI^l0v zhU7+z#Bh+Rp#d>vB-#QRJQf0@z7|zEXk7_r6<(5{AAJ?k)d=Hn^I%Kaw!=DLQMB$2 zZ6@H`BqVlpHtb5X@< zUc;`97(`2DCa3ZUnriME-gb1b!WR)vx_bIs`zlz5P@2kP|A`g+?iGEumpzV;O=c$k zSJqiA?G8S*#p!oQ%i+QNljf+levnbM_5m@6i?6Q&tJ>ha|Ht~jfgw12$;Y!_3z5lr zkBUlDM~8FEmt|H|KnOP36emZu$*jflp|rdSB$hJDhZqAOJIYKd^u+B^z+F`Jp8m<1 z5nr`k%vCbY_?DAqlTo>*z=i=SrJo5?Oj`q2_lgh^0(%oZs_^ zY6SA0cA*>Ft7KyLE5Z0T?o_;lKiooWpSvf(X0Ki)YwZ^WcLG9>?17X+`+aW-0^D`H zW6n)e_ScoHzn?dl>zYm=Z5~?CyFg=kmbSIX0GCMzzCSK3`F6SO>n_}mVOeL?F?gZL zj4-qd&h9W9hN^Lw<4LCm9(KZ`O|-mR+V4=NamG6-)bz+hI2(1pD@7YY8vIdg*NT{S>H8!&rq_xif#N9o?RKx zUpV|qRSXlj=8Y)+UfA2;Q@fm{GOm^-TKJ;1^1vRmF#CqAcyvnGGh|Pd1@wShgdEu#PcK9x?d)9f&H>Rl*0Gg@(@owsD6b9TR<`rE%W+n=G~vRt3p zc{+rj9@hkTNN|+j_x|N=#N`=?=ySH=fAEe4c#V6ZiGrFD7jA9^u0d;<%B#=P3&_Li z=A-SOV_VE3YZ{*({w2XTXJk{_BqPs7Wo}Kl%-g){pf459NICiu{a~c0*NfI^oNT3d}d)%4UA=}>` zSfphO^?1zw!GwNIe3S= z?*6qd6*E$`LJLC#ooqq{E{Rjr_ZAR(@$wZcSYCgwjsc$tH87&t;vH(bQ?oXx{%Pa6 z=q<<~T%X2?;dD>A=d%#q@yQcHF!mORZxzwnT|TzSsC4iZ9V;T=eQ|TMTZVE$rqD}r zXz7Gp6V;fjF@GrFGJe(Xhd5MC`>W-IAl>nKdbIwAayulc0`!6^0W`*=0J*2|blhd# zn4Z}shYL8s{||8?Q|o)YD|?>m3#UAq(2w9!YC1nl7 zuNb+XC9he6%|o$)EdF^iDT;&jE2c?MIjS{s%`Q{9fV*LW787&9g}Kd2zaNnY=ma}V zQf$zQ9=&FEsQQ12Ric(cZyX1m`b4IWC&<5ENW7>4saV%%!rv4&ecZujG_JMTSv)Kw^J^rh$1Sr@klwp(0w^rkxLnhwm>ze-oh;u9T}cz6K(LtF~xS-wWo5NWhK zuieK}&r1f5{oYA1%Z0y{lqFhm4N5|;P+|NHMIDncHPQse4Dhfu*(2wl$r{tPBbxM0uuXC75xCE9%wErl{cA7 z!a=p^>IXaOzfN;n3g4R8IU2ZMkmvWUt@C#bAy}#?h3f$NI%FWNGlEB?Z1_VCwC0Hc2s@~0xVU+_-{CE$;K z9@ep67-IZQhQ?$+(4LmpGKtNX8V{>go@58jcp@vs0%*yEJX4-u;*b6Y`n!kXgI}JG z74HtExAUO=_B~>-Qk|x;W{SneP8q`zgcBjAbjW3`wH{1cEky?rXhK#c<-ko0qn;p( zMyg!ipbD<}>I2S^%Fl4M3cWmL=DwrDxr?@6E4d4qbvA>4mk@m8A;TI9J>&6^d@B;^ zb}ryVCw>lq4%@Y{E4Dr7oh#Fyafc4RSPlp@I)EpkGL$|ogJXwD_0n7p)SG7!Qafx* z)oH+EM;1%-t2ie~{`CVd)ePfDsWuJaMs=8)0FotWQefXQNc~sc7)x{JD0t~Mqds$l z0e#@-sdXGZ9&=HhTchodt_zOuZ%;TXMSRax)gn7%?ih1K*3_Y{0b5bGGE6wYayM2x zySe-C?5rvbHH2P{htbXKmaEiCY0XS*y%8$<+JAbEnu5>xJXBCEl_G-gNaJ@Y0DEVt zh(B--HAW2Z3L1rFnIJ-`vu&*1-CsnVMM+a;D}_(b)t*TooRlH|khdk9%sOw#{S
I+M7TnYg*;R1m)mRSLg-afM&- zR!jsCSNb*PUXGej(G=_KUKy(}@jtYfv|6|j!WgW6k=)gJ_(UAI{-v{LZRS9yF~JUg z<>VH=UaRe}@~$|)+gSZ?T6%9Fj0mLQxW(z7Hz70MZ$A^p z?7upb`8>IXye+ddJ0_l95U`naWn^6c+fZvI>0}BDvPX4cimN;DnybsG^B#>!mRCEH z2$ZzX*-tw|Vy`O!cm9C^fGwE*PBNWG=xVuAg^ZAh^YdrsbAiY~u_w)fwpA}dg$vTy zpB`fmWFFmbl>+}*BX!u$|7l@1ly-4A2!vjlv7~5%HkpNODks8+as>v`wp*<_Sp3rY z)``A()&Ck~8cs@Lzf6`m%0t&28779d=c%G)TZ1EOFdqtfq6dafz}XVG1Z`AzU{FQQeBmWLNNGr@bRZx2FH`uWgmRx3?+WUzbmmOy+7{mG0&!>XQY( zSVG(#V?@i016XYv%3g9MH}npoE`N0i*^3dpU-@EYeB(IFfM~**Rd%B+V7jY5v(=+K z`Iug~Uhx%nUDR{?>AhxMsn(ottL!8+0rRy>deW;=w=WIflPq?Q*J9?r4Y4?3n*g8M z2CD6#lBI~6=8AEl{PjATQ30e=tLdY?*>UWz(;_tFj7N4!09mow$cGt!cL|$4qb71n zT=NqE3aZomi(4QRi(2Nzk&!PoQ9)8*4jh*5@KG(p9C|8uTLPH05pSL;Goyv5bxHwv zP`F0~Lo~}H7E`wCs^Xc?WhH9;$T%lNUX3rSrloo)4ZI8!5Zad+_ANdZCoSC>{y=L| zn$=+Fb3u}<(CRG?@_B?^DMr9|i(MbU2ts4hiAp!CcDKUk&Z*=OVg3t|1zRSL$(G{rza>5Xh@jw1gWK5hPieJjs_@{UIaOWfp;JS?y~5>>ouEk{>eu(7zsmN`Mo)_5lv1frVBcmvuCmGi zZ7XUQw|5~kBi~Q~1ghpzngg)`d1R!>R@xgz=o5~r7eNRH8m(0Ms=4H5Ock>S;hTwG z7}c_4!_M8ke;tqia~5u zojiyu-7VS$<|um%+5&;8_%Dc`Ee~Nxe0GW)Z@X5~ZLsEY(N?Y_329bMhAmbLZ>O%< z4|wgZ6~7vu%v&7&&&H>tQP&n;X_P#~u!TDJwm$amPnI(%kFvSqN$aP*x#q)bcTen) zh)O10hF#BQM2ju-fI*c1W!`^9ecD9?O_ghlm)pvFaLO+?3o40lLG8ZJn1z^K;F;?R ziyB!`U(+jTOKs`F^<$C8yPnANbG-BMLMWfH_LbjlQUKYFd$G3}M}rvP){#;@M)jSd^_kX z0?yt!iBMp~-Br$|xstfG!C_n$SuOYhLjJ+bQMykLLq#a6P+R7s%ndw)oA30WAn zdaCttItMZqnot8rIK6N$+hg8JD2;5dtq(v!93K1_4x z3Upk|DXBLaLOl!4VGwEFfwF%vT+%gXXfSI0-wKR1v&7XvTEPQMI*jvfN>1E|aZ-%Z zKfGmk7oa<)F%hm_V*-x6Db?m`R(jv@PVWU0Tk8H^=ijpR&>L_WO!&I)KHG~+Oymy; v(a?zH)V#iTUDE_pl>evVh+X#kdWOrkiKUwOU6pygijSwMs;5$~WE1^A1DQmn literal 0 HcmV?d00001 diff --git a/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/CMakeLists.txt new file mode 100644 index 0000000000000..c5dad6896dde4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/CMakeLists.txt @@ -0,0 +1,19 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + _test_main.cpp + rectrace.cpp + select_signals.cpp + stacktrace.cpp + suicide.cpp + test.cpp +) + +set(HEADERS + test.hpp +) + +if(SOURCES OR HEADERS) + devkit_add_object(devkit_third_party_backward-cpp_test) +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/_test_main.cpp b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/_test_main.cpp new file mode 100644 index 0000000000000..68211e030fd29 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/_test_main.cpp @@ -0,0 +1,241 @@ +/* + * _test_main.cpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "test.hpp" +#include +#include + +#ifdef _WIN32 +#include +#define strcasecmp _stricmp +#else +#include +#include +#endif + +#if defined(__has_include) && __has_include() +#include +#else +#include + +#ifdef _WIN32 +char argv0[MAX_PATH]; +inline const char *getprogname() { + return GetModuleFileName(NULL, argv0, sizeof(argv0)) ? argv0 : NULL; +} +#elif !defined(__APPLE__) +// N.B. getprogname() is an Apple/BSD-ism. +// program_invocation_name is a GLIBC-ism, but it's also +// supported by libmusl. +#define getprogname() program_invocation_name +#endif + +void error(int status, int errnum, const char *format, ...) { + fflush(stdout); + fprintf(stderr, "%s: ", getprogname()); + + va_list args; + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + + if (errnum != 0) { + fprintf(stderr, ": %s\n", strerror(errnum)); + } else { + fprintf(stderr, "\n"); + } + if (status != 0) { + exit(status); + } +} +#endif + +using namespace test; + +bool run_test(TestBase &test, bool use_child_process = true) { + if (!use_child_process) { + exit(static_cast(test.run())); + } + + printf("-- running test case: %s\n", test.name); + + fflush(stdout); + + test::TestStatus status = test::SUCCESS; + +#ifdef _WIN32 + char filename[256]; + GetModuleFileName(NULL, filename, 256); // TODO: check for error + std::string cmd_line = filename; + cmd_line += " --nofork "; + cmd_line += test.name; + + STARTUPINFO si; + PROCESS_INFORMATION pi; + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + if (!CreateProcessA(nullptr, const_cast(cmd_line.c_str()), nullptr, + nullptr, FALSE, 0, nullptr, nullptr, &si, &pi)) { + printf("unable to create process\n"); + exit(-1); + } + + WaitForSingleObject(pi.hProcess, INFINITE); + + DWORD exit_code; + GetExitCodeProcess(pi.hProcess, &exit_code); + switch (exit_code) { + case 3: + status = test::SIGNAL_ABORT; + break; + case 5: + status = test::EXCEPTION_UNCAUGHT; + break; + case EXCEPTION_ACCESS_VIOLATION: + status = test::SIGNAL_SEGFAULT; + break; + case EXCEPTION_STACK_OVERFLOW: + status = test::SIGNAL_SEGFAULT; + break; + case EXCEPTION_INT_DIVIDE_BY_ZERO: + status = test::SIGNAL_DIVZERO; + break; + } + printf("Exit code: %lu\n", exit_code); + + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + + if (test.expected_status == test::ASSERT_FAIL) { + // assert calls abort on windows + return (status & test::SIGNAL_ABORT); + } + +#else + + pid_t child_pid = fork(); + if (child_pid == 0) { + exit(static_cast(test.run())); + } + if (child_pid == -1) { + error(EXIT_FAILURE, 0, "unable to fork"); + } + + int child_status = 0; + waitpid(child_pid, &child_status, 0); + + if (WIFEXITED(child_status)) { + int exit_status = WEXITSTATUS(child_status); + if (exit_status & ~test::STATUS_MASK) { + status = test::FAILED; + } else { + status = static_cast(exit_status); + } + } else if (WIFSIGNALED(child_status)) { + const int signum = WTERMSIG(child_status); + printf("!! signal (%d) %s\n", signum, strsignal(signum)); + switch (signum) { + case SIGABRT: + status = test::SIGNAL_ABORT; + break; + case SIGSEGV: + case SIGBUS: + status = test::SIGNAL_SEGFAULT; + break; + case SIGFPE: + status = test::SIGNAL_DIVZERO; + break; + default: + status = test::SIGNAL_UNCAUGHT; + } + } + +#endif + + if (test.expected_status == test::FAILED) { + return (status & test::FAILED); + } + + if (test.expected_status == test::SIGNAL_UNCAUGHT) { + return (status & test::SIGNAL_UNCAUGHT); + } + + return status == test.expected_status; +} + +int main(int argc, const char *const argv[]) { + +#ifdef _WIN32 + _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT); +#endif + + if (argc == 3 && strcmp("--nofork", argv[1]) == 0) { + // Windows has no fork, so we simulate it + // we only execute one test, without forking + for (test_registry_t::iterator it = test_registry().begin(); + it != test_registry().end(); ++it) { + TestBase &test = **it; + if (strcasecmp(argv[2], test.name) == 0) { + run_test(test, false); + + return 0; + } + } + return -1; + } + + size_t success_cnt = 0; + size_t total_cnt = 0; + for (test_registry_t::iterator it = test_registry().begin(); + it != test_registry().end(); ++it) { + TestBase &test = **it; + + bool consider_test = (argc <= 1); + for (int i = 1; i < argc; ++i) { + if (strcasecmp(argv[i], test.name) == 0) { + consider_test = true; + break; + } + } + if (!consider_test) { + continue; + } + + total_cnt += 1; + if (run_test(test)) { + printf("-- test case success: %s\n", test.name); + success_cnt += 1; + } else { + printf("** test case FAILED : %s\n", test.name); + } + } + printf("-- tests passing: %zu/%zu", success_cnt, total_cnt); + if (total_cnt) { + printf(" (%zu%%)\n", success_cnt * 100 / total_cnt); + } else { + printf("\n"); + } + return (success_cnt == total_cnt) ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/rectrace.cpp b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/rectrace.cpp new file mode 100644 index 0000000000000..10a38f475a029 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/rectrace.cpp @@ -0,0 +1,98 @@ +/* + * test/rectrace.cpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "backward.hpp" +#include "test/test.hpp" +#include + +using namespace backward; + +typedef StackTrace stacktrace_t; + +void end_of_our_journey(stacktrace_t &st) { + if (!st.size()) { + st.load_here(); + } +} + +int rec(stacktrace_t &st, int level) { + if (level <= 1) { + end_of_our_journey(st); + return 0; + } + return rec(st, level - 1); +} + +namespace toto { + +namespace titi { + +struct foo { + + union bar { + NOINLINE static int trampoline(stacktrace_t &st, int level) { + return rec(st, level); + } + }; +}; + +} // namespace titi + +} // namespace toto + +TEST(recursion) { + { // lexical scope. + stacktrace_t st; + const int input = 3; + int r = toto::titi::foo::bar::trampoline(st, input); + + std::cout << "rec(" << input << ") == " << r << std::endl; + + Printer printer; + // printer.address = true; + printer.object = true; + printer.print(st, stdout); + } +} + +int fib(StackTrace &st, int level) { + if (level == 2) { + return 1; + } + if (level <= 1) { + end_of_our_journey(st); + return 0; + } + return fib(st, level - 1) + fib(st, level - 2); +} + +TEST(fibrecursive) { + StackTrace st; + const int input = 6; + int r = fib(st, input); + + std::cout << "fib(" << input << ") == " << r << std::endl; + + Printer printer; + printer.print(st, stdout); +} diff --git a/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/select_signals.cpp b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/select_signals.cpp new file mode 100644 index 0000000000000..57e6ebe0877c1 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/select_signals.cpp @@ -0,0 +1,51 @@ +/* + * test/segfault.cpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "backward.hpp" + +#include "test/test.hpp" +#include +#include + +using namespace backward; + +void badass_function() { + char *ptr = (char *)42; + *ptr = 42; +} + +TEST_SEGFAULT(pprint_sigsev) { + std::vector signals; + signals.push_back(SIGSEGV); + SignalHandling sh(signals); + std::cout << std::boolalpha << "sh.loaded() == " << sh.loaded() << std::endl; + badass_function(); +} + +TEST_SEGFAULT(wont_pprint) { + std::vector signals; + signals.push_back(SIGABRT); + SignalHandling sh(signals); + std::cout << std::boolalpha << "sh.loaded() == " << sh.loaded() << std::endl; + badass_function(); +} diff --git a/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/stacktrace.cpp b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/stacktrace.cpp new file mode 100644 index 0000000000000..47084fe7da01f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/stacktrace.cpp @@ -0,0 +1,57 @@ +/* + * test/stacktrace.cpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "backward.hpp" +#include "test/test.hpp" +#include +#include + +using namespace backward; + +void collect_trace(StackTrace &st) { st.load_here(); } + +TEST(minitrace) { + Printer printer; + + StackTrace st; + collect_trace(st); + + printer.print(st, std::cout); +} + +void d(StackTrace &st) { st.load_here(); } + +void c(StackTrace &st) { return d(st); } + +void b(StackTrace &st) { return c(st); } + +NOINLINE void a(StackTrace &st) { return b(st); } + +TEST(smalltrace) { + Printer printer; + + StackTrace st; + a(st); + + printer.print(st, std::cout); +} diff --git a/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/suicide.cpp b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/suicide.cpp new file mode 100644 index 0000000000000..e694c6fb46166 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/suicide.cpp @@ -0,0 +1,89 @@ +/* + * test/suicide.cpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "backward.hpp" + +#include "test/test.hpp" +#include + +#ifndef _WIN32 +#include +#endif + +using namespace backward; + +void badass_function() { + char *ptr = (char *)42; + *ptr = 42; +} + +TEST_SEGFAULT(invalid_write) { badass_function(); } + +int you_shall_not_pass() { + char *ptr = (char *)42; + int v = *ptr; + return v; +} + +TEST_SEGFAULT(invalid_read) { + int v = you_shall_not_pass(); + std::cout << "v=" << v << std::endl; +} + +void abort_abort_I_repeat_abort_abort() { + std::cout << "Jumping off the boat!" << std::endl; + abort(); +} + +TEST_ABORT(calling_abort) { abort_abort_I_repeat_abort_abort(); } + +// aarch64 and mips does not trap Division by zero +#if !defined(__aarch64__) && !defined(__mips__) +volatile int zero = 0; + +int divide_by_zero() { + std::cout << "And the wild black hole appears..." << std::endl; + int v = 42 / zero; + return v; +} + +TEST_DIVZERO(divide_by_zero) { + int v = divide_by_zero(); + std::cout << "v=" << v << std::endl; +} +#endif + +// Darwin does not allow RLIMIT_STACK to be reduced +#ifndef __APPLE__ +int bye_bye_stack(int i) { return bye_bye_stack(i + 1) + bye_bye_stack(i * 2); } + +TEST_SEGFAULT(stackoverflow) { +#ifndef _WIN32 + struct rlimit limit; + limit.rlim_max = 8096; + setrlimit(RLIMIT_STACK, &limit); +#endif + int r = bye_bye_stack(42); + std::cout << "r=" << r << std::endl; +} +#endif diff --git a/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/test.cpp b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/test.cpp new file mode 100644 index 0000000000000..1a148f12cc2e2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/test.cpp @@ -0,0 +1,63 @@ +/* + * test/test.cpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "test/test.hpp" +#include +#include +#include + +TEST(empty_test) {} + +TEST_FAIL_ASSERT(fail_assert) { ASSERT(1 == 2); } + +TEST_FAIL_ASSERT(fail_assert_ge) { ASSERT_GE(4, 5); } + +TEST_UNCAUGHT_EXCEPTION(uncaught_exception) { + throw std::runtime_error("some random runtime error"); +} + +TEST_UNCAUGHT_EXCEPTION(uncaught_exception_int) { throw 42; } + +TEST_SEGFAULT(segfault) { + char *a = 0; + char b = a[42]; + std::cout << "result: " << b << std::endl; +} + +TEST_ABORT(abort) { abort(); } + +TEST(catch_int) { + ASSERT_THROW({ throw 42; }, int); +} + +TEST_FAIL_ASSERT(fail_catch_int) { ASSERT_THROW({}, int); } + +TEST_FAIL_ASSERT(fail_no_throw) { + ASSERT_NO_THROW({ throw 42; }); +} + +TEST(any_throw) { + ASSERT_ANY_THROW({ throw 42; }); +} + +TEST_FAIL_ASSERT(fail_any_throw) { ASSERT_ANY_THROW({}); } diff --git a/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/test.hpp b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/test.hpp new file mode 100644 index 0000000000000..dc77c627a16da --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test/test.hpp @@ -0,0 +1,183 @@ +/* + * test/test.hpp + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#pragma once +#ifndef H_54E531F7_9154_454B_BEB9_257408429470 +#define H_54E531F7_9154_454B_BEB9_257408429470 + +#include +#include +#include +#include +#include +#include + +namespace test { + +struct AssertFailedError : std::exception { + ~AssertFailedError() throw() {} + + AssertFailedError(const char *filename, int _line, const char *_errmsg) + : basename(_basename(filename)), line(_line), errmsg(_errmsg) {} + + const char *what() const throw() { + if (!_what.size()) { + std::ostringstream ss; + ss << "assertion failed (" << basename << ":" << line; + ss << ") " << errmsg; + _what = ss.str(); + } + return _what.c_str(); + } + + const char *basename; + int line; + const char *errmsg; + + mutable std::string _what; + + static const char *_basename(const char *filename) { + const char *basename = filename + strlen(filename); + while (basename != filename && *basename != '/') { + basename -= 1; + } + return basename + 1; + } +}; + +enum TestStatus { + SUCCESS = 0 << 0, + FAILED = 1 << 0, + + ASSERT_FAIL = FAILED | 1 << 1, + EXCEPTION_UNCAUGHT = FAILED | 2 << 1, + SIGNAL_UNCAUGHT = FAILED | 3 << 1, + SIGNAL_SEGFAULT = SIGNAL_UNCAUGHT | 1 << 3, + SIGNAL_ABORT = SIGNAL_UNCAUGHT | 2 << 3, + SIGNAL_DIVZERO = SIGNAL_UNCAUGHT | 2 << 3, + + STATUS_MASK = 0x1F +}; + +struct TestBase { + const char *name; + TestStatus expected_status; + + virtual ~TestBase() {} + TestBase(const char *, TestStatus); + virtual void do_test() = 0; + + TestStatus run() { + try { + do_test(); + return SUCCESS; + } catch (const AssertFailedError &e) { + printf("!! %s\n", e.what()); + return ASSERT_FAIL; + } catch (const std::exception &e) { + printf("!! exception: %s\n", e.what()); + return EXCEPTION_UNCAUGHT; + } catch (...) { + printf("!! unknown exception\n"); + return EXCEPTION_UNCAUGHT; + } + } +}; + +typedef std::vector test_registry_t; +inline test_registry_t &test_registry() { + static test_registry_t reg; + return reg; +} + +inline TestBase::TestBase(const char *n, TestStatus s) + : name(n), expected_status(s) { + test_registry().push_back(this); +} + +} // namespace test + +#define _TEST_STATUS(name, status) \ + struct TEST_##name : ::test::TestBase { \ + TEST_##name() : TestBase(#name, status) {} \ + void do_test(); \ + } TEST_##name; \ + void TEST_##name::do_test() + +#define TEST(name) _TEST_STATUS(name, ::test::SUCCESS) +#define TEST_FAIL(name) _TEST_STATUS(name, ::test::FAILED) +#define TEST_FAIL_ASSERT(name) _TEST_STATUS(name, ::test::ASSERT_FAIL) +#define TEST_UNCAUGHT_EXCEPTION(name) \ + _TEST_STATUS(name, ::test::EXCEPTION_UNCAUGHT) +#define TEST_UNCAUGHT_SIGNAL(name) _TEST_STATUS(name, ::test::SIGNAL_UNCAUGHT) +#define TEST_SEGFAULT(name) _TEST_STATUS(name, ::test::SIGNAL_SEGFAULT) +#define TEST_ABORT(name) _TEST_STATUS(name, ::test::SIGNAL_ABORT) +#define TEST_DIVZERO(name) _TEST_STATUS(name, ::test::SIGNAL_DIVZERO) + +#define ASSERT(expr) \ + (expr) ? static_cast(0) \ + : throw ::test::AssertFailedError(__FILE__, __LINE__, #expr) + +#define _ASSERT_BINOP(a, b, cmp) \ + (!(a cmp b)) ? static_cast(0) \ + : throw ::test::AssertFailedError( \ + __FILE__, __LINE__, "because " #a " " #cmp " " #b) + +#define ASSERT_EQ(a, b) _ASSERT_BINOP(a, b, !=) +#define ASSERT_NE(a, b) _ASSERT_BINOP(a, b, ==) +#define ASSERT_LT(a, b) _ASSERT_BINOP(a, b, >=) +#define ASSERT_LE(a, b) _ASSERT_BINOP(a, b, >) +#define ASSERT_GT(a, b) _ASSERT_BINOP(a, b, <=) +#define ASSERT_GE(a, b) _ASSERT_BINOP(a, b, <) + +#define ASSERT_THROW(expr, e_type) \ + do { \ + try { \ + expr \ + } catch (const e_type &) { \ + break; \ + } \ + throw ::test::AssertFailedError(__FILE__, __LINE__, \ + "expected exception " #e_type); \ + } while (0) + +#define ASSERT_ANY_THROW(expr) \ + do { \ + try { \ + expr \ + } catch (...) { \ + break; \ + } \ + throw ::test::AssertFailedError(__FILE__, __LINE__, \ + "expected any exception"); \ + } while (0) + +#define ASSERT_NO_THROW(expr) \ + try { \ + expr \ + } catch (...) { \ + throw ::test::AssertFailedError(__FILE__, __LINE__, \ + "no exception expected"); \ + } + +#endif /* H_GUARD */ diff --git a/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test_package/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test_package/CMakeLists.txt new file mode 100644 index 0000000000000..56de8b2232c59 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test_package/CMakeLists.txt @@ -0,0 +1,13 @@ +# Auto generated CMakeLists.txt. +# See xbmc/addons/kodi-dev-kit/tools/code-generator.py. + +set(SOURCES + main.cpp +) + +set(HEADERS +) + +if(SOURCES OR HEADERS) + devkit_add_object(devkit_third_party_backward-cpp_test_package) +endif() diff --git a/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test_package/conanfile.py b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test_package/conanfile.py new file mode 100644 index 0000000000000..e509dd5a00c49 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test_package/conanfile.py @@ -0,0 +1,14 @@ +from conans import ConanFile, CMake +import os + +class TestBackward(ConanFile): + settings = 'os', 'compiler', 'build_type', 'arch' + generators = 'cmake' + + def build(self): + cmake = CMake(self) + cmake.configure(defs={'CMAKE_VERBOSE_MAKEFILE': 'ON'}) + cmake.build() + + def test(self): + self.run(os.path.join('.', 'bin', 'example')) diff --git a/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test_package/main.cpp b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test_package/main.cpp new file mode 100644 index 0000000000000..98ca96a43f287 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/addon_runner/third_party/backward-cpp/test_package/main.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include + +using namespace backward; + +class TracedException : public std::runtime_error { +public: + TracedException() : std::runtime_error(_get_trace()) {} + +private: + std::string _get_trace() { + std::ostringstream ss; + + StackTrace stackTrace; + TraceResolver resolver; + stackTrace.load_here(); + resolver.load_stacktrace(stackTrace); + + for (std::size_t i = 0; i < stackTrace.size(); ++i) { + const ResolvedTrace trace = resolver.resolve(stackTrace[i]); + + ss << "#" << i << " at " << trace.object_function << "\n"; + } + + return ss.str(); + } +}; + +void f(int i) { + if (i >= 42) { + throw TracedException(); + } else { + std::cout << "i=" << i << "\n"; + f(i + 1); + } +} + +int main() { + try { + f(0); + } catch (const TracedException &ex) { + std::cout << ex.what(); + } +} 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..1967b1b8354fd --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/CMakeLists.txt @@ -0,0 +1,105 @@ +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}/OpenGLExtensionCheck.cpp + ${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}/OpenGLExtensionCheck.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}/SharedGL.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}/socket.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/web.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_providers.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 + ${CMAKE_CURRENT_SOURCE_DIR}/api/gui/input/action.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..74ee6495b060e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/DirectData.h @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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-instance/web.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_addoninstance_web_h addoninstance_web_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_addoninstance_web_h addoninstance_web_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..7cd6812f75ed8 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/Instances.h @@ -0,0 +1,74 @@ +/* + * 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-instance/web.h" +#include "src/shared/api/addon_base.h" +/*---AUTO_GEN_PARSE---*/ + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct UnionAddonFunctions +{ + /* related addon instancy type */ + KODI_ADDON_INSTANCE_TYPE 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_INSTANCE_FUNC_UNION kodi_addon_instance; + 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; + union KODI_ADDON_WEB_FUNC_UNION kodi_addon_web; + /*---AUTO_GEN_PARSE---*/ + } types; +}; + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/OpenGLExtensionCheck.cpp b/xbmc/addons/kodi-dev-kit/src/shared/OpenGLExtensionCheck.cpp new file mode 100644 index 0000000000000..d51154ae22129 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/OpenGLExtensionCheck.cpp @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2020 Team Kodi (https://kodi.tv) + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSE.md for more information. + */ + +#include "OpenGLExtensionCheck.h" + +#include +#define GL_GLEXT_PROTOTYPES +#include +#define EGL_EGLEXT_PROTOTYPES +#include +#include +#include + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +namespace +{ + +static std::vector displayExts; + +std::vector SplitExtensions(const std::string& str) +{ + std::vector strings; + size_t start; + size_t end = 0; + while ((start = str.find_first_not_of(' ', end)) != std::string::npos) + { + end = str.find(' ', start); + strings.push_back(str.substr(start, end - start)); + } + return strings; +} + +void FindSupportedExtensions(EGLDisplay m_eglDisplay) +{ + // Get the GL version number + int renderVersionMajor = 0; + int renderVersionMinor = 0; + + displayExts = SplitExtensions(eglQueryString(m_eglDisplay, EGL_EXTENSIONS)); + + const char* ver = reinterpret_cast(glGetString(GL_VERSION)); + if (ver != 0) + { + sscanf(ver, "%d.%d", &renderVersionMajor, &renderVersionMinor); + } + + if (renderVersionMajor > 3 || (renderVersionMajor == 3 && renderVersionMinor >= 2)) + { + GLint n = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &n); + if (n > 0) + { + GLint i; + for (i = 0; i < n; i++) + { + displayExts.emplace_back(reinterpret_cast(glGetStringi(GL_EXTENSIONS, i))); + } + } + } + else + { + auto extensions = reinterpret_cast(glGetString(GL_EXTENSIONS)); + if (extensions) + { + std::vector ext = SplitExtensions(extensions); + displayExts.insert(displayExts.begin(), ext.begin(), ext.end()); + } + } +} + +} /* namespace */ + +bool CheckExtensionSupported(const std::string& name) +{ + if (displayExts.empty()) + { + FindSupportedExtensions(eglGetCurrentDisplay()); + } + return std::find(displayExts.begin(), displayExts.end(), name) != displayExts.end(); +} + +void* GetEGLFunc(const std::string& name) +{ + return reinterpret_cast(eglGetProcAddress(name.c_str())); +} + +const char* GetEGLErrorString(uint32_t error) +{ + switch (error) + { + case EGL_SUCCESS: + return "EGL_SUCCESS"; + case EGL_NOT_INITIALIZED: + return "EGL_NOT_INITIALIZED"; + case EGL_BAD_ACCESS: + return "EGL_BAD_ACCESS"; + case EGL_BAD_ALLOC: + return "EGL_BAD_ALLOC"; + case EGL_BAD_ATTRIBUTE: + return "EGL_BAD_ATTRIBUTE"; + case EGL_BAD_CONFIG: + return "EGL_BAD_CONFIG"; + case EGL_BAD_CONTEXT: + return "EGL_BAD_CONTEXT"; + case EGL_BAD_CURRENT_SURFACE: + return "EGL_BAD_CURRENT_SURFACE"; + case EGL_BAD_DISPLAY: + return "EGL_BAD_DISPLAY"; + case EGL_BAD_MATCH: + return "EGL_BAD_MATCH"; + case EGL_BAD_NATIVE_PIXMAP: + return "EGL_BAD_NATIVE_PIXMAP"; + case EGL_BAD_NATIVE_WINDOW: + return "EGL_BAD_NATIVE_WINDOW"; + case EGL_BAD_PARAMETER: + return "EGL_BAD_PARAMETER"; + case EGL_BAD_SURFACE: + return "EGL_BAD_SURFACE"; + case EGL_CONTEXT_LOST: + return "EGL_CONTEXT_LOST"; + default: + return "UNKNOWN"; + } +} + +// Returns the last EGL error as a string. +const char* GetLastEGLErrorString() +{ + return GetEGLErrorString(eglGetError()); +} + +} /* namespace INTERFACE */ +} /* namespace ADDONS */ +} /* namespace KODI */ diff --git a/xbmc/addons/kodi-dev-kit/src/shared/OpenGLExtensionCheck.h b/xbmc/addons/kodi-dev-kit/src/shared/OpenGLExtensionCheck.h new file mode 100644 index 0000000000000..a62da6b4f6e56 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/OpenGLExtensionCheck.h @@ -0,0 +1,29 @@ +/* + * 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 + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +bool CheckExtensionSupported(const std::string& name); + +void* GetEGLFunc(const std::string& name); + +const char* GetEGLErrorString(uint32_t error); + +const char* GetLastEGLErrorString(); + +} /* 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..a4fb043ee6ebf --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcess.cpp @@ -0,0 +1,28 @@ +/* + * 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..f3aca27f5ca3d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcess.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. + */ + +#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..30ea726f8ead4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessReceiver.cpp @@ -0,0 +1,233 @@ +/* + * 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; + msgpack::object_handle input; + if (data_size != 0) + 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..2f911b8a786d9 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessReceiver.h @@ -0,0 +1,63 @@ +/* + * 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..d01f0b71dc90e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/ShareProcessTransmitter.cpp @@ -0,0 +1,288 @@ +/* + * 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; + sharedMem->data_size = 0; + + // 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..8513e453651a4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/SharedData.h @@ -0,0 +1,86 @@ +/* + * 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/SharedGL.h b/xbmc/addons/kodi-dev-kit/src/shared/SharedGL.h new file mode 100644 index 0000000000000..f4d6370cb3558 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/SharedGL.h @@ -0,0 +1,70 @@ +/* + * 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" + +#if HAS_GL +#define GL_TYPE_STRING "GL" +// always define GL_GLEXT_PROTOTYPES before include gl headers +#if !defined(GL_GLEXT_PROTOTYPES) +#define GL_GLEXT_PROTOTYPES +#endif +#if defined(TARGET_LINUX) +#include +#include +#elif defined(TARGET_FREEBSD) +#include +#elif defined(TARGET_DARWIN) +#include +#include +#elif defined(WIN32) +#error Use of GL under Windows is not possible +#endif +#elif HAS_GLES >= 2 +#define GL_TYPE_STRING "GLES" +#if defined(WIN32) +#if defined(HAS_ANGLE) +#include +#else +#error Use of GLES only be available under Windows by the use of angle +#endif +#elif defined(TARGET_DARWIN) +#if HAS_GLES == 3 +#include +#include +#else +#include +#include +#endif +#else +#if HAS_GLES == 3 +#include +#include +#else +#include +#include +#endif +#endif +#endif + +#define EGL_EGLEXT_PROTOTYPES +#include +#include + +struct texture_storage_metadata_t +{ + int width; + int height; + int fourcc; + EGLint offset; + EGLint stride; + int num_planes; + EGLuint64KHR modifiers; +}; 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..e3489888a11ee --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/SharedGroups.h @@ -0,0 +1,172 @@ +/* + * 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 uint64_t PtrKodiOffscreen; +typedef uint64_t PtrAddonOffscreen; +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_addoninstance_web_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..3a066572b2622 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/SharedMemControl.cpp @@ -0,0 +1,36 @@ +/* + * 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..97a3f27a87e26 --- /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* 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..669437c79dbf5 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/SharedMemControlPosixMMAP.cpp @@ -0,0 +1,194 @@ +/* + * 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..0ccf996113d1c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/audiodecoder.h @@ -0,0 +1,373 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_INSTANCE_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_INSTANCE_DESTROY_V1 destroy; /*---AUTO---*/ + PFN_KODI_ADDON_AUDIODECODER_SUPPORTS_FILE_V1 supports_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 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 bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIODECODER_SUPPORTS_FILE_V1)( + void*, const KODI_ADDON_AUDIODECODER_HDL, const char*); +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); + +struct directFuncToAddon_addoninstance_audiodecoder_h +{ + void* thisClassHdl; + 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_SUPPORTS_FILE_V1 kodi_addon_audiodecoder_supports_file_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; + if (c_data->cover_art_mem) + cover_art_mem.assign(c_data->cover_art_mem, + c_data->cover_art_mem + c_data->cover_art_mem_size); + 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; + } + if (c_data->cover_art_mem) + { + free(c_data->cover_art_mem); + c_data->cover_art_mem = 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()); + if (!cover_art_mem.empty()) + { + size_t size = cover_art_mem.size(); + c_data->cover_art_mem = static_cast(malloc(sizeof(uint8_t) * size)); + memcpy(c_data->cover_art_mem, cover_art_mem.data(), size); + } + 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; + std::vector cover_art_mem; + 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, + 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_supports_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 bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIODECODER_SUPPORTS_FILE_V1)(const KODI_ADDON_AUDIODECODER_HDL hdl, const char* file); +typedef std::tuple msgChild__IN_kodi_addon_audiodecoder_supports_file_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_audiodecoder_supports_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..98cfc58f67001 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/audioencoder.h @@ -0,0 +1,236 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_INSTANCE_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_INSTANCE_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_ADDON_INSTANCE_BACKEND_HDL, ssize_t, int); +typedef ssize_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_AUDIOENCODER_WRITE_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_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 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 KODI_ADDON_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); + +struct directFuncToAddon_addoninstance_audioencoder_h +{ + void* thisClassHdl; + 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_KODI_ADDON_AUDIOENCODER_INFO_TAG +{ + IFC_KODI_ADDON_AUDIOENCODER_INFO_TAG() = default; + IFC_KODI_ADDON_AUDIOENCODER_INFO_TAG(const KODI_ADDON_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(KODI_ADDON_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL hdl, ssize_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_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 bool(ATTR_APIENTRYP PFN_KODI_ADDON_AUDIOENCODER_START_V1)(KODI_ADDON_AUDIOENCODER_HDL hdl, const struct KODI_ADDON_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..580bc572565d5 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/game.h @@ -0,0 +1,281 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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---*/ + PFN_KODI_ADDON_GAME_RC_GENERATE_HASH_FROM_FILE_V1 + rc_generate_hash_from_file; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_RC_GET_GAME_ID_URL_V1 rc_get_game_id_url; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_RC_GET_PATCH_FILE_URL_V1 + rc_get_patch_file_url; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_RC_POST_RICH_PRESENCE_URL_V1 + rc_post_rich_presence_url; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_RC_ENABLE_RICH_PRESENCE_V1 + rc_enable_rich_presence; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_RC_GET_RICH_PRESENCE_EVALUATION_V1 + rc_get_rich_presence_evaluation; /*---AUTO---*/ + PFN_KODI_ADDON_GAME_RC_RESET_RUNTIME_V1 rc_reset_runtime; /*---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_ADDON_INSTANCE_BACKEND_HDL, const struct game_stream_properties*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_GET_STREAM_BUFFER_V1)( + void*, + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL, const struct game_input_event*); +typedef game_proc_address_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_HW_GET_PROC_ADDRESS_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_ADD_STREAM_DATA_V1)( + void*, + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL, KODI_GAME_STREAM_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_CLOSE_V1)(void*, + KODI_ADDON_INSTANCE_BACKEND_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_RELEASE_STREAM_BUFFER_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_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_HW_GET_PROC_ADDRESS_V1 kodi_addon_game_hw_get_proc_address_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; +}; + +//}}} + +// 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_ADDON_INSTANCE_BACKEND_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_RC_ENABLE_RICH_PRESENCE_V1)( + void*, const KODI_ADDON_GAME_HDL, const char*); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_RC_GENERATE_HASH_FROM_FILE_V1)( + void*, const KODI_ADDON_GAME_HDL, char**, unsigned int, const char*); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_RC_GET_GAME_ID_URL_V1)( + void*, const KODI_ADDON_GAME_HDL, char**, const char*); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_RC_GET_PATCH_FILE_URL_V1)( + void*, const KODI_ADDON_GAME_HDL, char**, const char*, const char*, unsigned int); +typedef enum GAME_ERROR( + ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_RC_GET_RICH_PRESENCE_EVALUATION_V1)( + void*, const KODI_ADDON_GAME_HDL, char**, unsigned int); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_RC_POST_RICH_PRESENCE_URL_V1)( + void*, + const KODI_ADDON_GAME_HDL, + char**, + char**, + const char*, + const char*, + unsigned int, + const char*); +typedef enum GAME_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GAME_RC_RESET_RUNTIME_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_RC_ENABLE_RICH_PRESENCE_V1 kodi_addon_game_rc_enable_rich_presence_v1; + PFN_INT_KODI_ADDON_GAME_RC_GENERATE_HASH_FROM_FILE_V1 + kodi_addon_game_rc_generate_hash_from_file_v1; + PFN_INT_KODI_ADDON_GAME_RC_GET_GAME_ID_URL_V1 kodi_addon_game_rc_get_game_id_url_v1; + PFN_INT_KODI_ADDON_GAME_RC_GET_PATCH_FILE_URL_V1 kodi_addon_game_rc_get_patch_file_url_v1; + PFN_INT_KODI_ADDON_GAME_RC_GET_RICH_PRESENCE_EVALUATION_V1 + kodi_addon_game_rc_get_rich_presence_evaluation_v1; + PFN_INT_KODI_ADDON_GAME_RC_POST_RICH_PRESENCE_URL_V1 kodi_addon_game_rc_post_rich_presence_url_v1; + PFN_INT_KODI_ADDON_GAME_RC_RESET_RUNTIME_V1 kodi_addon_game_rc_reset_runtime_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..e956d2dbd8bd5 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/imagedecoder.h @@ -0,0 +1,353 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_INSTANCE_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_INSTANCE_DESTROY_V1 destroy; /*---AUTO---*/ + PFN_KODI_ADDON_IMAGEDECODER_SUPPORTS_FILE_V1 supports_file; /*---AUTO---*/ + PFN_KODI_ADDON_IMAGEDECODER_READ_TAG_V1 read_tag; /*---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_ORIENTATION +#define MSGPACK_ADD_ENUM_ADDON_IMG_ORIENTATION +MSGPACK_ADD_ENUM(ADDON_IMG_ORIENTATION); +#endif +#ifndef MSGPACK_ADD_ENUM_ADDON_IMG_COLOR +#define MSGPACK_ADD_ENUM_ADDON_IMG_COLOR +MSGPACK_ADD_ENUM(ADDON_IMG_COLOR); +#endif +#ifndef MSGPACK_ADD_ENUM_ADDON_IMG_METERING_MODE +#define MSGPACK_ADD_ENUM_ADDON_IMG_METERING_MODE +MSGPACK_ADD_ENUM(ADDON_IMG_METERING_MODE); +#endif +#ifndef MSGPACK_ADD_ENUM_ADDON_IMG_EXPOSURE_PROGRAM +#define MSGPACK_ADD_ENUM_ADDON_IMG_EXPOSURE_PROGRAM +MSGPACK_ADD_ENUM(ADDON_IMG_EXPOSURE_PROGRAM); +#endif +#ifndef MSGPACK_ADD_ENUM_ADDON_IMG_EXPOSURE_MODE +#define MSGPACK_ADD_ENUM_ADDON_IMG_EXPOSURE_MODE +MSGPACK_ADD_ENUM(ADDON_IMG_EXPOSURE_MODE); +#endif +#ifndef MSGPACK_ADD_ENUM_ADDON_IMG_FLASH_TYPE +#define MSGPACK_ADD_ENUM_ADDON_IMG_FLASH_TYPE +MSGPACK_ADD_ENUM(ADDON_IMG_FLASH_TYPE); +#endif +#ifndef MSGPACK_ADD_ENUM_ADDON_IMG_LIGHT_SOURCE +#define MSGPACK_ADD_ENUM_ADDON_IMG_LIGHT_SOURCE +MSGPACK_ADD_ENUM(ADDON_IMG_LIGHT_SOURCE); +#endif +#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. +//{{{ + +struct directFuncToKodi_addoninstance_imagedecoder_h +{ + void* thisClassHdl; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_IMAGEDECODER_DECODE_V1)( + void*, + const 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*, + const KODI_ADDON_IMAGEDECODER_HDL, + const char*, + const uint8_t*, + size_t, + unsigned int*, + unsigned int*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_IMAGEDECODER_READ_TAG_V1)( + void*, + const KODI_ADDON_IMAGEDECODER_HDL, + const char*, + struct KODI_ADDON_IMAGEDECODER_INFO_TAG*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_IMAGEDECODER_SUPPORTS_FILE_V1)( + void*, const KODI_ADDON_IMAGEDECODER_HDL, const char*); + +struct directFuncToAddon_addoninstance_imagedecoder_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_IMAGEDECODER_DECODE_V1 kodi_addon_imagedecoder_decode_v1; + PFN_INT_KODI_ADDON_IMAGEDECODER_LOAD_IMAGE_FROM_MEMORY_V1 + kodi_addon_imagedecoder_load_image_from_memory_v1; + PFN_INT_KODI_ADDON_IMAGEDECODER_READ_TAG_V1 kodi_addon_imagedecoder_read_tag_v1; + PFN_INT_KODI_ADDON_IMAGEDECODER_SUPPORTS_FILE_V1 kodi_addon_imagedecoder_supports_file_v1; +}; + +//}}} + +/* Confirm after autogen the correctness here! */ +/*---AUTO_GEN_PARSE---*/ + +struct IFC_KODI_ADDON_IMAGEDECODER_INFO_TAG +{ + IFC_KODI_ADDON_IMAGEDECODER_INFO_TAG() = default; + IFC_KODI_ADDON_IMAGEDECODER_INFO_TAG(const KODI_ADDON_IMAGEDECODER_INFO_TAG* c_data) + { + if (c_data == nullptr) + return; + + width = c_data->width; + height = c_data->height; + distance = c_data->distance; + orientation = c_data->orientation; + color = c_data->color; + metering_mode = c_data->metering_mode; + exposure_time = c_data->exposure_time; + exposure_bias = c_data->exposure_bias; + exposure_program = c_data->exposure_program; + exposure_mode = c_data->exposure_mode; + time_created = c_data->time_created; + aperture_f_number = c_data->aperture_f_number; + flash_used = c_data->flash_used; + focal_length = c_data->focal_length; + focal_length_in_35mm_format = c_data->focal_length_in_35mm_format; + digital_zoom_ratio = c_data->digital_zoom_ratio; + iso_speed = c_data->iso_speed; + light_source = c_data->light_source; + gps_info_present = c_data->gps_info_present; + latitude_ref = c_data->latitude_ref; + longitude_ref = c_data->longitude_ref; + altitude_ref = c_data->altitude_ref; + altitude = c_data->altitude; + if (c_data->camera_manufacturer) + camera_manufacturer = c_data->camera_manufacturer; + if (c_data->camera_model) + camera_model = c_data->camera_model; + if (c_data->author) + author = c_data->author; + if (c_data->description) + description = c_data->description; + if (c_data->copyright) + copyright = c_data->copyright; + } + + static inline void CleanCStructure(KODI_ADDON_IMAGEDECODER_INFO_TAG* c_data) + { + if (c_data == nullptr) + return; + + if (c_data->camera_manufacturer) + { + free(c_data->camera_manufacturer); + c_data->camera_manufacturer = nullptr; + } + if (c_data->camera_model) + { + free(c_data->camera_model); + c_data->camera_model = nullptr; + } + if (c_data->author) + { + free(c_data->author); + c_data->author = nullptr; + } + if (c_data->description) + { + free(c_data->description); + c_data->description = nullptr; + } + if (c_data->copyright) + { + free(c_data->copyright); + c_data->copyright = nullptr; + } + } + + void SetCStructure(KODI_ADDON_IMAGEDECODER_INFO_TAG* c_data) + { + if (c_data == nullptr) + return; + + c_data->width = width; + c_data->height = height; + c_data->distance = distance; + c_data->orientation = orientation; + c_data->color = color; + c_data->metering_mode = metering_mode; + c_data->exposure_time = exposure_time; + c_data->exposure_bias = exposure_bias; + c_data->exposure_program = exposure_program; + c_data->exposure_mode = exposure_mode; + c_data->time_created = time_created; + c_data->aperture_f_number = aperture_f_number; + c_data->flash_used = flash_used; + c_data->focal_length = focal_length; + c_data->focal_length_in_35mm_format = focal_length_in_35mm_format; + c_data->digital_zoom_ratio = digital_zoom_ratio; + c_data->iso_speed = iso_speed; + c_data->light_source = light_source; + c_data->gps_info_present = gps_info_present; + c_data->latitude_ref = latitude_ref; + c_data->longitude_ref = longitude_ref; + c_data->altitude_ref = altitude_ref; + c_data->altitude = altitude; + if (!camera_manufacturer.empty()) + c_data->camera_manufacturer = strdup(camera_manufacturer.c_str()); + if (!camera_model.empty()) + c_data->camera_model = strdup(camera_model.c_str()); + if (!author.empty()) + c_data->author = strdup(author.c_str()); + if (!description.empty()) + c_data->description = strdup(description.c_str()); + if (!copyright.empty()) + c_data->copyright = strdup(copyright.c_str()); + } + + int width; + int height; + float distance; + enum ADDON_IMG_ORIENTATION orientation; + enum ADDON_IMG_COLOR color; + enum ADDON_IMG_METERING_MODE metering_mode; + float exposure_time; + float exposure_bias; + enum ADDON_IMG_EXPOSURE_PROGRAM exposure_program; + enum ADDON_IMG_EXPOSURE_MODE exposure_mode; + time_t time_created; + float aperture_f_number; + enum ADDON_IMG_FLASH_TYPE flash_used; + int focal_length; + int focal_length_in_35mm_format; + float digital_zoom_ratio; + float iso_speed; + enum ADDON_IMG_LIGHT_SOURCE light_source; + bool gps_info_present; + char latitude_ref; + char longitude_ref; + int altitude_ref; + float altitude; + std::string camera_manufacturer; + std::string camera_model; + std::string author; + std::string description; + std::string copyright; + + MSGPACK_DEFINE(width, + height, + distance, + orientation, + color, + metering_mode, + exposure_time, + exposure_bias, + exposure_program, + exposure_mode, + time_created, + aperture_f_number, + flash_used, + focal_length, + focal_length_in_35mm_format, + digital_zoom_ratio, + iso_speed, + light_source, + gps_info_present, + latitude_ref, + longitude_ref, + altitude_ref, + altitude, + camera_manufacturer, + camera_model, + author, + description, + copyright); +}; +/*---AUTO_GEN_PARSE---*/ + +typedef enum funcParent_addoninstance_imagedecoder_h : int +{ + funcParent_addoninstance_imagedecoder_h_dummy +} funcParent_addoninstance_imagedecoder_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_addoninstance_imagedecoder_h : int +{ + funcChild_kodi_addon_imagedecoder_supports_file_v1, + funcChild_kodi_addon_imagedecoder_read_tag_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 bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_SUPPORTS_FILE_V1)(const KODI_ADDON_IMAGEDECODER_HDL hdl, const char* file); +typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_supports_file_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_supports_file_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_READ_TAG_V1)(const KODI_ADDON_IMAGEDECODER_HDL hdl, const char* file, struct KODI_ADDON_IMAGEDECODER_INFO_TAG* info); +typedef std::tuple msgChild__IN_kodi_addon_imagedecoder_read_tag_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_imagedecoder_read_tag_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_IMAGEDECODER_LOAD_IMAGE_FROM_MEMORY_V1)(const KODI_ADDON_IMAGEDECODER_HDL hdl, const char* mimetype, 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)(const 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..01f66c72689e5 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/inputstream.h @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_HDL, int); +typedef struct DEMUX_PACKET*( + ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_ALLOCATE_ENCRYPTED_DEMUX_PACKET_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, unsigned int, unsigned int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INPUTSTREAM_FREE_DEMUX_PACKET_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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..12136e961355b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/peripheral.h @@ -0,0 +1,219 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_HDL, const char*, const char*); +typedef unsigned int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_FEATURE_COUNT_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, enum JOYSTICK_FEATURE_TYPE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_REFRESH_BUTTON_MAPS_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PERIPHERAL_TRIGGER_SCAN_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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..437182efe0ca5 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr.h @@ -0,0 +1,752 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_HDL); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_GET_EPG_MAX_PAST_DAYS_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_ADD_MENU_HOOK_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, const struct PVR_MENUHOOK*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_CONNECTION_STATE_CHANGE_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL, struct EPG_TAG*, enum EPG_EVENT_STATE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_RECORDING_NOTIFICATION_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, const char*, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRANSFER_CHANNEL_ENTRY_V1)( + void*, + KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRIGGER_CHANNEL_UPDATE_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRIGGER_EPG_UPDATE_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, unsigned int); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRIGGER_PROVIDERS_UPDATE_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRIGGER_RECORDING_UPDATE_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_PVR_TRIGGER_TIMER_UPDATE_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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..7e0d7419df3b6 --- /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-2022 Team Kodi + * 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..5ed59bb945a00 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_channels.h @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..ef9519e148f9f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_defines.h @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..371c6034cb14b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_edl.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..af7169ba1f93d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_epg.h @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..07dfc30a0a850 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_general.h @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..567d646819112 --- /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-2022 Team Kodi + * 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..05008e9617167 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_providers.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..b51d29cf1b5b1 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_recordings.h @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..7ccd9162b542d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/pvr/pvr_timers.h @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..cdba152ab9d0b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/screensaver.h @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_INSTANCE_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_INSTANCE_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*, const KODI_ADDON_INSTANCE_BACKEND_HDL, struct KODI_ADDON_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 bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SCREENSAVER_START_V1)( + void*, const KODI_ADDON_SCREENSAVER_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SCREENSAVER_RENDER_V1)( + void*, const KODI_ADDON_SCREENSAVER_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_SCREENSAVER_STOP_V1)( + void*, const KODI_ADDON_SCREENSAVER_HDL); + +struct directFuncToAddon_addoninstance_screensaver_h +{ + void* thisClassHdl; + 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_KODI_ADDON_SCREENSAVER_PROPS +{ + IFC_KODI_ADDON_SCREENSAVER_PROPS() = default; + IFC_KODI_ADDON_SCREENSAVER_PROPS(const KODI_ADDON_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; + } + + void SetCStructure(KODI_ADDON_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; + } + + PtrValue device; + int x; + int y; + int width; + int height; + float pixelRatio; + + MSGPACK_DEFINE(device, x, y, width, height, pixelRatio); +}; +/*---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( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, struct KODI_ADDON_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_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 bool(ATTR_APIENTRYP PFN_KODI_ADDON_SCREENSAVER_START_V1)(const 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)(const 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)(const 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..4f3adb7aec50f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/vfs.h @@ -0,0 +1,427 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_INSTANCE_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_INSTANCE_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_VFS_FILE_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_OPEN_FOR_WRITE_V1)( + void*, const KODI_ADDON_VFS_HDL, const struct KODI_ADDON_VFS_URL*, bool); +typedef KODI_VFS_FILE_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_OPEN_V1)( + void*, const KODI_ADDON_VFS_HDL, const struct KODI_ADDON_VFS_URL*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_DELETE_IT_V1)( + void*, const KODI_ADDON_VFS_HDL, const struct KODI_ADDON_VFS_URL*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_DIRECTORY_CONTAINS_FILES_V1)( + void*, + const KODI_ADDON_VFS_HDL, + const struct KODI_ADDON_VFS_URL*, + struct VFS_DIR_ENTRY**, + size_t*, + char**); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_DIRECTORY_CREATE_V1)( + void*, const KODI_ADDON_VFS_HDL, const struct KODI_ADDON_VFS_URL*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_DIRECTORY_EXISTS_V1)( + void*, const KODI_ADDON_VFS_HDL, const struct KODI_ADDON_VFS_URL*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_DIRECTORY_GET_V1)( + void*, + const KODI_ADDON_VFS_HDL, + const struct KODI_ADDON_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*, const KODI_ADDON_VFS_HDL, const struct KODI_ADDON_VFS_URL*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_EXISTS_V1)(void*, + const KODI_ADDON_VFS_HDL, + const struct KODI_ADDON_VFS_URL*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_CLOSE_V1)(void*, + const 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*, const 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*, const 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*, const KODI_ADDON_VFS_HDL, KODI_VFS_FILE_HDL, uint32_t); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_IO_CONTROL_SET_RETRY_V1)( + void*, const KODI_ADDON_VFS_HDL, KODI_VFS_FILE_HDL, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_RENAME_V1)(void*, + const KODI_ADDON_VFS_HDL, + const struct KODI_ADDON_VFS_URL*, + const struct KODI_ADDON_VFS_URL*); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_GET_CHUNK_SIZE_V1)( + void*, const KODI_ADDON_VFS_HDL, KODI_VFS_FILE_HDL); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_TRUNCATE_V1)(void*, + const KODI_ADDON_VFS_HDL, + KODI_VFS_FILE_HDL, + int64_t); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_STAT_V1)(void*, + const KODI_ADDON_VFS_HDL, + const struct KODI_ADDON_VFS_URL*, + struct VFS_STAT_STRUCTURE*); +typedef int64_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_GET_LENGTH_V1)( + void*, const KODI_ADDON_VFS_HDL, KODI_VFS_FILE_HDL); +typedef int64_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_GET_POSITION_V1)( + void*, const KODI_ADDON_VFS_HDL, KODI_VFS_FILE_HDL); +typedef int64_t(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_FILE_SEEK_V1)( + void*, const 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*, const 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*, const 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*, + const KODI_ADDON_VFS_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VFS_DISCONNECT_ALL_V1)(void*, + const 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_DELETE_IT_V1 kodi_addon_vfs_delete_it_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_KODI_ADDON_VFS_URL +{ + IFC_KODI_ADDON_VFS_URL() = default; + IFC_KODI_ADDON_VFS_URL(const KODI_ADDON_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(KODI_ADDON_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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_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_VFS_FILE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_VFS_FILE_OPEN_V1)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const KODI_ADDON_VFS_HDL hdl, KODI_VFS_FILE_HDL context, uint32_t 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)(const 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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)(const 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)(const 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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_VFS_URL* url, const struct KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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)(const KODI_ADDON_VFS_HDL hdl, const struct KODI_ADDON_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..9a01391572e35 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/videocodec.h @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_ADDON_INSTANCE_BACKEND_HDL, struct VIDEOCODEC_PICTURE*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VIDEOCODEC_RELEASE_FRAME_BUFFER_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_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_ADDON_INSTANCE_BACKEND_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..51bded4ab31dd --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/visualization.h @@ -0,0 +1,387 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_INSTANCE_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_INSTANCE_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_SYNC_DELAY_V1 get_sync_delay; /*---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*, const KODI_ADDON_INSTANCE_BACKEND_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_GET_PROPERTIES_V1)( + void*, const KODI_ADDON_INSTANCE_BACKEND_HDL, struct KODI_ADDON_VISUALIZATION_PROPS*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_TRANSFER_PRESET_V1)( + void*, const KODI_ADDON_INSTANCE_BACKEND_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 bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_IS_DIRTY_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_IS_LOCKED_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_LOAD_PRESET_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL, int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_LOCK_PRESET_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_NEXT_PRESET_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_PREV_PRESET_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_RANDOM_PRESET_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_RATE_PRESET_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_START_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL, int, int, int, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_UPDATE_ALBUMART_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_UPDATE_TRACK_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL, const struct KODI_ADDON_VISUALIZATION_TRACK*); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_GET_ACTIVE_PRESET_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL); +typedef int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_GET_SYNC_DELAY_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL); +typedef unsigned int(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_GET_PRESETS_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_AUDIO_DATA_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL, const float*, size_t); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_RENDER_V1)( + void*, const KODI_ADDON_VISUALIZATION_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_VISUALIZATION_STOP_V1)( + void*, const 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_GET_ACTIVE_PRESET_V1 + kodi_addon_visualization_get_active_preset_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_GET_PRESETS_V1 kodi_addon_visualization_get_presets_v1; + PFN_INT_KODI_ADDON_VISUALIZATION_GET_SYNC_DELAY_V1 kodi_addon_visualization_get_sync_delay_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_KODI_ADDON_VISUALIZATION_TRACK +{ + IFC_KODI_ADDON_VISUALIZATION_TRACK() = default; + IFC_KODI_ADDON_VISUALIZATION_TRACK(const KODI_ADDON_VISUALIZATION_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(KODI_ADDON_VISUALIZATION_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_KODI_ADDON_VISUALIZATION_PROPS +{ + IFC_KODI_ADDON_VISUALIZATION_PROPS() = default; + IFC_KODI_ADDON_VISUALIZATION_PROPS(const KODI_ADDON_VISUALIZATION_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; + } + + void SetCStructure(KODI_ADDON_VISUALIZATION_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; + } + + PtrValue device; + int x; + int y; + int width; + int height; + float pixelRatio; + + MSGPACK_DEFINE(device, x, y, width, height, pixelRatio); +}; +/*---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(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, struct KODI_ADDON_VISUALIZATION_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(const KODI_ADDON_INSTANCE_BACKEND_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(const KODI_ADDON_INSTANCE_BACKEND_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_start_v1, + funcChild_kodi_addon_visualization_stop_v1, + funcChild_kodi_addon_visualization_get_sync_delay_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 bool(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_START_V1)(const 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)(const 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 int(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_GET_SYNC_DELAY_V1)(const KODI_ADDON_VISUALIZATION_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_visualization_get_sync_delay_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_visualization_get_sync_delay_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_VISUALIZATION_AUDIO_DATA_V1)(const KODI_ADDON_VISUALIZATION_HDL hdl, const float* audio_data, size_t audio_data_length); +typedef std::tuple, 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const 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)(const KODI_ADDON_VISUALIZATION_HDL hdl, const struct KODI_ADDON_VISUALIZATION_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-instance/web.h b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/web.h new file mode 100644 index 0000000000000..2cd8c65cc89c0 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon-instance/web.h @@ -0,0 +1,526 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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/web.h" +#include "src/shared/SharedGroups.h" +#include "src/shared/api/gui/input/action.h" + +#include +#include +#include +#include + +/* API struct from 1 to 1 */ +typedef struct KODI_ADDON_WEB_FUNC_V1_TO_V1 +{ + PFN_KODI_ADDON_INSTANCE_CREATE_V1 create; /*---AUTO---*/ + PFN_KODI_ADDON_INSTANCE_DESTROY_V1 destroy; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_START_INSTANCE_V1 start_instance; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_STOP_INSTANCE_V1 stop_instance; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_MAIN_INITIALIZE_V1 main_initialize; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_MAIN_LOOP_V1 main_loop; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_MAIN_SHUTDOWN_V1 main_shutdown; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_SET_MUTE_V1 set_mute; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_SET_LANGUAGE_V1 set_language; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CREATE_CONTROL_V1 create_control; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_DESTROY_CONTROL_V1 destroy_control; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_RENDER_INIT_V1 control_render_init; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_RENDER_DEINIT_V1 + control_render_deinit; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_RENDER_V1 control_render; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_DIRTY_V1 control_dirty; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_ON_INIT_V1 control_on_init; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_ON_ACTION_V1 control_on_action; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_ON_MOUSE_EVENT_V1 + control_on_mouse_event; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_OPEN_WEBSITE_V1 control_open_website; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_GET_HISTORY_V1 control_get_history; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_SEARCH_TEXT_V1 control_search_text; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_STOP_SEARCH_V1 control_stop_search; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_RELOAD_V1 + control_web_cmd_reload; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_STOP_LOAD_V1 + control_web_cmd_stop_load; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_BACK_V1 + control_web_cmd_nav_back; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_FORWARD_V1 + control_web_cmd_nav_forward; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_WEB_OPEN_OWN_CONTEXT_MENU_V1 + control_web_open_own_context_menu; /*---AUTO---*/ + PFN_KODI_ADDON_WEB_CONTROL_SCREEN_SIZE_CHANGE_V1 + control_screen_size_change; /*---AUTO---*/ +} KODI_ADDON_WEB_FUNC_V1_TO_V1; + +union KODI_ADDON_WEB_FUNC_UNION +{ + struct KODI_ADDON_WEB_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_WEB_ADDON_ERROR +#define MSGPACK_ADD_ENUM_WEB_ADDON_ERROR +MSGPACK_ADD_ENUM(WEB_ADDON_ERROR); +#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_WEB_IS_MUTED_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_REQUEST_OPEN_SITE_IN_NEW_TAB_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_SET_CONTROL_READY_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_SET_FULLSCREEN_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_SET_ICON_URL_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_SET_LOADING_STATE_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, bool, bool, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_SET_OPENED_ADDRESS_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_SET_OPENED_TITLE_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_SET_STATUS_MESSAGE_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_SET_TOOLTIP_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, WEB_KODI_CONTROL, const char*); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_INHIBIT_SCREENSAVER_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_INHIBIT_SHUTDOWN_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL, bool); + +struct directFuncToKodi_addoninstance_web_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_WEB_CONTROL_REQUEST_OPEN_SITE_IN_NEW_TAB_V1 + kodi_addon_web_control_request_open_site_in_new_tab_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_SET_CONTROL_READY_V1 kodi_addon_web_control_set_control_ready_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_SET_FULLSCREEN_V1 kodi_addon_web_control_set_fullscreen_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_SET_ICON_URL_V1 kodi_addon_web_control_set_icon_url_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_SET_LOADING_STATE_V1 kodi_addon_web_control_set_loading_state_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_SET_OPENED_ADDRESS_V1 kodi_addon_web_control_set_opened_address_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_SET_OPENED_TITLE_V1 kodi_addon_web_control_set_opened_title_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_SET_STATUS_MESSAGE_V1 kodi_addon_web_control_set_status_message_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_SET_TOOLTIP_V1 kodi_addon_web_control_set_tooltip_v1; + PFN_INT_KODI_ADDON_WEB_INHIBIT_SCREENSAVER_V1 kodi_addon_web_inhibit_screensaver_v1; + PFN_INT_KODI_ADDON_WEB_INHIBIT_SHUTDOWN_V1 kodi_addon_web_inhibit_shutdown_v1; + PFN_INT_KODI_ADDON_WEB_IS_MUTED_V1 kodi_addon_web_is_muted_v1; +}; + +//}}} + +// Code here relates to direct API calls without use of shared mem from Kodi to addon. +//{{{ + +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_DIRTY_V1)(void*, + const KODI_ADDON_WEB_HDL, + const WEB_KODI_CONTROL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_GET_HISTORY_V1)( + void*, const KODI_ADDON_WEB_HDL, const WEB_KODI_CONTROL, char***, size_t*, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_ON_ACTION_V1)( + void*, + const KODI_ADDON_WEB_HDL, + const WEB_KODI_CONTROL, + const struct KODI_ADDON_ACTION_DATA*, + int*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_ON_INIT_V1)(void*, + const KODI_ADDON_WEB_HDL, + const WEB_KODI_CONTROL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_ON_MOUSE_EVENT_V1)( + void*, + const KODI_ADDON_WEB_HDL, + const WEB_KODI_CONTROL, + int, + double, + double, + double, + double, + int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_OPEN_WEBSITE_V1)( + void*, const KODI_ADDON_WEB_HDL, const WEB_KODI_CONTROL, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_RENDER_INIT_V1)( + void*, const KODI_ADDON_WEB_HDL, const WEB_KODI_CONTROL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_MAIN_INITIALIZE_V1)( + void*, const KODI_ADDON_WEB_HDL); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_SET_LANGUAGE_V1)(void*, + const KODI_ADDON_WEB_HDL, + const char*); +typedef enum WEB_ADDON_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CREATE_CONTROL_V1)( + void*, + const KODI_ADDON_WEB_HDL, + const struct WEB_ADDON_GUI_PROPS*, + const char*, + WEB_KODI_CONTROL*); +typedef enum WEB_ADDON_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_DESTROY_CONTROL_V1)( + void*, const KODI_ADDON_WEB_HDL, const WEB_KODI_CONTROL, bool); +typedef enum WEB_ADDON_ERROR(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_START_INSTANCE_V1)( + void*, const KODI_ADDON_WEB_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_RENDER_DEINIT_V1)( + void*, const KODI_ADDON_WEB_HDL, const WEB_KODI_CONTROL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_RENDER_V1)(void*, + const KODI_ADDON_WEB_HDL, + const WEB_KODI_CONTROL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_SCREEN_SIZE_CHANGE_V1)( + void*, const KODI_ADDON_WEB_HDL, const WEB_KODI_CONTROL, float, float, float, float, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_SEARCH_TEXT_V1)( + void*, const KODI_ADDON_WEB_HDL, const WEB_KODI_CONTROL, const char*, bool, bool, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_STOP_SEARCH_V1)( + void*, const KODI_ADDON_WEB_HDL, const WEB_KODI_CONTROL, bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_BACK_V1)( + void*, const KODI_ADDON_WEB_HDL, const WEB_KODI_CONTROL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_FORWARD_V1)( + void*, const KODI_ADDON_WEB_HDL, const WEB_KODI_CONTROL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_WEB_CMD_RELOAD_V1)( + void*, const KODI_ADDON_WEB_HDL, const WEB_KODI_CONTROL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_WEB_CMD_STOP_LOAD_V1)( + void*, const KODI_ADDON_WEB_HDL, const WEB_KODI_CONTROL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_CONTROL_WEB_OPEN_OWN_CONTEXT_MENU_V1)( + void*, const KODI_ADDON_WEB_HDL, const WEB_KODI_CONTROL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_MAIN_LOOP_V1)(void*, + const KODI_ADDON_WEB_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_MAIN_SHUTDOWN_V1)(void*, + const KODI_ADDON_WEB_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_SET_MUTE_V1)(void*, + const KODI_ADDON_WEB_HDL, + bool); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_WEB_STOP_INSTANCE_V1)(void*, + const KODI_ADDON_WEB_HDL); + +struct directFuncToAddon_addoninstance_web_h +{ + void* thisClassHdl; + PFN_INT_KODI_ADDON_WEB_CONTROL_DIRTY_V1 kodi_addon_web_control_dirty_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_GET_HISTORY_V1 kodi_addon_web_control_get_history_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_ON_ACTION_V1 kodi_addon_web_control_on_action_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_ON_INIT_V1 kodi_addon_web_control_on_init_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_ON_MOUSE_EVENT_V1 kodi_addon_web_control_on_mouse_event_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_OPEN_WEBSITE_V1 kodi_addon_web_control_open_website_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_RENDER_DEINIT_V1 kodi_addon_web_control_render_deinit_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_RENDER_INIT_V1 kodi_addon_web_control_render_init_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_RENDER_V1 kodi_addon_web_control_render_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_SCREEN_SIZE_CHANGE_V1 kodi_addon_web_control_screen_size_change_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_SEARCH_TEXT_V1 kodi_addon_web_control_search_text_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_STOP_SEARCH_V1 kodi_addon_web_control_stop_search_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_BACK_V1 kodi_addon_web_control_web_cmd_nav_back_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_FORWARD_V1 + kodi_addon_web_control_web_cmd_nav_forward_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_WEB_CMD_RELOAD_V1 kodi_addon_web_control_web_cmd_reload_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_WEB_CMD_STOP_LOAD_V1 kodi_addon_web_control_web_cmd_stop_load_v1; + PFN_INT_KODI_ADDON_WEB_CONTROL_WEB_OPEN_OWN_CONTEXT_MENU_V1 + kodi_addon_web_control_web_open_own_context_menu_v1; + PFN_INT_KODI_ADDON_WEB_CREATE_CONTROL_V1 kodi_addon_web_create_control_v1; + PFN_INT_KODI_ADDON_WEB_DESTROY_CONTROL_V1 kodi_addon_web_destroy_control_v1; + PFN_INT_KODI_ADDON_WEB_MAIN_INITIALIZE_V1 kodi_addon_web_main_initialize_v1; + PFN_INT_KODI_ADDON_WEB_MAIN_LOOP_V1 kodi_addon_web_main_loop_v1; + PFN_INT_KODI_ADDON_WEB_MAIN_SHUTDOWN_V1 kodi_addon_web_main_shutdown_v1; + PFN_INT_KODI_ADDON_WEB_SET_LANGUAGE_V1 kodi_addon_web_set_language_v1; + PFN_INT_KODI_ADDON_WEB_SET_MUTE_V1 kodi_addon_web_set_mute_v1; + PFN_INT_KODI_ADDON_WEB_START_INSTANCE_V1 kodi_addon_web_start_instance_v1; + PFN_INT_KODI_ADDON_WEB_STOP_INSTANCE_V1 kodi_addon_web_stop_instance_v1; +}; + +//}}} + +/* Confirm after autogen the correctness here! */ +/*---AUTO_GEN_PARSE---*/ + +struct IFC_WEB_ADDON_GUI_PROPS +{ + IFC_WEB_ADDON_GUI_PROPS() = default; + IFC_WEB_ADDON_GUI_PROPS(const WEB_ADDON_GUI_PROPS* c_data) + { + if (c_data == nullptr) + return; + + memcpy(strName.data(), c_data->strName, WEB_MAX_NAME_STRING_SIZE); + pDevice = PtrValue(c_data->pDevice); + fXPos = c_data->fXPos; + fYPos = c_data->fYPos; + fWidth = c_data->fWidth; + fHeight = c_data->fHeight; + fPixelRatio = c_data->fPixelRatio; + fFPS = c_data->fFPS; + fSkinXPos = c_data->fSkinXPos; + fSkinYPos = c_data->fSkinYPos; + fSkinWidth = c_data->fSkinWidth; + fSkinHeight = c_data->fSkinHeight; + bUseTransparentBackground = c_data->bUseTransparentBackground; + iBackgroundColorARGB = c_data->iBackgroundColorARGB; + iGUIItemLeft = c_data->iGUIItemLeft; + iGUIItemRight = c_data->iGUIItemRight; + iGUIItemTop = c_data->iGUIItemTop; + iGUIItemBottom = c_data->iGUIItemBottom; + iGUIItemBack = c_data->iGUIItemBack; + pControlIdent = PtrValue(c_data->pControlIdent); + } + + void SetCStructure(WEB_ADDON_GUI_PROPS* c_data) + { + if (c_data == nullptr) + return; + + memcpy(c_data->strName, strName.data(), WEB_MAX_NAME_STRING_SIZE); + c_data->pDevice = reinterpret_cast(pDevice); + c_data->fXPos = fXPos; + c_data->fYPos = fYPos; + c_data->fWidth = fWidth; + c_data->fHeight = fHeight; + c_data->fPixelRatio = fPixelRatio; + c_data->fFPS = fFPS; + c_data->fSkinXPos = fSkinXPos; + c_data->fSkinYPos = fSkinYPos; + c_data->fSkinWidth = fSkinWidth; + c_data->fSkinHeight = fSkinHeight; + c_data->bUseTransparentBackground = bUseTransparentBackground; + c_data->iBackgroundColorARGB = iBackgroundColorARGB; + c_data->iGUIItemLeft = iGUIItemLeft; + c_data->iGUIItemRight = iGUIItemRight; + c_data->iGUIItemTop = iGUIItemTop; + c_data->iGUIItemBottom = iGUIItemBottom; + c_data->iGUIItemBack = iGUIItemBack; + c_data->pControlIdent = reinterpret_cast(pControlIdent); + } + + std::array strName; + PtrValue pDevice; + float fXPos; + float fYPos; + float fWidth; + float fHeight; + float fPixelRatio; + float fFPS; + float fSkinXPos; + float fSkinYPos; + float fSkinWidth; + float fSkinHeight; + bool bUseTransparentBackground; + uint32_t iBackgroundColorARGB; + int iGUIItemLeft; + int iGUIItemRight; + int iGUIItemTop; + int iGUIItemBottom; + int iGUIItemBack; + PtrValue pControlIdent; + + MSGPACK_DEFINE(strName, + pDevice, + fXPos, + fYPos, + fWidth, + fHeight, + fPixelRatio, + fFPS, + fSkinXPos, + fSkinYPos, + fSkinWidth, + fSkinHeight, + bUseTransparentBackground, + iBackgroundColorARGB, + iGUIItemLeft, + iGUIItemRight, + iGUIItemTop, + iGUIItemBottom, + iGUIItemBack, + pControlIdent); +}; +/*---AUTO_GEN_PARSE---*/ + +typedef enum funcParent_addoninstance_web_h : int +{ + funcParent_kodi_addon_web_inhibit_shutdown_v1, + funcParent_kodi_addon_web_inhibit_screensaver_v1, + funcParent_kodi_addon_web_is_muted_v1, + funcParent_kodi_addon_web_control_set_control_ready_v1, + funcParent_kodi_addon_web_control_set_opened_address_v1, + funcParent_kodi_addon_web_control_set_opened_title_v1, + funcParent_kodi_addon_web_control_set_icon_url_v1, + funcParent_kodi_addon_web_control_set_fullscreen_v1, + funcParent_kodi_addon_web_control_set_loading_state_v1, + funcParent_kodi_addon_web_control_set_tooltip_v1, + funcParent_kodi_addon_web_control_set_status_message_v1, + funcParent_kodi_addon_web_control_request_open_site_in_new_tab_v1, +} funcParent_addoninstance_web_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_web_inhibit_shutdown(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, bool inhibit); __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_web_inhibit_shutdown_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_web_inhibit_shutdown_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_web_inhibit_screensaver(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, bool inhibit); __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_web_inhibit_screensaver_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_web_inhibit_screensaver_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_web_is_muted(KODI_ADDON_INSTANCE_BACKEND_HDL hdl); __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_web_is_muted_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_web_is_muted_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_control_ready(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, bool ready); __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_web_control_set_control_ready_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_control_ready_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_opened_address(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* title); __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_web_control_set_opened_address_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_opened_address_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_opened_title(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* title); __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_web_control_set_opened_title_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_opened_title_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_icon_url(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* icon); __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_web_control_set_icon_url_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_icon_url_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_fullscreen(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, bool fullscreen); __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_web_control_set_fullscreen_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_fullscreen_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_loading_state(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, bool isLoading, bool canGoBack, bool canGoForward); __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_web_control_set_loading_state_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_loading_state_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_tooltip(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* tooltip); __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_web_control_set_tooltip_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_tooltip_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_set_status_message(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* status); __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_web_control_set_status_message_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_web_control_set_status_message_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT void kodi_addon_web_control_request_open_site_in_new_tab(KODI_ADDON_INSTANCE_BACKEND_HDL hdl, WEB_KODI_CONTROL handle, const char* url); __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_web_control_request_open_site_in_new_tab_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_web_control_request_open_site_in_new_tab_v1; /* Autogenerated */ +/*---AUTO_GEN_PARSE---*/ +// clang-format on + +//============================================================================== + +typedef enum funcChild_addoninstance_web_h : int +{ + funcChild_kodi_addon_web_start_instance_v1, + funcChild_kodi_addon_web_stop_instance_v1, + funcChild_kodi_addon_web_main_initialize_v1, + funcChild_kodi_addon_web_main_loop_v1, + funcChild_kodi_addon_web_main_shutdown_v1, + funcChild_kodi_addon_web_set_mute_v1, + funcChild_kodi_addon_web_set_language_v1, + funcChild_kodi_addon_web_create_control_v1, + funcChild_kodi_addon_web_destroy_control_v1, + funcChild_kodi_addon_web_control_render_init_v1, + funcChild_kodi_addon_web_control_render_deinit_v1, + funcChild_kodi_addon_web_control_render_v1, + funcChild_kodi_addon_web_control_dirty_v1, + funcChild_kodi_addon_web_control_on_init_v1, + funcChild_kodi_addon_web_control_on_action_v1, + funcChild_kodi_addon_web_control_on_mouse_event_v1, + funcChild_kodi_addon_web_control_open_website_v1, + funcChild_kodi_addon_web_control_get_history_v1, + funcChild_kodi_addon_web_control_search_text_v1, + funcChild_kodi_addon_web_control_stop_search_v1, + funcChild_kodi_addon_web_control_web_cmd_reload_v1, + funcChild_kodi_addon_web_control_web_cmd_stop_load_v1, + funcChild_kodi_addon_web_control_web_cmd_nav_back_v1, + funcChild_kodi_addon_web_control_web_cmd_nav_forward_v1, + funcChild_kodi_addon_web_control_web_open_own_context_menu_v1, + funcChild_kodi_addon_web_control_screen_size_change_v1, +} funcChild_addoninstance_web_h; + +// clang-format off +/*---AUTO_GEN_PARSE---*/ +// Original API call: typedef enum WEB_ADDON_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_START_INSTANCE_V1)(const KODI_ADDON_WEB_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_web_start_instance_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_start_instance_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_STOP_INSTANCE_V1)(const KODI_ADDON_WEB_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_web_stop_instance_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_stop_instance_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_MAIN_INITIALIZE_V1)(const KODI_ADDON_WEB_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_web_main_initialize_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_main_initialize_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_MAIN_LOOP_V1)(const KODI_ADDON_WEB_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_web_main_loop_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_main_loop_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_MAIN_SHUTDOWN_V1)(const KODI_ADDON_WEB_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_web_main_shutdown_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_main_shutdown_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_SET_MUTE_V1)(const KODI_ADDON_WEB_HDL hdl, bool mute); +typedef std::tuple msgChild__IN_kodi_addon_web_set_mute_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_set_mute_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_SET_LANGUAGE_V1)(const KODI_ADDON_WEB_HDL hdl, const char* language); +typedef std::tuple msgChild__IN_kodi_addon_web_set_language_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_set_language_v1; /* Autogenerated */ +// Original API call: typedef enum WEB_ADDON_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CREATE_CONTROL_V1)(const KODI_ADDON_WEB_HDL hdl, const struct WEB_ADDON_GUI_PROPS* props, const char* start_url, WEB_KODI_CONTROL* handle); +typedef std::tuple msgChild__IN_kodi_addon_web_create_control_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_create_control_v1; /* Autogenerated */ +// Original API call: typedef enum WEB_ADDON_ERROR(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_DESTROY_CONTROL_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, bool complete); +typedef std::tuple msgChild__IN_kodi_addon_web_destroy_control_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_destroy_control_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_RENDER_INIT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); +typedef std::tuple msgChild__IN_kodi_addon_web_control_render_init_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_render_init_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_RENDER_DEINIT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); +typedef std::tuple msgChild__IN_kodi_addon_web_control_render_deinit_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_render_deinit_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_RENDER_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); +typedef std::tuple msgChild__IN_kodi_addon_web_control_render_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_render_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_DIRTY_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); +typedef std::tuple msgChild__IN_kodi_addon_web_control_dirty_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_dirty_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_ON_INIT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); +typedef std::tuple msgChild__IN_kodi_addon_web_control_on_init_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_on_init_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_ON_ACTION_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, const struct KODI_ADDON_ACTION_DATA* action, int* nextItem); +typedef std::tuple msgChild__IN_kodi_addon_web_control_on_action_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_on_action_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_ON_MOUSE_EVENT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, int id, double x, double y, double offsetX, double offsetY, int state); +typedef std::tuple msgChild__IN_kodi_addon_web_control_on_mouse_event_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_on_mouse_event_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_OPEN_WEBSITE_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, const char* url); +typedef std::tuple msgChild__IN_kodi_addon_web_control_open_website_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_open_website_v1; /* Autogenerated */ +// Original API call: typedef bool(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_GET_HISTORY_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, char*** list, size_t* entries, bool behind_current); +typedef std::tuple msgChild__IN_kodi_addon_web_control_get_history_v1; /* Autogenerated */ +typedef std::tuple, size_t> msgChild_OUT_kodi_addon_web_control_get_history_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SEARCH_TEXT_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, const char* text, bool forward, bool matchCase, bool findNext); +typedef std::tuple msgChild__IN_kodi_addon_web_control_search_text_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_search_text_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_STOP_SEARCH_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, bool clearSelection); +typedef std::tuple msgChild__IN_kodi_addon_web_control_stop_search_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_stop_search_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_RELOAD_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); +typedef std::tuple msgChild__IN_kodi_addon_web_control_web_cmd_reload_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_cmd_reload_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_STOP_LOAD_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); +typedef std::tuple msgChild__IN_kodi_addon_web_control_web_cmd_stop_load_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_cmd_stop_load_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_BACK_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); +typedef std::tuple msgChild__IN_kodi_addon_web_control_web_cmd_nav_back_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_cmd_nav_back_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_CMD_NAV_FORWARD_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); +typedef std::tuple msgChild__IN_kodi_addon_web_control_web_cmd_nav_forward_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_cmd_nav_forward_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_WEB_OPEN_OWN_CONTEXT_MENU_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle); +typedef std::tuple msgChild__IN_kodi_addon_web_control_web_open_own_context_menu_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_web_open_own_context_menu_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_WEB_CONTROL_SCREEN_SIZE_CHANGE_V1)(const KODI_ADDON_WEB_HDL hdl, const WEB_KODI_CONTROL handle, float x, float y, float width, float height, bool fullscreen); +typedef std::tuple msgChild__IN_kodi_addon_web_control_screen_size_change_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_web_control_screen_size_change_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..4a06de8f0be1a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/addon_base.h @@ -0,0 +1,466 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_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---*/ + PFN_KODI_ADDON_CREATE_INSTANCE_V1 create_instance; /*---AUTO---*/ + PFN_KODI_ADDON_DESTROY_INSTANCE_V1 destroy_instance; /*---AUTO---*/ + PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_STRING_V1 + instance_setting_change_string; /*---AUTO---*/ + PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_BOOLEAN_V1 + instance_setting_change_boolean; /*---AUTO---*/ + PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_INTEGER_V1 + instance_setting_change_integer; /*---AUTO---*/ + PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_FLOAT_V1 + instance_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---*/ + +union KODI_ADDON_INSTANCE_FUNC_UNION +{ + struct KODI_ADDON_INSTANCE_FUNC v1; +}; + +/*---AUTO_GEN_PARSE---*/ + +#ifndef MSGPACK_ADD_ENUM_KODI_ADDON_INSTANCE_TYPE +#define MSGPACK_ADD_ENUM_KODI_ADDON_INSTANCE_TYPE +MSGPACK_ADD_ENUM(KODI_ADDON_INSTANCE_TYPE); +#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*, + double*); +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_INSTANCE_GET_SETTING_BOOL_V1)( + void*, const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, bool*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_GET_SETTING_FLOAT_V1)( + void*, const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, double*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_GET_SETTING_INT_V1)( + void*, const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, int*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_GET_SETTING_STRING_V1)( + void*, const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, char**); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_IS_SETTING_USING_DEFAULT_V1)( + void*, const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_SET_SETTING_BOOL_V1)( + void*, const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, bool); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_SET_SETTING_FLOAT_V1)( + void*, const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, double); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_SET_SETTING_INT_V1)( + void*, const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, int); +typedef bool(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_SET_SETTING_STRING_V1)( + void*, const KODI_ADDON_INSTANCE_BACKEND_HDL, const char*, const 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*, + double); +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_ADDON_PATH_V1)(void*); +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_TEMP_PATH_V1)(void*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_GET_USER_PATH_V1)(void*); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_GET_USER_PATH_V1)( + void*, const KODI_ADDON_INSTANCE_BACKEND_HDL); +typedef char*(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_LOCALIZED_STRING_V1)(void*, long); +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_ADDON_PATH_V1 kodi_addon_get_addon_path_v1; + 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_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_INSTANCE_GET_SETTING_BOOL_V1 kodi_addon_instance_get_setting_bool_v1; + PFN_INT_KODI_ADDON_INSTANCE_GET_SETTING_FLOAT_V1 kodi_addon_instance_get_setting_float_v1; + PFN_INT_KODI_ADDON_INSTANCE_GET_SETTING_INT_V1 kodi_addon_instance_get_setting_int_v1; + PFN_INT_KODI_ADDON_INSTANCE_GET_SETTING_STRING_V1 kodi_addon_instance_get_setting_string_v1; + PFN_INT_KODI_ADDON_INSTANCE_GET_USER_PATH_V1 kodi_addon_instance_get_user_path_v1; + PFN_INT_KODI_ADDON_INSTANCE_IS_SETTING_USING_DEFAULT_V1 + kodi_addon_instance_is_setting_using_default_v1; + PFN_INT_KODI_ADDON_INSTANCE_SET_SETTING_BOOL_V1 kodi_addon_instance_set_setting_bool_v1; + PFN_INT_KODI_ADDON_INSTANCE_SET_SETTING_FLOAT_V1 kodi_addon_instance_set_setting_float_v1; + PFN_INT_KODI_ADDON_INSTANCE_SET_SETTING_INT_V1 kodi_addon_instance_set_setting_int_v1; + PFN_INT_KODI_ADDON_INSTANCE_SET_SETTING_STRING_V1 kodi_addon_instance_set_setting_string_v1; + PFN_INT_KODI_ADDON_IS_SETTING_USING_DEFAULT_V1 kodi_addon_is_setting_using_default_v1; + PFN_INT_KODI_ADDON_LOCALIZED_STRING_V1 kodi_addon_localized_string_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 KODI_ADDON_INSTANCE_HDL(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_CREATE_V1)( + void*, KODI_ADDON_INSTANCE_BACKEND_HDL); +typedef enum ADDON_STATUS(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_CREATE_INSTANCE_V1)( + void*, const KODI_ADDON_HDL, const struct KODI_ADDON_INSTANCE_INFO*, KODI_HANDLE*); +typedef enum ADDON_STATUS(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_CREATE_V1)( + void*, const struct KODI_ADDON_INSTANCE_INFO*, KODI_ADDON_HDL*); +typedef enum ADDON_STATUS(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_SETTING_CHANGE_BOOLEAN_V1)( + void*, const KODI_ADDON_HDL, const KODI_ADDON_INSTANCE_HDL, const char*, bool); +typedef enum ADDON_STATUS(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_SETTING_CHANGE_FLOAT_V1)( + void*, const KODI_ADDON_HDL, const KODI_ADDON_INSTANCE_HDL, const char*, double); +typedef enum ADDON_STATUS(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_SETTING_CHANGE_INTEGER_V1)( + void*, const KODI_ADDON_HDL, const KODI_ADDON_INSTANCE_HDL, const char*, int); +typedef enum ADDON_STATUS(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_SETTING_CHANGE_STRING_V1)( + void*, const KODI_ADDON_HDL, const KODI_ADDON_INSTANCE_HDL, const char*, const char*); +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*, double); +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, const struct KODI_ADDON_INSTANCE_INFO*, const KODI_HANDLE); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_DESTROY_V1)(void*, KODI_ADDON_HDL); +typedef void(ATTR_INT_APIENTRYP PFN_INT_KODI_ADDON_INSTANCE_DESTROY_V1)(void*, + KODI_ADDON_INSTANCE_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_INSTANCE_CREATE_V1 kodi_addon_instance_create_v1; + PFN_INT_KODI_ADDON_INSTANCE_DESTROY_V1 kodi_addon_instance_destroy_v1; + PFN_INT_KODI_ADDON_INSTANCE_SETTING_CHANGE_BOOLEAN_V1 + kodi_addon_instance_setting_change_boolean_v1; + PFN_INT_KODI_ADDON_INSTANCE_SETTING_CHANGE_FLOAT_V1 kodi_addon_instance_setting_change_float_v1; + PFN_INT_KODI_ADDON_INSTANCE_SETTING_CHANGE_INTEGER_V1 + kodi_addon_instance_setting_change_integer_v1; + PFN_INT_KODI_ADDON_INSTANCE_SETTING_CHANGE_STRING_V1 kodi_addon_instance_setting_change_string_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; +}; + +//}}} + +/* Confirm after autogen the correctness here! */ +/*---AUTO_GEN_PARSE---*/ + +struct IFC_KODI_ADDON_INSTANCE_INFO +{ + IFC_KODI_ADDON_INSTANCE_INFO() = default; + IFC_KODI_ADDON_INSTANCE_INFO(const KODI_ADDON_INSTANCE_INFO* c_data) + { + if (c_data == nullptr) + return; + + type = c_data->type; + instance_id = c_data->instance_id; + if (c_data->unique_work_id) + unique_work_id = c_data->unique_work_id; + kodi = PtrValue(c_data->kodi); + parent = PtrValue(c_data->parent); + } + + void SetCStructure(KODI_ADDON_INSTANCE_INFO* c_data) + { + if (c_data == nullptr) + return; + + c_data->type = type; + c_data->instance_id = instance_id; + c_data->unique_work_id = unique_work_id.c_str(); + c_data->kodi = reinterpret_cast(kodi); + c_data->parent = reinterpret_cast(parent); + } + + enum KODI_ADDON_INSTANCE_TYPE type; + uint32_t instance_id; + std::string unique_work_id; + PtrValue kodi; + PtrValue parent; + + MSGPACK_DEFINE(type, instance_id, unique_work_id, kodi, parent); +}; +/*---AUTO_GEN_PARSE---*/ + +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_addon_path_v1, + funcParent_kodi_addon_get_lib_path_v1, + funcParent_kodi_addon_get_user_path_v1, + funcParent_kodi_addon_get_temp_path_v1, + funcParent_kodi_addon_localized_string_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_kodi_addon_instance_get_user_path_v1, + funcParent_kodi_addon_instance_is_setting_using_default_v1, + funcParent_kodi_addon_instance_get_setting_bool_v1, + funcParent_kodi_addon_instance_get_setting_int_v1, + funcParent_kodi_addon_instance_get_setting_float_v1, + funcParent_kodi_addon_instance_get_setting_string_v1, + funcParent_kodi_addon_instance_set_setting_bool_v1, + funcParent_kodi_addon_instance_set_setting_int_v1, + funcParent_kodi_addon_instance_set_setting_float_v1, + funcParent_kodi_addon_instance_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_addon_path() __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_get_addon_path_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_get_addon_path_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_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_localized_string(long label_id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_localized_string_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_localized_string_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, double* 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, double 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 */ +// Original API call: ATTR_DLL_EXPORT char* kodi_addon_instance_get_user_path(const KODI_ADDON_INSTANCE_BACKEND_HDL hdl) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_instance_get_user_path_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_instance_get_user_path_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_is_setting_using_default( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_instance_is_setting_using_default_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_instance_is_setting_using_default_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_bool( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, bool* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_instance_get_setting_bool_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_instance_get_setting_bool_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_int( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, int* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_instance_get_setting_int_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_instance_get_setting_int_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_float( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, double* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_instance_get_setting_float_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_instance_get_setting_float_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_get_setting_string( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, char** value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_instance_get_setting_string_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_instance_get_setting_string_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_bool( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, bool value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_instance_set_setting_bool_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_instance_set_setting_bool_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_int( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, int value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_instance_set_setting_int_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_instance_set_setting_int_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_float( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, double value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_instance_set_setting_float_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_instance_set_setting_float_v1; /* Autogenerated */ +// Original API call: ATTR_DLL_EXPORT bool kodi_addon_instance_set_setting_string( const KODI_ADDON_INSTANCE_BACKEND_HDL hdl, const char* id, const char* value) __INTRODUCED_IN_KODI(1); +typedef std::tuple msgParent__IN_kodi_addon_instance_set_setting_string_v1; /* Autogenerated */ +typedef std::tuple msgParent_OUT_kodi_addon_instance_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_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_kodi_addon_create_instance_v1, + funcChild_kodi_addon_destroy_instance_v1, + funcChild_kodi_addon_instance_setting_change_string_v1, + funcChild_kodi_addon_instance_setting_change_boolean_v1, + funcChild_kodi_addon_instance_setting_change_integer_v1, + funcChild_kodi_addon_instance_setting_change_float_v1, + funcChild_kodi_addon_instance_create_v1, + funcChild_kodi_addon_instance_destroy_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)(const struct KODI_ADDON_INSTANCE_INFO* first_instance, KODI_ADDON_HDL* hdl); +typedef std::tuple msgChild__IN_kodi_addon_create_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_create_v1; /* Autogenerated */ +// 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_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, double 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 */ +// Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_CREATE_INSTANCE_V1)(const KODI_ADDON_HDL hdl, const struct KODI_ADDON_INSTANCE_INFO* info, struct KODI_ADDON_INSTANCE_STRUCT* instance); +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, const struct KODI_ADDON_INSTANCE_INFO* info, const KODI_ADDON_INSTANCE_HDL instance_hdl); +typedef std::tuple msgChild__IN_kodi_addon_destroy_instance_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_destroy_instance_v1; /* Autogenerated */ +// Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_STRING_V1)(const KODI_ADDON_HDL hdl, const KODI_ADDON_INSTANCE_HDL instance_hdl, const char* name, const char* value); +typedef std::tuple msgChild__IN_kodi_addon_instance_setting_change_string_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_instance_setting_change_string_v1; /* Autogenerated */ +// Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_BOOLEAN_V1)(const KODI_ADDON_HDL hdl, const KODI_ADDON_INSTANCE_HDL instance_hdl, const char* name, bool value); +typedef std::tuple msgChild__IN_kodi_addon_instance_setting_change_boolean_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_instance_setting_change_boolean_v1; /* Autogenerated */ +// Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_INTEGER_V1)(const KODI_ADDON_HDL hdl, const KODI_ADDON_INSTANCE_HDL instance_hdl, const char* name, int value); +typedef std::tuple msgChild__IN_kodi_addon_instance_setting_change_integer_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_instance_setting_change_integer_v1; /* Autogenerated */ +// Original API call: typedef enum ADDON_STATUS(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_SETTING_CHANGE_FLOAT_V1)(const KODI_ADDON_HDL hdl, const KODI_ADDON_INSTANCE_HDL instance_hdl, const char* name, double value); +typedef std::tuple msgChild__IN_kodi_addon_instance_setting_change_float_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_instance_setting_change_float_v1; /* Autogenerated */ +// Original API call: typedef KODI_ADDON_INSTANCE_HDL(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_CREATE_V1)(KODI_ADDON_INSTANCE_BACKEND_HDL kodi_hdl); +typedef std::tuple msgChild__IN_kodi_addon_instance_create_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_instance_create_v1; /* Autogenerated */ +// Original API call: typedef void(ATTR_APIENTRYP PFN_KODI_ADDON_INSTANCE_DESTROY_V1)(KODI_ADDON_INSTANCE_HDL hdl); +typedef std::tuple msgChild__IN_kodi_addon_instance_destroy_v1; /* Autogenerated */ +typedef std::tuple msgChild_OUT_kodi_addon_instance_destroy_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..f94ac991ca9ef --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/audio_engine.h @@ -0,0 +1,320 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..f28b039fd9b0d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/filesystem.h @@ -0,0 +1,727 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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, + uint32_t); +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; + lowrate = c_data->lowrate; + } + + 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->lowrate = lowrate; + } + + uint64_t forward; + uint32_t maxrate; + uint32_t currate; + uint32_t lowrate; + + MSGPACK_DEFINE(forward, maxrate, currate, lowrate); +}; +/*---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, uint32_t 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..00b1a7b28ec48 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/general.h @@ -0,0 +1,233 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..9f0b0b89e9f35 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/button.h @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..200b02b819429 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/edit.h @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..ecac133b2b592 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/fade_label.h @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..5f771dcd919a5 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/image.h @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..3a8831197f31b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/label.h @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..295543e49016c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/progress.h @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..a7040e291a86f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/radio_button.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..549fc7ba6ea7e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/rendering.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..780a6f332c930 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/settings_slider.h @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..e4b031fdfdddf --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/slider.h @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..1fa7c700fd34f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/spin.h @@ -0,0 +1,194 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..bb3d7bce46840 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/controls/text_box.h @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..77197b3d76201 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/context_menu.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..df5ebb27656dd --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/extended_progress.h @@ -0,0 +1,169 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..05473b11e4b50 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/filebrowser.h @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..144d34bd42c75 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/keyboard.h @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..6970ceded231b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/numeric.h @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..0db1192e4e655 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/ok.h @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..d6f2171f68dc9 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/progress.h @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..01dea0ed1f7a6 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/select.h @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..0a76c75293cc6 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/text_viewer.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..08389783a1383 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/dialogs/yes_no.h @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..509a79692cc7b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/general.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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_CONTEXT(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_CONTEXT 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/input/action.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/input/action.h new file mode 100644 index 0000000000000..fa4671f79a9fa --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/input/action.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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/input/action.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_ADDON_ACTION +#define MSGPACK_ADD_ENUM_ADDON_ACTION +MSGPACK_ADD_ENUM(ADDON_ACTION); +#endif + +namespace KODI +{ +namespace ADDONS +{ +namespace INTERFACE +{ + +struct IFC_KODI_ADDON_ACTION_DATA +{ + IFC_KODI_ADDON_ACTION_DATA() = default; + IFC_KODI_ADDON_ACTION_DATA(const KODI_ADDON_ACTION_DATA* c_data) + { + if (c_data == nullptr) + return; + + id = c_data->id; + if (c_data->name) + name = c_data->name; + memcpy(amount.data(), c_data->amount, ADDON_ACTION_AMOUNT_MAX); + repeat = c_data->repeat; + hold_time = c_data->hold_time; + button_code = c_data->button_code; + unicode = c_data->unicode; + if (c_data->text) + text = c_data->text; + } + + void SetCStructure(KODI_ADDON_ACTION_DATA* c_data) + { + if (c_data == nullptr) + return; + + c_data->id = id; + c_data->name = name.c_str(); + memcpy(c_data->amount, amount.data(), ADDON_ACTION_AMOUNT_MAX); + c_data->repeat = repeat; + c_data->hold_time = hold_time; + c_data->button_code = button_code; + c_data->unicode = unicode; + c_data->text = text.c_str(); + } + + enum ADDON_ACTION id; + std::string name; + std::array amount; + float repeat; + unsigned int hold_time; + unsigned int button_code; + wchar_t unicode; + std::string text; + + MSGPACK_DEFINE(id, name, amount, repeat, hold_time, button_code, unicode, text); +}; + +/* 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/gui/list_item.h b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/list_item.h new file mode 100644 index 0000000000000..76fdd2c055b40 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/list_item.h @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..e131a311552d0 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/gui/window.h @@ -0,0 +1,403 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..52f87bd9c456b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/monitor.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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..9e24e2cc59cb5 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/api/network.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2005-2022 Team Kodi + * 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/src/shared/socket.h b/xbmc/addons/kodi-dev-kit/src/shared/socket.h new file mode 100644 index 0000000000000..7e980b75ae572 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/src/shared/socket.h @@ -0,0 +1,86 @@ +#pragma once + +#include +#include + +#include +#include + +inline int create_socket(const char *path) +{ + int sock = socket(AF_UNIX, SOCK_DGRAM, 0); + + struct sockaddr_un addr; + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, path); + unlink(path); + if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) + { + fprintf(stderr, "---------------111\n"); + exit(-1); + } + + return sock; +} + +inline int connect_socket(int sock, const char *path) +{ + struct sockaddr_un addr; + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, path); + return connect(sock, (struct sockaddr *)&addr, sizeof(addr)); +} + +inline void write_fd(int sock, int fd, void *data, size_t data_len) +{ + struct msghdr msg = {}; + char buf[CMSG_SPACE(sizeof(fd))]; + memset(buf, '\0', sizeof(buf)); + + struct iovec io = {.iov_base = data, .iov_len = data_len}; + + msg.msg_iov = &io; + msg.msg_iovlen = 1; + msg.msg_control = buf; + msg.msg_controllen = sizeof(buf); + + struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_RIGHTS; + cmsg->cmsg_len = CMSG_LEN(sizeof(fd)); + + memmove(CMSG_DATA(cmsg), &fd, sizeof(fd)); + + msg.msg_controllen = CMSG_SPACE(sizeof(fd)); + + if (sendmsg(sock, &msg, 0) < 0) + { + fprintf(stderr, "---------------222\n"); + exit(-1); + } +} + +inline void read_fd(int sock, int *fd, void *data, size_t data_len) +{ + struct msghdr msg = {}; + + struct iovec io = {.iov_base = data, .iov_len = data_len}; + msg.msg_iov = &io; + msg.msg_iovlen = 1; + + char c_buffer[256]; + msg.msg_control = c_buffer; + msg.msg_controllen = sizeof(c_buffer); + + if (recvmsg(sock, &msg, 0) < 0) + { + fprintf(stderr, "---------------333\n"); + exit(-1); + } + + struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); + + memmove(fd, CMSG_DATA(cmsg), sizeof(fd)); +} 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 index 06cf8101868fc..e13e3a3206cbe 100755 --- a/xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/code_generator.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# Copyright (C) 2021 Team Kodi +# Copyright (C) 2021-2022 Team Kodi # This file is part of Kodi - https://kodi.tv # # SPDX-License-Identifier: GPL-2.0-or-later @@ -9,23 +9,71 @@ KODI_DIR = "../../../../../" DEVKIT_DIR = "xbmc/addons/kodi-dev-kit" +INTERFACE_DIR = "xbmc/addons/interface" +LAST_ERROR = "" # Global includes from optparse import OptionParser # Own includes +from src.interface_code_generator import * from src.commitChanges import * from src.generateCMake__CMAKE_TREEDATA_COMMON_addon_dev_kit_txt import * +from src.generateCMake__CMAKE_TREEDATA_COMMON_addon_interface_txt import * from src.generateCMake__XBMC_ADDONS_KODIDEVKIT_INCLUDE_KODI_allfiles import * -from src.helper_Log import * +from src.generateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_allfiles import * +from src.generateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_cmakelists_txt import * +from src.generateScan__USED_API import * +from src.generateScan__USED_VALUES import * +from src.generateScan__CALLBACK_USE_PLACES import * +from src.generateSource__XBMC_ADDONS_INTERFACE_interface_cpp_h import * +from src.generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_API_DL_kodi_api_NR_c_h import * +from src.generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_CORE_addon_control_cpp import * +from src.generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_directdata_h import * +from src.generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_instances_h import * +from src.generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_sharedgroups_h import * +from src.tools.helper_Log import * + + +#=============================================================================== +def GenerateSourceParts(options, data): + Log.PrintGroupStart("Generate source code parts") + + # Generate xbmc/addons/kodi-dev-kit/src/shared/DirectData.h + GenerateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_directdata_h(options) + + # Generate automatic code inside xbmc/addons/interface/interface.cpp and .h + GenerateSource__XBMC_ADDONS_INTERFACE_interface_cpp_h(options) + + # Generate automatic code inside xbmc/addons/kodi-dev-kit/src/addon/core/addon_control.cpp + GenerateSource__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_CORE_addon_control_cpp(options) + + # This generate automatic code inside xbmc/addons/kodi-dev-kit/src/shared/Instances.h + GenerateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_instances_h(options) + + # Update xbmc/addons/kodi-dev-kit/src/shared/SharedGroups.h + GenerateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_sharedgroups_h(options) + # =============================================================================== def GenerateCMakeParts(options): Log.PrintGroupStart("Generate cmake parts") - # Generate Kodi's cmake system related include files to find related parts + # Generate all the "CMakeLists.txt" files in xbmc/addons/kodi-dev-kit/include/kodi GenerateCMake__XBMC_ADDONS_KODIDEVKIT_INCLUDE_KODI_all_files(options) + + # Generate the "CMakeLists.txt" in xbmc/addons/kodi-dev-kit/src/shared + GenerateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_cmakelists_txt(options) + + # Generate all the "CMakeLists.txt" files in xbmc/addons/kodi-dev-kit/src/addon + GenerateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_all_files(options) + + # This call generate the "CMakeLists.txt" in xbmc/addons/interface + GenerateCMake__XBMC_ADDONS_INTERFACE_all_files(options) + + # Generate Kodi's cmake system related include files to find related parts GenerateCMake__CMAKE_TREEDATA_COMMON_addon_dev_kit_txt(options) + GenerateCMake__CMAKE_TREEDATA_COMMON_addon_interface_txt(options) # =============================================================================== @@ -65,6 +113,31 @@ def GenerateCMakeParts(options): Log.Init(options) Log.PrintMainStart(options) + ##---------------------------------------------------------------------------- + # + Log.PrintGroupStart("Auto generation of addon interface code started") + + if os.path.isdir('./tmp'): + shutil.rmtree('./tmp') + + ScanUsedAPI(options) + ScanAllHdlVoidPointer(options) + ScanAllEnums(options) + + callbacks = FindCallbackUsePlaces(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 + GenerateSourceParts(options, data) + ##---------------------------------------------------------------------------- # CMake generation GenerateCMakeParts(options) @@ -74,3 +147,137 @@ def GenerateCMakeParts(options): if options.commit: Log.PrintGroupStart("Git update") CommitChanges(options) + + + +##=============================================================================== +#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 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) + + +#>>>>>>> 59b1afa1dd (update) 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..6f729f2f945f4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/ignored_api_structs.txt @@ -0,0 +1,2 @@ +KODI_INSTANCE_HDL +KODI_ADDON_INSTANCE_STRUCT diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/commitChanges.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/commitChanges.py index 896cca55e5238..d8846579e019c 100644 --- a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/commitChanges.py +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/commitChanges.py @@ -9,8 +9,12 @@ # Own includes from code_generator import DEVKIT_DIR, KODI_DIR from .generateCMake__CMAKE_TREEDATA_COMMON_addon_dev_kit_txt import * +from .generateCMake__CMAKE_TREEDATA_COMMON_addon_interface_txt import * +from .generateCMake__XBMC_ADDONS_INTERFACE_allfiles import * from .generateCMake__XBMC_ADDONS_KODIDEVKIT_INCLUDE_KODI_allfiles import * -from .helper_Log import * +from .generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_directdata_h import * +from .generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_sharedgroups_h import * +from .tools.helper_Log import * # Global includes import importlib, os, subprocess @@ -44,15 +48,31 @@ def CommitChanges(options): r = Repo(KODI_DIR) for x in r.index.diff("HEAD"): - if GenerateCMake__XBMC_ADDONS_KODIDEVKIT_INCLUDE_KODI_all_files_RelatedCheck( - x.b_path - ): - Log.PrintBegin(" - Changed file {}".format(x.b_path)) - contains_devkit_change = True - changes_list.append(x.b_path) - Log.PrintResult(Result.NEW if x.new_file else Result.UPDATE) - elif GenerateCMake__CMAKE_TREEDATA_COMMON_addon_dev_kit_txt_RelatedCheck( - x.b_path + if ( + GenerateCMake__XBMC_ADDONS_KODIDEVKIT_INCLUDE_KODI_all_files_RelatedCheck( + x.b_path + ) + or GenerateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_all_files_RelatedCheck( + x.b_path + ) + or GenerateCMake__XBMC_ADDONS_INTERFACE_all_files_RelatedCheck( + x.b_path + ) + or GenerateCMake__CMAKE_TREEDATA_COMMON_addon_dev_kit_txt_RelatedCheck( + x.b_path + ) + or GenerateCMake__CMAKE_TREEDATA_COMMON_addon_interface_txt_RelatedCheck( + x.b_path + ) + or GenerateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_cmakelists_txt_RelatedCheck( + x.b_path + ) + or GenerateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_directdata_h_RelatedCheck( + x.b_path + ) + or GenerateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_sharedgroups_h_RelatedCheck( + x.b_path + ) ): Log.PrintBegin(" - Changed file {}".format(x.b_path)) contains_devkit_change = True diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__CMAKE_TREEDATA_COMMON_addon_dev_kit_txt.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__CMAKE_TREEDATA_COMMON_addon_dev_kit_txt.py index 20ed4476db389..74cfaa35c4f67 100644 --- a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__CMAKE_TREEDATA_COMMON_addon_dev_kit_txt.py +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__CMAKE_TREEDATA_COMMON_addon_dev_kit_txt.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (C) 2021 Team Kodi +# Copyright (C) 2021-2022 Team Kodi # This file is part of Kodi - https://kodi.tv # # SPDX-License-Identifier: GPL-2.0-or-later @@ -8,7 +8,8 @@ # Own includes from code_generator import DEVKIT_DIR, KODI_DIR -from .helper_Log import * +from .tools.helper_Log import * +from .tools.sub_file_hdl import * # Global includes import glob, os, re @@ -46,6 +47,10 @@ def GenerateCMake__CMAKE_TREEDATA_COMMON_addon_dev_kit_txt(options): cmake_dir, m.group(1) ) 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' + parts += 'xbmc/addons/kodi-dev-kit/src/addon_runner addon_runner # Hardcoded entry, edit script for change!\n' + #parts += 'xbmc/addons/kodi-dev-kit/src/addon_language addon_language # Hardcoded entry, edit script for change!\n' file = "{}{}".format(KODI_DIR, gen_file) present = os.path.isfile(file) if not present or parts != open(file).read() or options.force: diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__CMAKE_TREEDATA_COMMON_addon_interface_txt.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__CMAKE_TREEDATA_COMMON_addon_interface_txt.py new file mode 100644 index 0000000000000..1e78d9238a5fc --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__CMAKE_TREEDATA_COMMON_addon_interface_txt.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +# Own includes +from code_generator import DEVKIT_DIR, KODI_DIR, INTERFACE_DIR +from .tools.helper_Log import * + +# Global includes +import glob, os, re + + +def GenerateCMake__CMAKE_TREEDATA_COMMON_addon_interface_txt_RelatedCheck(filename): + """ + This function is called by git update to be able to assign changed files to the dev kit. + """ + return True if filename == "cmake/treedata/common/addon_interface.txt" else False + + +def GenerateCMake__CMAKE_TREEDATA_COMMON_addon_interface_txt(options): + """ + This function generate the "cmake/treedata/common/addon_interface.txt" + by scan of related directories to use for add-on interface build. + """ + gen_file = "cmake/treedata/common/addon_interface.txt" + + Log.PrintBegin("Check for {}".format(gen_file)) + + scan_dir = "{}{}/**/CMakeLists.txt".format(KODI_DIR, INTERFACE_DIR) + parts = "# Auto generated {}.\n" "# See {}/tools/code-generator.py.\n\n".format( + gen_file, DEVKIT_DIR + ) + + for entry in glob.glob(scan_dir, recursive=True): + 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 += "{} {}\n".format(cmake_dir, m.group(1)) + break + file = "{}{}".format(KODI_DIR, gen_file) + present = os.path.isfile(file) + if not present or parts != open(file).read() or options.force: + with open(file, "w") as f: + f.write(parts) + Log.PrintResult(Result.NEW if not present else Result.UPDATE) + else: + Log.PrintResult(Result.ALREADY_DONE) diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_INTERFACE_allfiles.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_INTERFACE_allfiles.py new file mode 100644 index 0000000000000..7fa29ce0fc3dc --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_INTERFACE_allfiles.py @@ -0,0 +1,152 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +# Own includes +from code_generator import DEVKIT_DIR, KODI_DIR, INTERFACE_DIR +from .tools.helper_Log import * + +# Global includes +import glob, os, re + + +def GenerateCMake__XBMC_ADDONS_INTERFACE_all_files_RelatedCheck(filename): + """ + This function is called by git update to be able to assign changed files to the dev kit. + """ + scan_dir = "{}{}/**/".format(KODI_DIR, INTERFACE_DIR) + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = "{}CMakeLists.txt".format(dir.replace(KODI_DIR, "")) + if source_dir == filename: + return True + + return False + + +def GenerateCMake__XBMC_ADDONS_INTERFACE_all_files(options): + """ + This function generate the "CMakeLists.txt" in xbmc/addons/interface + and sub dirs by scan of available files + """ + Log.PrintBegin("Generate CMakeLists.txt files in {} dirs".format(INTERFACE_DIR)) + Log.PrintResult(Result.SEE_BELOW) + + scan_dir = "{}{}/**/".format(KODI_DIR, INTERFACE_DIR) + + found = False + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = dir.replace(KODI_DIR, "") + Log.PrintBegin(" - Check {}CMakeLists.txt".format(source_dir)) + + os_limits = [] + + # 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": + if src_part.endswith(".in"): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + 'File extensions with ".h.in" are currently not supported and require revision of Kodi\'s cmake system!' + ) + exit(1) + for entry in m.group(2).split(","): + entry = entry.strip() + if not entry in os_limits: + os_limits.append(entry) + source_entry.append( + "$<$:{}>".format( + entry, + src_part.replace(dir, "").replace(".in", ""), + ) + ) + found = True + break + if not found: + source_entry.append(src_part.replace(dir, "")) + found = False + + cmake_src_text = "set(SOURCES\n{})\n".format( + "".join(" {}\n".format(entry) for entry in source_entry) + ) + + # 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": + if src_part.endswith(".in"): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + 'File extensions with ".h.in" are currently not supported and require revision of Kodi\'s cmake system!' + ) + exit(1) + for entry in m.group(2).split(","): + entry = entry.strip() + if not entry in os_limits: + os_limits.append(entry) + header_entry.append( + "$<$:{}>".format( + entry, + src_part.replace(dir, "").replace(".in", ""), + ) + ) + found = True + break + if not found: + header_entry.append(src_part.replace(dir, "")) + found = False + + if len(os_limits) > 0: + Log.PrintFollow( + " (Contains limited OS header: {})".format( + ", ".join(map(str, os_limits)) + ) + ) + + cmake_hdr_text = "set(HEADERS\n{})\n".format( + "".join(" {}\n".format(entry) for entry in header_entry) + ) + + # 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 {}/tools/code-generator.py.\n" + "\n" + "{}" + "\n" + "{}" + "\n" + "if(NOT ENABLE_STATIC_LIBS OR SOURCES)\n" + " core_add_library({})\n" + "endif()\n".format(DEVKIT_DIR, cmake_src_text, cmake_hdr_text, cmake_part) + ) + + file = "{}CMakeLists.txt".format(dir) + present = os.path.isfile(file) + if not present or cmake_file != open(file).read() or options.force: + with open(file, "w") as f: + f.write(cmake_file) + Log.PrintResult(Result.NEW if not present else Result.UPDATE) + else: + Log.PrintResult(Result.ALREADY_DONE) diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_KODIDEVKIT_INCLUDE_KODI_allfiles.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_KODIDEVKIT_INCLUDE_KODI_allfiles.py index c1000bec2fe64..f5f9121660b74 100644 --- a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_KODIDEVKIT_INCLUDE_KODI_allfiles.py +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_KODIDEVKIT_INCLUDE_KODI_allfiles.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (C) 2021 Team Kodi +# Copyright (C) 2021-2022 Team Kodi # This file is part of Kodi - https://kodi.tv # # SPDX-License-Identifier: GPL-2.0-or-later @@ -8,7 +8,7 @@ # Own includes from code_generator import DEVKIT_DIR, KODI_DIR -from .helper_Log import * +from .tools.helper_Log import * # Global includes import glob, os, re diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_allfiles.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_allfiles.py new file mode 100644 index 0000000000000..f1eb8d5176392 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_allfiles.py @@ -0,0 +1,200 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +# Own includes +from code_generator import DEVKIT_DIR, KODI_DIR +from .tools.helper_Log import * + +# Global includes +import glob, os, re + + +def GenerateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_all_files_RelatedCheck(filename): + """ + This function is called by git update to be able to assign changed files to the dev kit. + """ + scan_dir = "{}{}/src/addon/**/".format(KODI_DIR, DEVKIT_DIR) + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = "{}CMakeLists.txt".format(dir.replace(KODI_DIR, "")) + if source_dir == filename: + return True + + return False + + +def GenerateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_all_files(options): + """ + 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. + """ + Log.PrintBegin( + "Generate CMakeLists.txt files in {}/src/addon dirs".format(DEVKIT_DIR) + ) + + scan_dir = "{}{}/src/addon/**/*/".format(KODI_DIR, DEVKIT_DIR) + + base_cmake_subdirs = "" + base_cmake_file = "{}{}/src/addon/CMakeLists.txt".format(KODI_DIR, DEVKIT_DIR) + if not os.path.exists(base_cmake_file): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + "Needed {} not present!".format(base_cmake_file.replace(KODI_DIR, "")) + ) + exit(1) + else: + Log.PrintResult(Result.SEE_BELOW) + + found = False + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for dir in dirs: + source_dir = dir.replace(KODI_DIR, "") + + if "/third_party/" in source_dir: + if os.path.basename(os.path.dirname(os.path.dirname(dir))) == "third_party": + Log.PrintBegin(" - Check {}CMakeLists.txt ".format(source_dir)) + Log.PrintFollow("(Used by third party modules)") + cmake_dir = source_dir[len("{}/src/addon/".format(DEVKIT_DIR)) : -1] + base_cmake_subdirs += "add_subdirectory(" + cmake_dir + ")\n" + Log.PrintResult(Result.ALREADY_DONE) + continue + + Log.PrintBegin(" - Check {}CMakeLists.txt".format(source_dir)) + + os_limits = [] + + # Scan for *.cpp + source_entry = [] + src_parts = sorted(glob.glob("{}*.c*".format(dir), 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": + if src_part.endswith(".in"): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + 'File extensions with ".h.in" are currently not supported and require revision of Kodi\'s cmake system!' + ) + exit(1) + for entry in m.group(2).split(","): + entry = entry.strip() + if not entry in os_limits: + os_limits.append(entry) + source_entry.append( + "$<$:{}>".format( + entry, + src_part.replace(dir, "").replace(".in", ""), + ) + ) + found = True + break + if not found: + source_entry.append(src_part.replace(dir, "")) + found = False + + cmake_src_text = "set(SOURCES\n{})\n".format( + "".join(" {}\n".format(entry) for entry in source_entry) + ) + + # Scan for *.h + header_entry = [] + src_parts = sorted(glob.glob("{}*.h*".format(dir), 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": + if src_part.endswith(".in"): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + 'File extensions with ".h.in" are currently not supported and require revision of Kodi\'s cmake system!' + ) + exit(1) + for entry in m.group(2).split(","): + entry = entry.strip() + if not entry in os_limits: + os_limits.append(entry) + header_entry.append( + "$<$:{}>".format( + entry, + src_part.replace(dir, "").replace(".in", ""), + ) + ) + found = True + break + if not found: + header_entry.append(src_part.replace(dir, "")) + found = False + + cmake_hdr_text = "set(HEADERS\n{})\n".format( + "".join(" {}\n".format(entry) for entry in header_entry) + ) + + # Generate cmake sub part name + cmake_dir = source_dir[len("{}/src/addon/".format(DEVKIT_DIR)) : -1] + cmake_part = cmake_dir.replace("/", "_").rstrip("_") + + # Make final CMakeLists.txt + cmake_file = ( + "# Auto generated CMakeLists.txt.\n" + "# See {}/tools/code-generator.py.\n" + "\n" + "{}" + "\n" + "{}" + "\n" + "if(SOURCES OR HEADERS)\n" + " devkit_add_object(devkit_{})\n" + "endif()\n".format(DEVKIT_DIR, cmake_src_text, cmake_hdr_text, cmake_part) + ) + + file = "{}CMakeLists.txt".format(dir) + present = os.path.isfile(file) + if not present or cmake_file != open(file).read() or options.force: + with open(file, "w") as f: + f.write(cmake_file) + Log.PrintResult(Result.NEW if not present else Result.UPDATE) + else: + Log.PrintResult(Result.ALREADY_DONE) + + base_cmake_subdirs += "add_subdirectory(" + cmake_dir + ")\n" + + Log.PrintBegin(" - Check {}".format(base_cmake_file.replace(KODI_DIR, ""))) + Log.PrintFollow(" (Hand edited file with auto part update)") + + cmake_file = "" + f = open(base_cmake_file, "r") + data = f.read() + f.close() + 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 options.force: + with open(base_cmake_file, "w") as f: + f.write(cmake_file) + Log.PrintResult(Result.UPDATE) + else: + Log.PrintResult(Result.ALREADY_DONE) diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_cmakelists_txt.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_cmakelists_txt.py new file mode 100644 index 0000000000000..d2ee9003aa0d7 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_cmakelists_txt.py @@ -0,0 +1,182 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +# Own includes +from code_generator import DEVKIT_DIR, KODI_DIR +from .tools.helper_Log import * + +# Global includes +import glob, os, re + + +def GenerateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_cmakelists_txt_RelatedCheck( + filename, +): + """ + This function is called by git update to be able to assign changed files to the dev kit. + """ + filename = "{}{}/src/shared/CMakeLists.txt".format(KODI_DIR, DEVKIT_DIR) + if source_dir == filename: + return True + + return False + + +def GenerateCMake__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_cmakelists_txt(options): + """ + 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. + """ + Log.PrintBegin("Generate {}/src/shared/CMakeLists.txt".format(DEVKIT_DIR)) + + base_dir = "{}{}/src/shared/".format(KODI_DIR, DEVKIT_DIR) + scan_dir = "{}**/".format(base_dir) + + base_cmake_file = "{}/CMakeLists.txt".format(base_dir) + if not os.path.exists(base_cmake_file): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + "Needed {} not present!".format(base_cmake_file.replace(KODI_DIR, "")) + ) + exit(1) + + found = False + os_limits = [] + 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("{}*.c*".format(dir), 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": + if src_part.endswith(".in"): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + 'File extensions with ".h.in" are currently not supported and require revision of Kodi\'s cmake system!' + ) + exit(1) + for entry in m.group(2).split(","): + entry = entry.strip() + if not entry in os_limits: + os_limits.append(entry) + source_entry.append( + "$<$:{}>".format( + entry, + src_part.replace( + base_dir, "${CMAKE_CURRENT_SOURCE_DIR}/" + ).replace(".in", ""), + ) + ) + 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("{}*.h*".format(dir), 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": + if src_part.endswith(".in"): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + 'File extensions with ".h.in" are currently not supported and require revision of Kodi\'s cmake system!' + ) + exit(1) + for entry in m.group(2).split(","): + entry = entry.strip() + if not entry in os_limits: + os_limits.append(entry) + header_entry.append( + "$<$:{}>".format( + entry, + src_part.replace( + base_dir, "${CMAKE_CURRENT_SOURCE_DIR}/" + ).replace(".in", ""), + ) + ) + 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{})".format( + "".join(" {}\n".format(entry) for entry in source_entry) + ) + + CMAKE_SHARED_DEV_KIT_HEADERS = "set(HEADERS\n{})".format( + "".join(" {}\n".format(entry) for entry in header_entry) + ) + + source_file = "" + f = open(base_cmake_file, "r") + data = f.read() + f.close + start_1 = False + start_2 = False + for line in data.splitlines(): + # Source 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 + # Header include + 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: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + "Needed CMAKE_SHARED_DEV_KIT_SOURCES_END or CMAKE_SHARED_DEV_KIT_HEADERS_END not present in {}!".format( + base_cmake_file.replace(KODI_DIR, "") + ) + ) + exit(1) + + if source_file != data or options.force: + with open(base_cmake_file, "w") as f: + f.write(source_file) + Log.PrintResult(Result.UPDATE) + else: + Log.PrintResult(Result.ALREADY_DONE) diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateScan__CALLBACK_USE_PLACES.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateScan__CALLBACK_USE_PLACES.py new file mode 100644 index 0000000000000..76a3b93ea3579 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateScan__CALLBACK_USE_PLACES.py @@ -0,0 +1,200 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +# Own includes +from code_generator import DEVKIT_DIR, KODI_DIR, INTERFACE_DIR +from .tools.sub_file_hdl import * +from .tools.helpers import * + +# Global includes +import glob, os, re, filecmp, shutil + + +class found_callback_function: + def __init__(self): + api_call = "" + complete = "" + function_name = "" + class_name = "" + call_class = "" + header = "" + + +class found_callback_render_class: + def __init__(self): + file_text = "" + header = "" + +def FindCallbackUsePlaces(options): + Log.PrintBegin("Scanning for use places of callbacks in Kodi: ") + + ret_list = [] + ret_list_callback_render = [] + + search_dir = "{}xbmc".format(KODI_DIR) + ignored_dir1 = "{}/addons/kodi-dev-kit".format(search_dir) + scan_dir = "{}/**/*.h*".format(search_dir) + dirs = sorted(glob.glob(scan_dir, recursive=True)) + for path in dirs: + if path.startswith(ignored_dir1): + continue + + file_text = read_file(path) + if not file_text: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + file_text2 = "" + in_doc = False + in_private = False + last_count_type = [] + group_start = False + prev_line = "" + + + # Override and add AUTO_GEN_PARSE + # if IOffscreenRenderProcess inside. + if "INTERFACE::IOffscreenRenderProcess" in file_text: + found = found_callback_render_class() + found.header = path.replace(search_dir + "/", "") + found.file_text = file_text + ret_list_callback_render.append(found) + + if not "---AUTO_GEN_PARSE---\*\/$", line) + if m and m.group(1): + found = found_callback_function() + found.api_call = m.group(1) + found.complete = re.sub( + r"(?<=[,])(?=[^\s])", + r" ", + (prev_line.split(";")[-2] if line.startswith("/*") else line) + .split("override")[0] + .split("{")[0] + .strip(), + ) + 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 + + Log.PrintFollow("{} use places".format(len(ret_list))) + Log.PrintResult(Result.OK) + + if options.debug: + Log.PrintBegin("- Used:") + Log.PrintResult(Result.SEE_BELOW) + Log.PrintFollow( + "".join( + " {}\n".format(entry.complete) + for entry in ret_list + ) + ) + + return ret_list, ret_list_callback_render diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateScan__USED_API.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateScan__USED_API.py new file mode 100644 index 0000000000000..0ea46b1ed6693 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateScan__USED_API.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +# Own includes +from code_generator import DEVKIT_DIR, KODI_DIR, INTERFACE_DIR +from .tools.helper_Log import * +from .tools.sub_file_hdl import * + +# Global includes +import re + +LOWEST_API = -1 +HIGHEST_API = -1 + + +def ScanUsedAPI(options): + global LOWEST_API + global HIGHEST_API + + Log.PrintBegin("Check used API versions") + + data = read_file("{}{}/include/kodi/c-api/version.h".format(KODI_DIR, DEVKIT_DIR)) + if not data: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + version_list = [] + for line in data.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): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + 'Inside "kodi-dev-kit/include/kodi/c-api/version.h" for API {} define set with different number {}.\n' + " Both should equal!".format( + m.group(1), m.group(2) + ) + ) + exit(1) + 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: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + "It seems between Kodi min API {} and max API {} is API {} missing!\n" + ' Is "kodi-dev-kit/include/kodi/c-api/version.h" set correct?'.format( + LOWEST_API, HIGHEST_API, start_api + ) + ) + exit(1) + start_api += 1 + + if HIGHEST_API < 0: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + " Failed to get currently highest used api version!\n" + ' Is "kodi-dev-kit/include/kodi/c-api/version.h" available and set correct?' + ) + exit(1) + + Log.PrintResult(Result.SEE_BELOW) + Log.PrintBegin("- Highest on scan found and used Kodi API version: ") + Log.PrintFollow(str(HIGHEST_API)) + Log.PrintResult(Result.OK) + Log.PrintBegin("- Lowest on scan found and used Kodi API version: ") + Log.PrintFollow(str(LOWEST_API)) + Log.PrintResult(Result.OK) + return HIGHEST_API + + +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 ScanUsedAPI where scan on init both + ScanUsedAPI() + 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 + + # If not present start ScanUsedAPI where scan on init both + ScanUsedAPI() + 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/generateScan__USED_VALUES.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateScan__USED_VALUES.py new file mode 100644 index 0000000000000..8607eaa599246 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateScan__USED_VALUES.py @@ -0,0 +1,270 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +# Own includes +from code_generator import DEVKIT_DIR, KODI_DIR, INTERFACE_DIR +from .tools.helper_Log import * +from .tools.sub_file_hdl import * + +# Global includes +import glob, re + +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_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' ] + +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_VOID_PTR_DEFINES = [] # List created by ScanAllHdlVoidPointer +KNOWN_ENUMS = [] # List created by ScanAllEnums +KNOWN_ENUMS_DEFAULT = [] # List created by ScanAllEnums + + +def ScanAllHdlVoidPointer(options): + Log.PrintBegin("Check used void pointers: ") + + search_dir = "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_DIR) + scan_dir = "{}/**/".format(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: + data = read_file(src_part) + if not data: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + for line in data.splitlines(): + m = re.search("^.*?#define\ *([a-zA-Z[0-9_]*)\ *(void\*|KODI_ADDON_INSTANCE_HDL)", line) + if m and m.group(1) and not m.group(1) in KNOWN_VOID_PTR_DEFINES: + KNOWN_VOID_PTR_DEFINES.append(m.group(1)) + continue + m = re.search("^.*typedef* (void|KODI_ADDON_INSTANCE_HDL)\** ([a-zA-Z[0-9_]*)\ *;$", line) + if m and m.group(2) and not m.group(2) in KNOWN_VOID_PTR_DEFINES: + KNOWN_VOID_PTR_DEFINES.append(m.group(2)) + continue + + Log.PrintFollow( + "{} different values with 'void*'".format(len(KNOWN_VOID_PTR_DEFINES)) + ) + Log.PrintResult(Result.OK) + + if options.debug: + Log.PrintBegin("- Used:") + Log.PrintResult(Result.SEE_BELOW) + Log.PrintFollow( + "".join( + " {}\n".format(entry) + for entry in KNOWN_VOID_PTR_DEFINES + ) + ) + + +def ScanAllEnums(options): + Log.PrintBegin("Check used enum's: ") + + search_dir = "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_DIR) + scan_dir = "{}/**/".format(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: + data = read_file(src_part) + if not data: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + 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 + + Log.PrintFollow("{} different enums".format(len(KNOWN_ENUMS))) + Log.PrintResult(Result.OK) + + if options.debug: + Log.PrintBegin("- Used:") + Log.PrintResult(Result.SEE_BELOW) + Log.PrintFollow( + "".join( + " {}\n".format(entry) for entry in KNOWN_ENUMS + ) + ) + + +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 + +def ContainsHdlVoidPointer(value): + value = value.replace('const ', '') + if value.split(' ', 1)[0] in KNOWN_VOID_PTR_DEFINES: + return True + return False + + +def ContainsHdlVoidAsReturnPointer(value): + print(value) + if value.count("*") == 1 and value.split('*', 1)[0].strip() in KNOWN_VOID_PTR_DEFINES: + return True + return False + + +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 diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__DEV_KIT_INSTANCE_CONSTRUCT.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__DEV_KIT_INSTANCE_CONSTRUCT.py new file mode 100644 index 0000000000000..95e5fdaaddfd1 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__DEV_KIT_INSTANCE_CONSTRUCT.py @@ -0,0 +1,253 @@ +from code_generator import * +from .tools.sub_file_hdl import * +from .tools.helpers import * + +import glob, os, re, filecmp, 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 + + Log.PrintBegin("Generate instance create & destroy code within dev kit library ") + + 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 + + value = src_part.replace(search_dir, "").replace(".h", "").replace("-", "") + value_override = value + if ( + not "PFN_KODI_ADDON_{}_CREATE_V;".format(value.upper()) in file_text + and "PFN_KODI_ADDON_INSTANCE_CREATE_" in file_text + ): + value_override = "INSTANCE" + + instance_stucts.append((value, value_override)) + + lowest_api = GetLowestUsedAPI() + highest_api = GetHighestUsedAPI() + Log.PrintFollow("(Used API, lowerst = {}, highest = {})".format(lowest_api, highest_api)) + + Log.PrintResult(Result.SEE_BELOW) + + # --------------------------------------------------------------------------- + # Generate part for "CHdl_kodi_addon_base_h::kodi_addon_create_instance" + Log.PrintBegin(' - Generate part for: ') + Log.PrintFollow('"CHdl_kodi_addon_base_h::kodi_addon_create_instance"') + + code = ( + "ADDON_STATUS dummy()\n{\n" + ' // Autogenerated by "Generate_kodi_addon_instance_construct.py", edit this for code changes!\n' + " ADDON_STATUS status;\n" + " UnionAddonFunctions* data = reinterpret_cast(hdl);\n" + " if (data->types.kodi_addon.v1.create_instance)\n" + " {\n" + " UnionAddonFunctions* instanceStruct = new UnionAddonFunctions();\n" + " instanceStruct->type = info->type;\n" + " instanceStruct->kodi = info->kodi;\n" + "\n" + " KODI_ADDON_INSTANCE_STRUCT addonInstance;\n" + " addonInstance.dummy = &instanceStruct->types.dummy;\n" + "\n" + " status = data->types.kodi_addon.v1.create_instance(data->hdl, info, &addonInstance);\n" + " if (!addonInstance.dummy && status == ADDON_STATUS_OK)\n" + " {\n" + " status = ADDON_STATUS_PERMANENT_FAILURE;\n" + " }\n" + " else if (addonInstance.dummy)\n" + " {\n" + ) + + for entry, value_override in instance_stucts: + funcname = "kodi_addon_{}".format(entry) + funcname_override = "kodi_addon_{}".format(value_override) + filename = "{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/{}.h".format( + KODI_DIR, entry + ) + + if IsHighestUsedFunctionVersion( + filename, funcname_override + "_create", "create", lowest_api + ): + code += ( + " if (info->type == ADDON_INSTANCE_{0})\n" + " {{\n" + " if (&instanceStruct->types.{1}.v{2} != reinterpret_casttypes.{1}.v{2})*>(addonInstance.{3}))\n" + " instanceStruct->types.{1}.v{2} = *reinterpret_casttypes.{1}.v{2})*>(addonInstance.{3});\n" + " if (instanceStruct->types.{1}.v{2}.create)\n" + " instanceStruct->hdl = instanceStruct->types.{1}.v{2}.create(instance);\n" + " else\n" + " instanceStruct->hdl = addonInstance.hdl;\n" + " goto done;\n" + " }}\n" + ).format(entry.upper(), funcname, lowest_api, entry) + else: + code += ( + " if (info->type == ADDON_INSTANCE_{0})\n" + " {{\n" + " switch (AddonIfc::g_ifc->api)\n" + " {{\n" + ).format(entry.upper()) + for i in range(highest_api, lowest_api - 1, -1): + code += " case __KODI_API_{}__:\n".format(i) + if not IsLowerToUsedFunctionVersion( + filename, funcname_override + "_create", "create", i + ): + code += ( + " {{\n" + " if (&instanceStruct->types.{0}.v{1} != reinterpret_casttypes.{0}.v{1})*>(addonInstance.{2}))\n" + " instanceStruct->types.{0}.v{1} = *reinterpret_casttypes.{0}.v{1})*>(addonInstance.{2});\n" + " if (instanceStruct->types.{0}.v{1}.create)\n" + " instanceStruct->hdl = instanceStruct->types.{0}.v{1}.create(instance);\n" + " else\n" + " instanceStruct->hdl = addonInstance.hdl;\n" + " goto done;\n" + " }}\n" + ).format(funcname, i, entry) + code += ( + " default:\n" " break;\n" " }\n" " }\n" + ) + code += ( + " done:\n" + " *instance = instanceStruct;\n" + " return status;\n" + " }\n" + "\n" + " delete instanceStruct;\n" + " }\n" + " else\n" + " status = ADDON_STATUS_NOT_IMPLEMENTED;\n" + "\n" + " return status;\n" + "}\n" + ) + + # Make temporary file for clang cleanup + temp_file = "./tmp/addon-instance/Generate_kodi_addon_create_instance.cpp" + if not write_file(temp_file, code, True): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + code = read_file(temp_file) + if not code: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + self.create_code = code.split("\n", 2)[2].rsplit("\n", 2)[0] + Log.PrintResult(Result.OK) + + # --------------------------------------------------------------------------- + # Generate part for "CHdl_kodi_addon_base_h::kodi_addon_destroy_instance" + + Log.PrintBegin(' - Generate part for: ') + Log.PrintFollow('"CHdl_kodi_addon_base_h::kodi_addon_destroy_instance"') + + code = ( + "void dummy()\n{\n" + ' // Autogenerated by "Generate_kodi_addon_instance_construct.py", edit this for code changes!\n' + " UnionAddonFunctions* data = reinterpret_cast(hdl);\n" + " UnionAddonFunctions* instanceStruct = reinterpret_cast(instance);\n" + " if (instanceStruct)\n" + " {\n" + ) + + for entry, value_override in instance_stucts: + funcname = "kodi_addon_{}".format(entry) + funcname_override = "kodi_addon_{}".format(value_override) + filename = "{}xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/{}.h".format( + KODI_DIR, entry + ) + + if IsHighestUsedFunctionVersion( + filename, funcname_override + "_destroy", "destroy", lowest_api + ): + code += ( + " if (info->type == ADDON_INSTANCE_{0})\n" + " {{\n" + " if (instanceStruct->types.{1}.v{2}.destroy)\n" + " instanceStruct->types.{1}.v{2}.destroy(instanceStruct->hdl);\n" + " goto done;\n" + " }}\n" + ).format(entry.upper(), funcname, lowest_api) + else: + code += ( + " if (info->type == ADDON_INSTANCE_{})\n" + " {{\n" + " switch (AddonIfc::g_ifc->api)\n" + " {{\n" + ).format(entry.upper()) + for i in range(highest_api, lowest_api - 1, -1): + code += " case __KODI_API_{}__:\n".format(i) + if not IsLowerToUsedFunctionVersion( + filename, funcname_override + "_destroy", "destroy", i + ): + code += ( + " {{\n" + " if (instanceStruct->types.{0}.v{1}.destroy)\n" + " instanceStruct->types.{0}.v{1}.destroy(instanceStruct->hdl);\n" + " goto done;\n" + " }}\n" + ).format(funcname, i) + code += "\n" " default:\n" " break;\n" " }\n" " }\n" + + code += ( + " done:\n" + " if (data->types.kodi_addon.v1.destroy_instance)\n" + " {\n" + " data->types.kodi_addon.v1.destroy_instance(data->hdl, info, instanceStruct->hdl);\n" + " }\n" + " delete instanceStruct;\n" + " }\n" + "}\n" + ) + + # Make temporary file for clang cleanup + temp_file = "./tmp/addon-instance/Generate_kodi_addon_destroy_instance.cpp" + if not write_file(temp_file, code, True): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + code = read_file(temp_file) + if not code: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + self.destroy_code = code.split("\n", 2)[2].rsplit("\n", 2)[0] + Log.PrintResult(Result.OK) diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_INTERFACE_interface_cpp_h.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_INTERFACE_interface_cpp_h.py new file mode 100644 index 0000000000000..1ebfe5fb32490 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_INTERFACE_interface_cpp_h.py @@ -0,0 +1,149 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +# Own includes +from code_generator import DEVKIT_DIR, KODI_DIR, INTERFACE_DIR, LAST_ERROR +from .tools.helper_Log import * +from .tools.helpers import * +from .tools.sub_file_hdl import * + +# Global includes +import glob, os + + +def GenerateSource__XBMC_ADDONS_INTERFACE_interface_cpp_h(options): + base_dir_cpp = "{}{}/Interface.cpp".format(KODI_DIR, INTERFACE_DIR) + base_dir_h = "{}{}/Interface.h".format(KODI_DIR, INTERFACE_DIR) + + Log.PrintBegin( + "Generate part changes in {} and {}".format( + base_dir_cpp.replace(KODI_DIR, ""), base_dir_h.replace(KODI_DIR, "") + ) + ) + + for entry in [base_dir_cpp, base_dir_h]: + if not os.path.exists(entry): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + "ERROR: Needed {} not present!".format(entry.replace(KODI_DIR, "")) + ) + exit(1) + + src_list_include = "" + src_list_set1 = "" + src_list_set2 = "" + hdr_list_set1 = "" + hdr_list_set2 = "" + search_dir = "{}{}/api/".format(KODI_DIR, INTERFACE_DIR) + scan_dir = "{}**/".format(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 = TranslatePathToCUsableString(src_part, search_dir) + src_list_set1 += ( + " kodi_{0} = new CHdl_kodi_{0}(*this);\n" + " m_handlers[funcGroup_{0}] = kodi_{0};\n".format(part_name) + ) + + src_list_set2 += " kodi_{0}->InitDirect(&m_directIfc->to_kodi.{0}, &m_directIfc->to_addon.{0});\n".format( + part_name + ) + + hdr_list_set1 += "class CHdl_kodi_{0};\n".format(part_name) + hdr_list_set2 += " CHdl_kodi_{0}* kodi_{0};\n".format(part_name) + + Log.PrintResult(Result.SEE_BELOW) + + # --------------------------------------------------------------------------- + + Log.PrintBegin(" - Check {}".format(base_dir_cpp.replace(KODI_DIR, ""))) + + data = read_file(base_dir_cpp) + if not data: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + new_code = "" + 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 += "{}\n".format(line) + + if "/*---AUTO_GEN_PARSE---*/" in line: + INTERFACE_CPP_SET_INCLUDE = True + + if "/*---AUTO_GEN_PARSE---*/" in line: + INTERFACE_CPP_SET_INCLUDE = False + new_code += "{}{}\n".format(src_list_include, line) + + if "/*---AUTO_GEN_PARSE---*/" in line: + INTERFACE_CPP_H_SET = True + + if u"/*---AUTO_GEN_PARSE---*/" in line: + INTERFACE_CPP_H_SET = False + new_code += ( + "{}" + "\n" + " if (m_directIfc != nullptr)\n" + " {{\n" + "{}" + " }}\n" + "{}\n".format(src_list_set1, src_list_set2, line) + ) + + if data != new_code: + Log.PrintResult(Result.UPDATE) + write_file(base_dir_cpp, new_code, True) + else: + Log.PrintResult(Result.ALREADY_DONE) + + # --------------------------------------------------------------------------- + + Log.PrintBegin(" - Check {}".format(base_dir_h.replace(KODI_DIR, ""))) + + data = read_file(base_dir_h) + if not data: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + new_code = "" + 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 += "{}\n".format(line) + + if "/*---AUTO_GEN_PARSE---*/" in line: + INTERFACE_CPP_H_SET1 = True + + if "/*---AUTO_GEN_PARSE---*/" in line: + INTERFACE_CPP_H_SET1 = False + new_code += "{}{}\n".format(hdr_list_set1, line) + + if "/*---AUTO_GEN_PARSE---*/" in line: + INTERFACE_CPP_H_SET2 = True + + if "/*---AUTO_GEN_PARSE---*/" in line: + INTERFACE_CPP_H_SET2 = False + new_code += "{}{}\n".format(hdr_list_set2, line) + + if data != new_code: + Log.PrintResult(Result.UPDATE) + write_file(base_dir_h, new_code, True) + else: + Log.PrintResult(Result.ALREADY_DONE) diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_API_DL_kodi_api_NR_c_h.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_API_DL_kodi_api_NR_c_h.py new file mode 100644 index 0000000000000..736bb025ce662 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_API_DL_kodi_api_NR_c_h.py @@ -0,0 +1,348 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +# Own includes +from code_generator import DEVKIT_DIR, KODI_DIR, INTERFACE_DIR +from .generateScan__USED_VALUES import * +from .tools.helper_Log import * +from .tools.sub_file_hdl import * +from .tools.helpers import * + +# Global includes +from hashlib import sha256 +import glob, os, re, filecmp, 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 = "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_DIR) + scan_dir = "{}/**/".format(search_dir) + + #----------------------------------------------------------------------- + # Create list of used API code parts + #{{{ + + Log.PrintBegin("Generate DL code load part files for API: ") + Log.PrintFollow(str(self.api)) + + 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("{}*.h*".format(dir), 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("") + + Log.PrintResult(Result.SEE_BELOW) + + #}}} + + #----------------------------------------------------------------------- + # Create file include/kodi/c-api/dl/kodi_api_[API].h + #{{{ + + Log.PrintBegin(" - Create file: ") + Log.PrintFollow("{}/include/kodi/c-api/dl/kodi_api_{}.h".format( + DEVKIT_DIR, self.api + ) + ) + + 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 = ( + "{0}" + "\n" + "/* API_HASH<{5}> */\n" + "\n" + "#ifndef C_API_DL_API_{1}_H\n" + "#define C_API_DL_API_{1}_H\n" + "\n" + '#include "../addon_base.h"\n' + "{2}" + "\n" + "#ifndef ATTR_DL_APIENTRYP\n" + "#define ATTR_DL_APIENTRYP ATTR_APIENTRYP\n" + "#endif\n" + "\n" + "#ifndef ATTR_DL_DLL_EXPORT\n" + "#define ATTR_DL_DLL_EXPORT ATTR_DLL_EXPORT\n" + "#endif\n" + "\n" + "#ifdef __cplusplus\n" + 'extern "C"\n' + "{{\n" + "#endif /* __cplusplus */\n" + "\n" + " struct kodi_api_{1};\n" + "\n" + " ATTR_DL_DLL_EXPORT bool load_kodi_api_{1}(struct kodi_api_{1}* api);\n" + "\n" + "{3}" + "\n" + "{4}" + "\n" + "#ifdef __cplusplus\n" + '}} /* extern "C" */\n' + "#endif /* __cplusplus */\n" + "\n" + "#endif /* C_API_DL_API_{1}_H */\n" + ).format( + HEADER_FILE_COPYRIGHT, self.api, includes_h, structs, code_part, hashedWord + ) + + target_file = "{}{}/include/kodi/c-api/dl/kodi_api_{}.h".format( + KODI_DIR, DEVKIT_DIR, self.api + ) + + temp_file = "./tmp/tmp-auto-gen.h" + if not write_file(temp_file, code_h, True): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + if ( + self.options.force + or not os.path.isfile(target_file) + or not filecmp.cmp(target_file, temp_file) + ): + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + Log.PrintResult(Result.UPDATE) + else: + Log.PrintResult(Result.ALREADY_DONE) + + #}}} + + #----------------------------------------------------------------------- + # Create file src/addon/api/dl/kodi_api_[API].c + #{{{ + Log.PrintBegin(" - Create file: ") + Log.PrintFollow("{}/src/addon/api/dl/kodi_api_{}.c".format( + DEVKIT_DIR, self.api + ) + ) + + code_c = ( + "{0}" + "\n" + "/* API_HASH<{5}> */\n" + "\n" + '#include "../../../../include/kodi/c-api/dl/kodi_api_{1}.h"\n' + "\n" + "{2}" + "\n" + "ATTR_DL_DLL_EXPORT bool load_kodi_api_{1}(struct kodi_api_{1}* api)\n" + "{{\n" + " if (api == NULL)\n" + " {{\n" + " return false;\n" + " }}\n" + "\n" + "{6}" + "\n" + " return true;\n" + "}}\n" + ).format( + HEADER_FILE_COPYRIGHT, + self.api, + includes_c, + structs, + code_part, + hashedWord, + "\n".join(self.api_list_code), + ) + + target_file = "{}{}/src/addon/api/dl/kodi_api_{}.c".format( + KODI_DIR, DEVKIT_DIR, self.api + ) + + temp_file = "./tmp/tmp-auto-gen.c" + if not write_file(temp_file, code_c, True): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + if ( + self.options.force + or not os.path.isfile(target_file) + or not filecmp.cmp(target_file, temp_file) + ): + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + Log.PrintResult(Result.UPDATE) + else: + Log.PrintResult(Result.ALREADY_DONE) + + #}}} + + return True if highest_found_api > self.api else False diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_CORE_addon_control_cpp.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_CORE_addon_control_cpp.py new file mode 100644 index 0000000000000..c8fde7494d031 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_CORE_addon_control_cpp.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +# Own includes +from code_generator import DEVKIT_DIR, KODI_DIR, INTERFACE_DIR +from .tools.helper_Log import * +from .tools.helpers import * +from .tools.sub_file_hdl import * + +# Global includes +import glob, os, re, filecmp, shutil + + +def GenerateSource__XBMC_ADDONS_KODIDEVKIT_SRC_ADDON_CORE_addon_control_cpp(options): + """ + 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 = "{}/src/addon/".format(DEVKIT_DIR) + file_name = "{}core/addon_control.cpp".format(base_dir) + target_file = "{}{}".format(KODI_DIR, file_name) + + Log.PrintBegin("Generate auto code in {}".format(file_name)) + + scan_dir = "{}{}api/**/".format(KODI_DIR, base_dir) + + 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("{}*.h*".format(dir), recursive=False)) + for src_part in src_parts: + src_part = src_part.replace("{}{}".format(KODI_DIR, base_dir), "") + + data = read_file(src_part.replace("api/", "../../include/kodi/c-api/")) + if not data: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + if not "ATTR_APIENTRYP" in data: + continue + + use_string = TranslatePathToCUsableString(src_part, "api/") + + CONTROL_SOURCE_INCLUDE += ('#include "{}"\n'.format(src_part)) + CONTROL_CLASS_CREATION += ( + " CHdl_kodi_{0}* {0} = new CHdl_kodi_{0}(m_ifc);\n" + " m_handlers[funcGroup_{0}] = {0};\n".format(use_string) + ) + CONTROL_CLASS_CREATION_2 += ( + " {0}->InitDirect(&m_ifc->direct->to_addon.{0});\n".format(use_string) + ) + + data = read_file(target_file) + if not data: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + file_text = "" + start_1 = False + start_2 = False + for line in data.splitlines(): + # Header include + if "---AUTO_GEN_PARSE---" in line: + file_text += ( + "{}\n" + "/* Code below autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator.py */\n".format( + line + ) + ) + start_1 = True + elif "---AUTO_GEN_PARSE---" in line: + file_text += "{}{}\n".format(CONTROL_SOURCE_INCLUDE, line) + start_1 = False + elif start_1: + continue + # Class creation + elif "---AUTO_GEN_PARSE---" in line: + file_text += ( + "{}\n" + " /* Code below autogenerated, see xbmc/addons/kodi-dev-kit/tools/code-generator.py */\n".format( + line + ) + ) + start_2 = True + elif "---AUTO_GEN_PARSE---" in line: + file_text += ( + "{}\n" + " if (m_ifc->direct != nullptr)\n" + " {{\n" + "{}" + " }}\n" + "{}\n".format(CONTROL_CLASS_CREATION, CONTROL_CLASS_CREATION_2, line) + ) + start_2 = False + elif start_2: + continue + else: + file_text += line + "\n" + + if start_1 or start_2: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + "ERROR: Needed CONTROL_CLASS_CREATION_END or CONTROL_SOURCE_INCLUDE_END not present in {}".format( + file_name + ) + ) + exit(1) + + # Make now the creation and copy of file + temp_file = target_file.replace("{}xbmc/addons".format(KODI_DIR), "./tmp") + if not write_file(temp_file, file_text, True): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + "Error: {}".format(code_generator.LAST_ERROR) + ) + exit(1) + + if options.force or not filecmp.cmp(target_file, temp_file): + shutil.copyfile(temp_file, target_file) + Log.PrintResult(Result.UPDATE) + else: + Log.PrintResult(Result.ALREADY_DONE) diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_directdata_h.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_directdata_h.py new file mode 100644 index 0000000000000..0b925919b41f6 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_directdata_h.py @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +# Own includes +from code_generator import DEVKIT_DIR, KODI_DIR, INTERFACE_DIR, LAST_ERROR +from .tools.helper_Log import * +from .tools.helpers import * +from .tools.sub_file_hdl import * + +# Global includes +import glob, os, filecmp, shutil + + +def GenerateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_directdata_h_RelatedCheck( + filename, +): + """ + This function is called by git update to be able to assign changed files to the dev kit. + """ + True if filename == "{}/src/shared/DirectData.h".format(DEVKIT_DIR) else False + + +def GenerateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_directdata_h(options): + search_dir = "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_DIR) + target_file = "{}{}/src/shared/DirectData.h".format(KODI_DIR, DEVKIT_DIR) + scan_dir = "{}**/".format(search_dir) + + Log.PrintBegin("Generate {}".format(target_file.replace(KODI_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("{}*.h*".format(dir), 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;") + + # Make final DirectData.h + file_text = """{0} +/* + * 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 + +{1} +#include "src/shared/api/processor.h" + +namespace KODI +{{ +namespace ADDONS +{{ +namespace INTERFACE +{{ + +struct DirectAddonIfcToKodi +{{ +{2} +}}; + +struct DirectAddonIfcToAddon +{{ +{3} + directFuncToAddon_processor_h processor_h; +}}; + +struct DirectAddonIfc +{{ + DirectAddonIfcToKodi to_kodi; + DirectAddonIfcToAddon to_addon; +}}; + +}} /* namespace INTERFACE */ +}} /* namespace ADDONS */ +}} /* namespace KODI */ + """.format( + HEADER_FILE_COPYRIGHT, + "\n".join(code_include), + "\n".join(code_struct_to_kodi), + "\n".join(code_struct_to_addon), + ) + + # Make now the creation and copy of file + temp_file = target_file.replace("{}xbmc/addons".format(KODI_DIR), "./tmp") + if not write_file(temp_file, file_text, True): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + "Error: {}".format(code_generator.LAST_ERROR) + ) + exit(1) + + present = os.path.isfile(target_file) + if (options.force or not present or not filecmp.cmp(target_file, temp_file)): + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + Log.PrintResult(Result.NEW if not present else Result.UPDATE) + else: + Log.PrintResult(Result.ALREADY_DONE) diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_instances_h.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_instances_h.py new file mode 100644 index 0000000000000..0e6d8c3ec426b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_instances_h.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +# Own includes +from code_generator import DEVKIT_DIR, KODI_DIR, INTERFACE_DIR +from .tools.helper_Log import * +from .tools.sub_file_hdl import * + +# Global includes +import glob, os, filecmp, shutil + + +def GenerateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_instances_h(options): + """ + This function generate automatic code inside xbmc/addons/kodi-dev-kit/src/shared/Instances.h + """ + Log.PrintBegin("Generate file {}/src/shared/Instances.h".format(DEVKIT_DIR)) + + target_file = "{}{}/src/shared/Instances.h".format(KODI_DIR, DEVKIT_DIR) + if not os.path.exists(target_file): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: File {} not exists!".format(target_file)) + exit(1) + + USED_INCLUDES = "" + USED_UNIONS = (" uint32_t dummy;\n" + " union KODI_ADDON_FUNC_UNION kodi_addon;\n") + + search_dir = "{}{}/src/shared/api/".format(KODI_DIR, DEVKIT_DIR) + scan_dir = "{}**/".format(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: + data = read_file(src_part) + if not data: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + found = "" + for line in data.splitlines(): + if "union KODI_" in line: + found = line + + if not found: + continue + + USED_INCLUDES += ( + '#include "src/shared/api/' + src_part.replace(search_dir, "") + '"\n' + ) + + USED_UNIONS += " {} {};\n".format( + found, found.replace("union ", "").replace("_FUNC_UNION", "").lower() + ) + + data = read_file(target_file) + if not data: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + 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" + + # Make now the creation and copy of file + temp_file = target_file.replace("{}xbmc/addons".format(KODI_DIR), "./tmp") + if not write_file(temp_file, file_text, True): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + exit(1) + + if options.force or not filecmp.cmp(target_file, temp_file): + shutil.copyfile(temp_file, target_file) + Log.PrintResult(Result.UPDATE) + else: + Log.PrintResult(Result.ALREADY_DONE) diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_sharedgroups_h.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_sharedgroups_h.py new file mode 100644 index 0000000000000..dd5e7175cccfe --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/generateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_sharedgroups_h.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +# Own includes +from code_generator import DEVKIT_DIR, KODI_DIR, INTERFACE_DIR +from .tools.helper_Log import * +from .tools.helpers import * + +# Global includes +import glob, os, re + + +def GenerateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_sharedgroups_h_RelatedCheck( + filename, +): + """ + This function is called by git update to be able to assign changed files to the dev kit. + """ + return ( + True if filename == "{}/src/shared/SharedGroups.h".format(DEVKIT_DIR) else False + ) + + +def GenerateSource__XBMC_ADDONS_KODIDEVKIT_SRC_SHARED_sharedgroups_h(options): + """ + 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 + """ + + source_file = "{}{}/src/shared/SharedGroups.h".format(KODI_DIR, DEVKIT_DIR) + + Log.PrintBegin( + "Generate used interface groups in {}".format(source_file.replace(KODI_DIR, "")) + ) + Log.PrintFollow(" (Hand edited file with auto part update)") + + if not os.path.exists(source_file): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + "Needed {} not present!".format(source_file.replace(KODI_DIR, "")) + ) + exit(1) + + new_source_insert = "" + search_dir = "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_DIR) + dirs = sorted(glob.glob("{}**/".format(search_dir), recursive=True)) + for dir in dirs: + # Scan for used interface headers + src_parts = sorted(glob.glob("{}*.h*".format(dir), 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_{},\n".format( + TranslatePathToCUsableString(src_part, search_dir) + ) + + # 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 new_source != open(source_file).read(): + with open(source_file, "w") as f: + f.write(new_source) + os.system("clang-format -style=file -i {}".format(source_file)) + Log.PrintResult(Result.UPDATE) + else: + Log.PrintResult(Result.ALREADY_DONE) 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..69c1d41188532 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/interface_code_generator.py @@ -0,0 +1,7302 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +from code_generator import DEVKIT_DIR, KODI_DIR, INTERFACE_DIR +from .tools.sub_file_hdl import * +from .tools.helpers import * + +from .generateSource__DEV_KIT_INSTANCE_CONSTRUCT import * +from .generateScan__USED_API import * +from .generateScan__USED_VALUES import * + +import glob, os, re, filecmp, shutil + +IGNORED_STRUCTS = [] +SCANS_FOR_ALL = [] + + +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 OffscreenRenderData: + def __init__(self): + self.used = False + self.call_class = "" + self.start_func = "" + self.render_func = "" + self.stop_func = "" + + +# =============================================================================== + + +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.offscreen = OffscreenRenderData() + + 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_{0}::InitDirect(directFuncToKodi_{0}* ifcToKodi, directFuncToAddon_{0}* ifcToAddon)\n" + "{{\n" + " ifcToKodi->thisClassHdl = this;\n" + " m_ifcToAddon = ifcToAddon;\n" + ).format(self.header_group_id) + + for data in self.interface_data_to_kodi: + ret += ( + " ifcToKodi->{0} = {0};\n".format(data.funcname_ifc) + if not data.use_internal_only + else ' // Unused "{}", done only in addon lib\n'.format(data.funcname) + ) + ret += "}\n" + return ret + + def GenerateToAddonInitDirectFunction(self): + ret = ( + "void CHdl_kodi_{0}::InitDirect(directFuncToAddon_{0}* ifcToAddon)\n" + "{{\n" + " ifcToAddon->thisClassHdl = this;\n" + ).format(self.header_group_id) + + for data in self.interface_data_to_addon: + ret += " ifcToAddon->{0} = {0};\n".format(data.funcname_ifc) + ret += "}\n" + return ret + + def GenerateToKodiDirectFuncTable(self): + return ( + "// Code here relates to direct API calls without use of shared mem from addon to Kodi.\n" + "//{{{{{{\n" + "\n" + "{}\n" + "\n" + "struct directFuncToKodi_{}\n" + "{{\n" + " void* thisClassHdl;\n" + "{}\n" + "}};\n" + "\n" + "//}}}}}}\n" + ).format( + "\n".join(sorted(self.to_kodi_api_list_typedef)), + self.header_group_id, + "\n".join(sorted(self.to_kodi_direct_func_table)), + ) + + def GenerateToAddonDirectFuncTable(self): + return ( + "// Code here relates to direct API calls without use of shared mem from Kodi to addon.\n" + "//{{{{{{\n" + "\n" + "{}\n" + "\n" + "struct directFuncToAddon_{}\n" + "{{\n" + " void* thisClassHdl;\n" + "{}\n" + "}};\n" + "\n" + "//}}}}}}\n" + ).format( + "\n".join(sorted(self.to_addon_api_list_typedef)), + self.header_group_id, + "\n".join(sorted(self.to_addon_direct_func_table)), + ) + + 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: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("ERROR: FATAL: File {} failed to get API typedefs!".format(self.path)) + raise NameError("Dev kit scan failure") + + global SCANS_FOR_ALL + if self.path.endswith("kodi/c-api/addon_base.h"): + SCANS_FOR_ALL = scans + else: + for scan in SCANS_FOR_ALL: + scans.append(scan) + + struct_name = "{}_FUNC".format(scans[0].groupname.upper()) + + # if self.path.endswith("kodi/c-api/addon_base.h"): + # print(struct_name) + # exit() + + 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_typedef == typedef: + scan_found = scan + break + + if scan_found == None: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + "ERROR: In struct '{}' is '{}', but typedef '{}' not found!".format( + struct_name, code, typedef + ) + ) + Log.PrintFatal(" 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: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + "ERROR: In struct '{}' is '{}', but lower as lowest API {}!".format( + struct_name, code, lowest_api + ) + ) + Log.PrintFatal(" 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_typedef, 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 {0} to {1} */\n" + "typedef struct {2}_V{0}_TO_V{1}\n" + "{{\n " + "{3}" + "}} {2}_V{0}_TO_V{1};\n" + ).format( + api_entry.api_min, + api_entry.api_max, + struct_name, + " ".join(api_entry.api_struct_with_note), + ) + + if code: + code += ("\n" "union {}_UNION\n" "{{" "{}" "}};\n").format(struct_name, " ".join(api_unions)) + + self.independent_to_addon_api_structs = code + + 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: {}\n" "{}\n" "{}\n").format( + data.function_complete, + data.parent_addon_c_lib_function_shared_tuple_in, + data.parent_addon_c_lib_function_shared_tuple_out, + ) + 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_{0}\n" "#define MSGPACK_ADD_ENUM_{0}\n" "MSGPACK_ADD_ENUM({0});\n" "#endif\n" + ).format(enum) + + return enums_code + + def GetSharedStructures(self): + if self.override_use_direct_api_only or len(self.shared_structures) == 0: + return "" + + return ( + "/* Confirm after autogen the correctness here! */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "\n" + "{}" + "/*---AUTO_GEN_PARSE---*/\n" + "\n" + ).format("\n".join(["".join(x[1]) for x in self.shared_structures])) + + 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): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("ERROR: Bad struct defined in {}".format(self.funcname)) + raise NameError("Dev kit scan failure") + + 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 = "" + + current = 0 + c_struct = GetCStruct(struct_name) + search_dir = "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_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 + + # Scan used "C" structure and create shared structure to exchange between add-on and Kodi + previous_entry = "" + for index, entry in enumerate(c_struct.code): + # Get following value if present, e.g. to check by arrays about size_t + next = index + 1 + if next < len(c_struct.code): + following = c_struct.code[next] + else: + following = "" + + # Scan about the used enums inside structure and append to used + # enums about interface if not pesent before + 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: + name = entry.rstrip(";").split()[-1].strip() + value = entry.replace(name, "").replace(";", "").strip() + if following: + following_name = following.rstrip(";").split()[-1].strip() + following_value = following.replace(following_name, "").replace(";", "").strip() + + if value == "const char*": + code_values += (" std::string {};\n").format(name) + + set_code += (" if (c_data->{0})\n" " {0} = c_data->{0};\n").format(name) + + get_code += (" c_data->{0} = {0}.c_str();\n").format(name) + + elif value == "char*": + code_values += (" std::string {};\n").format(name) + + set_code += (" if (c_data->{0})\n" " {0} = c_data->{0};\n").format(name) + + get_code += (" if (!{0}.empty())\n" " c_data->{0} = strdup({0}.c_str());\n").format( + name + ) + + clean_code += ( + " if (c_data->{0})\n" + " {{\n" + " free(c_data->{0});\n" + " c_data->{0} = nullptr;\n" + " }}\n" + ).format(name) + + elif value in known_STANDARD_C_PTR_TYPES: + if following_value == "size_t": + code_values += (" std::vector<{}> {};\n").format(value.replace("*", ""), name) + + set_code += ( + " if (c_data->{0})\n" " {0}.assign(c_data->{0}, c_data->{0} + c_data->{1});\n" + ).format(name, following_name) + + get_code += ( + " if (!{0}.empty())\n" + " {{\n" + " size_t size = {0}.size();\n" + " c_data->{0} = static_cast<{1}*>(malloc(sizeof({1}) * size));\n" + " memcpy(c_data->{0}, {0}.data(), size);\n" + " }}\n" + ).format(name, value.replace("*", "")) + + clean_code += ( + " if (c_data->{0})\n" + " {{\n" + " free(c_data->{0});\n" + " c_data->{0} = nullptr;\n" + " }}\n" + ).format(name) + else: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + 'Error: Entry in "C" defined as array "{}", but no following size_t value!'.format( + entry + ) + ) + exit(1) + + elif ContainsHdlVoidPointer(value): + code_values += (" PtrValue {};\n").format(name) + + set_code += (" {0} = PtrValue(c_data->{0});\n").format(name) + + get_code += (" c_data->{0} = reinterpret_cast<{1}>({0});\n").format(name, value) + + 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()) + + previous_value_name = previous_entry.split()[-1].strip().replace(";", "") + + code_values += (" std::vector {};\n").format(new_struct_name, name) + + set_code += ( + " if (c_data->{0} && c_data->{1} != 0)\n" + " {{\n" + " for (size_t i = 0; i < c_data->{1}; ++i)\n" + " {0}.emplace_back(&c_data->{0}[i]);\n" + " }}\n" + ).format(name, previous_value_name) + + get_code += ( + " if (!{0}.empty())\n" + " {{\n" + " c_data->{0} = static_cast<{1}*>(malloc(sizeof({1}) * {0}.size()));\n" + " for (size_t i = 0; i < {0}.size(); ++i)\n" + " {0}[i].SetCStructure(&c_data->{0}[i]);\n" + " }}\n" + ).format(name, new_struct_name) + + clean_code += ( + " if (c_data->{0})\n" + " {{\n" + " IFC_{1} helper;\n" + " for (size_t i = 0; i < c_data->{2}; ++i)\n" + " helper.CleanCStructure(&c_data->{0}[i]);\n" + " free(c_data->{0});\n" + " c_data->{0} = nullptr;\n" + " }}\n" + ).format(name, new_struct_name, previous_value_name) + + elif value.count("*") == 0: + new_struct_name = value.replace("struct ", "") + + code_values += (" IFC_{}\n").format(entry.replace("struct ", "")) + + set_code += (" {0} = IFC_{1}(&c_data->{0});\n").format(name, new_struct_name) + + get_code += (" {0}.SetCStructure(&c_data->{0});\n").format(name) + + clean_code += (" IFC_{}::CleanCStructure(&c_data->{});\n").format(new_struct_name, name) + + else: + code_values += (" {}\n").format(entry) + + set_code += (" {0} = c_data->{0};\n").format(name) + + get_code += (" c_data->{0} = {0}; /* TODO!!! */\n").format(name) + + else: + code_values += (" {}\n").format(entry) + + set_code += (" {0} = c_data->{0};\n").format(name) + + get_code += (" c_data->{0} = {0};\n").format(name) + + if not current: + msgpack += "{}{}".format(name, ",\n" if len(c_struct.code) > 1 else "") + else: + msgpack += " {}{}".format(name, ",\n" if current < len(c_struct.code) - 1 else "") + current += 1 + + previous_entry = entry + + if not code_values: + return True + + clean_function = ( + ( + "\n" + " static inline void CleanCStructure({0}* c_data)\n" + " {{\n" + " if (c_data == nullptr)\n" + " return;\n" + "\n" + "{1}" + " }}\n" + ).format(struct_name, clean_code) + if clean_code + else "" + ) + + code = ( + "struct IFC_{0}\n" + "{{\n" + " IFC_{0}() = default;\n" + " IFC_{0}(const {0}* c_data)\n" + " {{\n" + " if (c_data == nullptr)\n" + " return;\n" + "\n" + "{1}" + " }}\n" + "{2}\n" + " void SetCStructure({0}* c_data)\n" + " {{\n" + " if (c_data == nullptr)\n" + " return;\n" + "\n" + "{3}" + " }}\n" + "\n" + "{4}\n" + " MSGPACK_DEFINE({5});\n" + "}};\n" + ).format(struct_name, set_code, clean_function, 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, options): + search_dir = "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_DIR) + target_dir = "{}{}/src/shared/api/".format(KODI_DIR, DEVKIT_DIR) + target_file = self.path.replace(search_dir, target_dir) + + Log.PrintBegin(" - Updating: ") + Log.PrintFollow("{}".format(target_file.replace(KODI_DIR, ""))) + + path = self.path.replace("{}{}/".format(KODI_DIR, DEVKIT_DIR), "") + include_path = "" + for i in range(path.count("/")): + include_path += "../" + include_path += path + + file_text = ( + "{0}" + "\n" + "#pragma once\n" + "\n" + '#include "src/shared/SharedGroups.h"\n' + '#include "{1}"\n' + "{2}" + "\n" + "#include \n" + "#include \n" + "#include \n" + "#include \n" + "{3}" + "\n" + "/* Code below becomes on auto generation reused, hand edited parts should included here */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{4}" + "/*---AUTO_GEN_PARSE---*/\n" + "{5}" + "\n" + "namespace KODI\n" + "{{\n" + "namespace ADDONS\n" + "{{\n" + "namespace INTERFACE\n" + "{{\n" + "\n" + "/* Code below becomes on auto generation reused, hand edited parts should included here */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{6}" + "/*---AUTO_GEN_PARSE---*/\n" + "\n" + "{7}\n" + "{8}\n" + "{9}" + "{10}" + "\n" + "// clang-format off\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{11}" + "/*---AUTO_GEN_PARSE---*/\n" + "// clang-format on\n" + "\n" + "//==============================================================================\n" + "\n" + "{12}" + "\n" + "// clang-format off\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{13}" + "/*---AUTO_GEN_PARSE---*/\n" + "// clang-format on\n" + "\n" + "}} /* namespace INTERFACE */\n" + "}} /* namespace ADDONS */\n" + "}} /* namespace KODI */\n" + ).format( + HEADER_FILE_COPYRIGHT, + include_path, + "\n".join(self.additional_shared_includes), + self.independent_to_addon_api_structs, + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_1"), + self.GetSharedEnums(), + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_2"), + self.GenerateToKodiDirectFuncTable(), + self.GenerateToAddonDirectFuncTable(), + self.GetSharedStructures(), + self.GetKodiParentEnumList(), + self.GetParentSharedTuples(), + self.GetKodiChildEnumList(), + self.GetChildSharedTuples(), + ) + + # Make now the creation and copy of file + temp_file = target_file.replace("{}xbmc/addons".format(KODI_DIR), "./tmp") + if not write_file(temp_file, file_text, True): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + raise NameError("Dev kit scan failure") + + present = os.path.isfile(target_file) + if options.force or not present or not filecmp.cmp(target_file, temp_file): + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + if present: + Log.PrintResult(Result.UPDATE) + else: + Log.PrintResult(Result.NEW) + else: + Log.PrintResult(Result.ALREADY_DONE) + + return file_text + + def ScanStructureInsideAdditional(self, options, structure, include_path_of_searcher): + c_struct = GetCStruct(structure) + + include = c_struct.path.replace( + "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_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, options): + additional_shared_includes = [] + for entry in self.additional_shared_includes: + target_file = "{}{}/{}".format(KODI_DIR, DEVKIT_DIR, entry.replace("#include ", "").replace('"', "")) + + include = target_file.replace( + "{}{}/src/shared/api/".format(KODI_DIR, DEVKIT_DIR), + "include/kodi/c-api/", + ) + include_path_complete = target_file.replace("src/shared/api/", "include/kodi/c-api/") + + temp_file = target_file.replace("{}xbmc/addons".format(KODI_DIR), "./tmp") + + # Check already exist + if os.path.isfile(temp_file): + continue + + Log.PrintBegin(" - Updating: ") + Log.PrintFollow("{}".format(target_file.replace(KODI_DIR, ""))) + + include_path = "" + for i in range(include.count("/")): + include_path += "../" + include_path += include + + 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) + ) + + if is_string: + set_code += ( + " for (unsigned int i = 0; i < {1}; ++i)\n" + " {\n" + " for (unsigned int j = 0; j < {2}; ++j)\n" + " {\n" + ' {0}[i][j] = c_data->{0}[i][j] ? c_data->{0}[i][j] : "";\n' + " }\n" + " }\n" + ).format(m.group(2), m.group(3), m.group(4)) + + get_code += ( + " for (unsigned int i = 0; i < {1}; ++i)\n" + " {\n" + " for (unsigned int j = 0; j < {2}; ++j)\n" + " {\n" + " if (c_data->{0}[i][j])\n" + " free(c_data->{0}[i][j]);\n" + " c_data->{0}[i][j] = strdup({0}[i][j].c_str());\n" + " }\n" + " }\n" + ).format(m.group(2), m.group(3), m.group(4)) + + else: + set_code += ( + " for (unsigned int i = 0; i < {1}; ++i)\n" + " {\n" + " for (unsigned int j = 0; j < {2}; ++j)\n" + " {\n" + " {0}[i][j] = c_data->{0}[i][j];\n" + " }\n" + " }\n" + ).format(m.group(2), m.group(3), m.group(4)) + + get_code += ( + " for (unsigned int i = 0; i < {1}; ++i)\n" + " {\n" + " for (unsigned int j = 0; j < {2}; ++j)\n" + " {\n" + " c_data->{0}[i][j] = {0}[i][j];\n" + " }\n" + " }\n" + ).format(m.group(2), m.group(3), m.group(4)) + 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(options, 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({0}.data(), c_data->{0}, {1});\n").format(m.group(2), m.group(3)) + if is_string: + get_code += ( + " for (unsigned int i = 0; i < {1}; ++i)\n" + " {\n" + " if (c_data->{0}[i])\n" + " free(c_data->{0}[i];\n" + " c_data->{0}[i] = strdup({0}[i].c_str());\n" + " }\n" + ).format(m.group(2), m.group(3)) + else: + get_code += (" memcpy(c_data->{0}, {0}.data(), {1});\n").format( + 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->{0})\n" " {0} = c_data->{0};\n").format(name) + + get_code += (" c_data->{0} = {0}.c_str();\n").format(name) + + elif value == "char*": + code_values += " std::string {};\n".format(name) + + set_code += (" if (c_data->{0})\n" " {0} = c_data->{0};\n").format(name) + + get_code += ( + " if (!{0}.empty())\n" " c_data->{0} = strdup({0}.c_str());\n" + ).format(name) + + clean_code += ( + " if (c_data->{0})\n" + " {\n" + " free(c_data->{0});\n" + " c_data->{0} = nullptr;\n" + " }\n" + ).format(name) + + elif ContainsHdlVoidPointer(value): + code_values += " PtrValue {};\n".format(name) + + set_code += (" {0} = PtrValue(c_data->{0});\n").format(name) + + get_code += (" c_data->{0} = reinterpret_cast<{1}>({0});\n").format(name, value) + elif "struct " in value: + raise + else: + code_values += " {}\n".format(entry) + set_code += " {0} = c_data->{0};\n".format(name) + get_code += " c_data->{0} = {0};\n".format(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 += ( + "\n" + " static inline void CleanCStructure({0} c_data)" + " {{\n" + " if (c_data == nullptr)\n" + " return;\n" + "\n" + "{1}" + " }}\n" + ).format(struct_name, clean_code) + + struct_code += ( + "struct IFC_{0}\n" + "{{\n" + " IFC_{0}() = default;\n" + " IFC_{0}(const {0}* c_data)\n" + " {{\n" + " if (c_data == nullptr)\n" + " return;\n" + "\n" + "{1}" + " }}\n" + "{2}\n" + " void SetCStructure({0}* c_data)\n" + " {{\n" + " if (c_data == nullptr)\n" + " return;\n" + "\n" + "{3}" + " }}\n" + "\n" + "{4}\n" + "{5});\n" + "}};\n" + "\n" + ).format( + struct_name, + set_code, + clean_function, + 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_{0}\n" + "#define MSGPACK_ADD_ENUM_{0}\n" + "MSGPACK_ADD_ENUM({0});\n" + "#endif\n" + ).format(enum) + + file_text = ( + "{0}" + "\n" + "#pragma once\n" + "\n" + '#include "src/shared/SharedGroups.h"\n' + '#include "{1}"\n' + "{2}" + "\n" + "#include \n" + "#include \n" + "#include \n" + "#include \n" + "\n" + "/* Code below becomes on auto generation reused, hand edited parts should included here */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{3}" + "/*---AUTO_GEN_PARSE---*/\n" + "{4}" + "\n" + "namespace KODI\n" + "{{\n" + "namespace ADDONS\n" + "{{\n" + "namespace INTERFACE\n" + "{{\n" + "\n" + "{5}" + "/* Code below becomes on auto generation reused, hand edited parts should included here */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{6}" + "/*---AUTO_GEN_PARSE---*/\n" + "\n" + "}} /* namespace INTERFACE */\n" + "}} /* namespace ADDONS */\n" + "}} /* namespace KODI */\n" + ).format( + HEADER_FILE_COPYRIGHT, + include_path, + "\n".join(additional_shared_includes), + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_1"), + enums_code, + struct_code, + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_2"), + ) + + # Make now the creation and copy of file + if not write_file(temp_file, file_text, True): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + raise NameError("Dev kit scan failure") + + present = os.path.isfile(target_file) + if options.force or not present or not filecmp.cmp(target_file, temp_file): + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + if present: + Log.PrintResult(Result.UPDATE) + else: + Log.PrintResult(Result.NEW) + else: + Log.PrintResult(Result.ALREADY_DONE) + + def Generate__xbmc_addons_kodidevkit_src_addon_api_ALL_FILES_CPP(self, options): + path = self.path.replace("{}{}/".format(KODI_DIR, DEVKIT_DIR), "") + include_path = "" + for i in range(path.count("/")): + include_path += "../" + include_path += path + + search_dir = "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_DIR) + target_dir = "{}{}/src/addon/api/".format(KODI_DIR, DEVKIT_DIR) + target_file = self.path.replace(search_dir, target_dir).replace(".h", ".cpp") + + Log.PrintBegin(" - Updating: ") + Log.PrintFollow("{}".format(target_file.replace(KODI_DIR, ""))) + + additional_includes = "" + for include in self.additional_addon_lib_includes: + additional_includes += "{}\n".format(include) + + handle_message = "" + if len(self.GetDevKitKodiToAddonHeaderPart()) > 0: + fc = "bool CHdl_kodi_{}::HandleMessage".format(self.header_group_id) + spaces = MakeSpaces(fc) + switches = "" + if not self.override_use_direct_api_only: + for data in self.interface_data_to_addon: + switches += data.child_addon_c_lib_function_switch_case + else: + switches += " /* NOTE: Ignored as direct api only is set! */\n" + + handle_message += ( + "#ifndef KODI_INHIBIT_SHARED\n" + "bool CHdl_kodi_{0}::HandleMessage(int funcGroup,\n" + "{1}int func,\n" + "{1}const msgpack::unpacked& in,\n" + "{1}msgpack::sbuffer& out)\n" + "{{\n" + " if (funcGroup != funcGroup_{0})\n" + " return false;\n" + "\n" + " switch (func)\n" + " {{\n" + "{2}" + " default:\n" + " break;\n" + " }}\n" + " return false;\n" + "}}\n" + "#endif /* !KODI_INHIBIT_SHARED */\n" + "\n" + ).format( + self.header_group_id, spaces, switches # 0 # 1 + ) # 2 + + shared_func = "" + for data in self.interface_data_to_kodi: + shared_func += "\n" + shared_func += data.parent_addon_c_lib_function_shared + + file_text = ( + "{0}" + "\n" + '#include "{1}"\n' + "{2}" + "\n" + "// Shared API\n" + '#include "src/shared/Instances.h"\n' + "\n" + "// Lib code\n" + '#include "core/addon_control.h"\n' + "\n" + "/* Code below becomes on auto generation reused, hand edited parts should included here */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{3}" + "/*---AUTO_GEN_PARSE---*/\n" + "\n" + "using namespace KODI::ADDONS::INTERFACE;\n" + "using namespace KODI_ADDON::INTERNAL;\n" + "\n" + "namespace KODI_ADDON\n" + "{{\n" + "namespace INTERNAL\n" + "{{\n" + "\n" + "/* Code below becomes on auto generation reused, hand edited parts should included here */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{4}" + "/*---AUTO_GEN_PARSE---*/\n" + "\n" + "{5}\n" + "{6}" + "/* Code below becomes on auto generation reused, hand edited parts should included here */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{7}" + "/*---AUTO_GEN_PARSE---*/\n" + "\n" + "{8}" + "\n" + "}} /* namespace INTERNAL */\n" + "}} /* namespace KODI_ADDON */\n" + "{9}" + "\n" + "/* Code below becomes on auto generation reused, hand edited parts should included here */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{10}" + "/*---AUTO_GEN_PARSE---*/\n" + ).format( + HEADER_FILE_COPYRIGHT, # 0 + os.path.basename(self.path), # 1 + additional_includes, # 2 + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_1"), # 3 + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_2"), # 4 + self.GenerateToAddonInitDirectFunction(), # 5 + handle_message, # 6 + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_3"), # 7 + self.GetDevKitKodiToAddonSourcePart(), # 8 + shared_func, # 9 + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_4"), + ) # 10 + + # Make now the creation and copy of file + temp_file = target_file.replace("{}xbmc/addons".format(KODI_DIR), "./tmp") + if not write_file(temp_file, file_text, True): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + raise NameError("Dev kit scan failure") + + present = os.path.isfile(target_file) + if options.force or not present or not filecmp.cmp(target_file, temp_file): + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + if present: + Log.PrintResult(Result.UPDATE) + else: + Log.PrintResult(Result.NEW) + else: + Log.PrintResult(Result.ALREADY_DONE) + + return file_text + + def Generate__xbmc_addons_kodidevkit_src_addon_api_ALL_FILES_H(self, options): + path = self.path.replace("{}{}/".format(KODI_DIR, DEVKIT_DIR), "") + + search_dir = "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_DIR) + target_dir = "{}{}/src/addon/api/".format(KODI_DIR, DEVKIT_DIR) + target_file = self.path.replace(search_dir, target_dir) + + Log.PrintBegin(" - Updating: ") + Log.PrintFollow("{}".format(target_file.replace(KODI_DIR, ""))) + + handle_message = "" + callbacks = "" + if len(self.GetDevKitKodiToAddonHeaderPart()) > 0: + handle_message = ( + "#ifndef KODI_INHIBIT_SHARED\n" + " bool HandleMessage(int funcGroup,\n" + " int func,\n" + " const msgpack::unpacked& in,\n" + " msgpack::sbuffer& out) override;\n" + "#endif /* !KODI_INHIBIT_SHARED */\n" + "\n" + ) + callbacks = ("\n" " // Calls from Kodi to addon\n" "{}").format(self.GetDevKitKodiToAddonHeaderPart()) + + file_text = ( + "{0}" + "\n" + "#pragma once\n" + "\n" + '#include "core/IMsgHdl.h"\n' + '#include "src/shared/api/{1}"\n' + "\n" + "/* Code below becomes on auto generation reused, hand edited parts should included here */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{2}" + "/*---AUTO_GEN_PARSE---*/\n" + "\n" + "namespace KODI\n" + "{{\n" + "namespace ADDONS\n" + "{{\n" + "namespace INTERFACE\n" + "{{\n" + "\n" + "struct directFuncToAddon_{3};\n" + "struct directFuncToKodi_{3};\n" + "\n" + "}} /* namespace INTERFACE */\n" + "}} /* namespace ADDONS */\n" + "}} /* namespace KODI */\n" + "\n" + "namespace KODI_ADDON\n" + "{{\n" + "namespace INTERNAL\n" + "{{\n" + "\n" + "class ATTR_DLL_LOCAL CHdl_kodi_{3} : public IMsgHdl\n" + "{{\n" + "public:\n" + " CHdl_kodi_{3}(AddonIfc* ifc) : IMsgHdl(ifc) {{}}\n" + "\n" + " void InitDirect(KODI::ADDONS::INTERFACE::directFuncToAddon_{3}* ifcToAddon);\n" + "\n" + "{4}" + " /* Code below becomes on auto generation reused, hand edited parts should included here */\n" + " /*---AUTO_GEN_PARSE---*/\n" + "{5}" + " /*---AUTO_GEN_PARSE---*/\n" + "{6}\n" + "}};\n" + "\n" + "}} /* namespace INTERNAL */\n" + "}} /* namespace KODI_ADDON */\n" + ).format( + HEADER_FILE_COPYRIGHT, # 0 + target_file.replace(target_dir, "").replace(".cpp", ".h"), # 1 + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_1"), # 2 + self.header_group_id, # 3 + handle_message, # 4 + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_2"), # 5 + callbacks, + ) # 6 + + # Make now the creation and copy of file + temp_file = target_file.replace("{}xbmc/addons".format(KODI_DIR), "./tmp") + if not write_file(temp_file, file_text, True): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + raise NameError("Dev kit scan failure") + + present = os.path.isfile(target_file) + if options.force or not present or not filecmp.cmp(target_file, temp_file): + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + if present: + Log.PrintResult(Result.UPDATE) + else: + Log.PrintResult(Result.NEW) + else: + Log.PrintResult(Result.ALREADY_DONE) + + return file_text + + # ------------------------------------------------------------------------------------------------- + + def Generate__xbmc_addons_interface_api_ALL_FILES_CPP(self, options): + path = self.path.replace("{}{}/".format(KODI_DIR, DEVKIT_DIR), "") + search_dir = "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_DIR) + target_dir = "{}xbmc/addons/interface/api/".format(KODI_DIR) + target_file = self.path.replace(search_dir, target_dir).replace(".h", ".cpp") + + Log.PrintBegin(" - Updating: ") + Log.PrintFollow("{}".format(target_file.replace(KODI_DIR, ""))) + + include_text = "" + if self.offscreen.call_class: + include_text += '#include "addons/interface/IOffscreenRenderProcess.h"\n' + for include in self.kodi_ifc_includes: + include_text += '#include "{}"\n'.format(include) + + file_text = ( + "{0}" + "\n" + '#include "{1}"\n' + "\n" + "// Shared API\n" + '#include "addons/kodi-dev-kit/{2}"\n' + "\n" + "// Kodi\n" + '#include "addons/interface/RunningProcess.h"\n' + '#include "utils/log.h"\n' + "{3}" + "\n" + "/* Code below becomes on auto generation reused, hand edited parts should included here */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{4}" + "/*---AUTO_GEN_PARSE---*/\n" + "\n" + "namespace KODI\n" + "{{\n" + "namespace ADDONS\n" + "{{\n" + "namespace INTERFACE\n" + "{{\n" + "\n" + "/* Code below becomes on auto generation reused, hand edited parts should included here */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{5}" + "/*---AUTO_GEN_PARSE---*/\n" + "\n" + "{6}" + "\n" + "bool CHdl_kodi_{7}::HandleMessage(int funcGroup,\n" + " int func,\n" + " const msgpack::unpacked& in,\n" + " msgpack::sbuffer& out)\n" + "{{\n" + " if (funcGroup != funcGroup_{7})\n" + " return false;\n" + "\n" + " switch (func)\n" + " {{\n" + "{8}" + " default:\n" + " CLog::Log(LOGERROR,\n" + " \"CHdl_kodi_{7}::{{}}: addon called with unknown function id '{{}}' on group '{7}'\",\n" + " __func__, func);\n" + " }}\n" + "\n" + " return false;\n" + "}}\n" + "\n" + "// Function calls from Kodi to addon\n" + "{9}" + "\n" + "// Callbacks from addon to Kodi\n" + "{10}" + "\n" + "/* Code below becomes on auto generation reused, hand edited parts should included here */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{11}" + "/*---AUTO_GEN_PARSE---*/\n" + "\n" + "}} /* namespace INTERFACE */\n" + "}} /* namespace ADDONS */\n" + "}} /* namespace KODI */\n" + ).format( + HEADER_FILE_COPYRIGHT, + os.path.basename(self.path), + path.replace("include/kodi/c-api/", "src/shared/api/"), + include_text, + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_1"), + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_2"), + self.GenerateToKodiInitDirectFunction(), + self.header_group_id, + self.GetKodiSwitchCase(), + self.GetKodiSourcePartChild(), + self.GetKodiSourcePart(), + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_3"), + ) + + # if self.offscreen.call_class: + # print(file_text) + # exit() + + # Make now the creation and copy of file + temp_file = target_file.replace("{}xbmc/addons".format(KODI_DIR), "./tmp") + if not write_file(temp_file, file_text, True): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + raise NameError("Dev kit scan failure") + + present = os.path.isfile(target_file) + if options.force or not present or not filecmp.cmp(target_file, temp_file): + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + if present: + Log.PrintResult(Result.UPDATE) + else: + Log.PrintResult(Result.NEW) + else: + Log.PrintResult(Result.ALREADY_DONE) + + return file_text + + # ------------------------------------------------------------------------------------------------- + + def Generate__xbmc_addons_interface_api_ALL_FILES_H(self, options): + path = self.path.replace("{}{}/".format(KODI_DIR, DEVKIT_DIR), "") + search_dir = "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_DIR) + target_dir = "{}xbmc/addons/interface/api/".format(KODI_DIR) + target_file = self.path.replace(search_dir, target_dir) + + Log.PrintBegin(" - Updating: ") + Log.PrintFollow("{}".format(target_file.replace(KODI_DIR, ""))) + + file_text = ( + "{0}" + "\n" + "#pragma once\n" + "\n" + '#include "addons/interface/IMsgHdl.h"\n' + "\n" + "// API include\n" + '#include "addons/kodi-dev-kit/{1}"\n' + "\n" + "/* Code below becomes on auto generation reused, hand edited parts should included here */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{2}" + "/*---AUTO_GEN_PARSE---*/\n" + "\n" + "namespace KODI\n" + "{{\n" + "namespace ADDONS\n" + "{{\n" + "namespace INTERFACE\n" + "{{\n" + "\n" + "{9}" + "struct directFuncToAddon_{3};\n" + "struct directFuncToKodi_{3};\n" + "\n" + "/* Code below becomes on auto generation reused, hand edited parts should included here */\n" + "/*---AUTO_GEN_PARSE---*/\n" + "{4}" + "/*---AUTO_GEN_PARSE---*/\n" + "\n" + "class CHdl_kodi_{3} : public IMsgHdl\n" + "{{\n" + "public:\n" + " CHdl_kodi_{3}(CInterface& interface) : IMsgHdl(interface) {{ }}\n" + "\n" + " void InitDirect(directFuncToKodi_{3}* ifcToKodi,\n" + " directFuncToAddon_{3}* ifcToAddon);\n" + "\n" + " // To handle callbacks from addon by shared sandbox API (static functions below in private becomes used)\n" + " bool HandleMessage(int funcGroup,\n" + " int func,\n" + " const msgpack::unpacked& in,\n" + " msgpack::sbuffer& out) override;\n" + "\n" + " /* Code below becomes on auto generation reused, hand edited parts should included here */\n" + " /*---AUTO_GEN_PARSE---*/\n" + "{5}" + " /*---AUTO_GEN_PARSE---*/\n" + "\n" + " // Function calls from Kodi to addon\n" + "\n" + "{6}" + "private:\n" + " /* Code below becomes on auto generation reused, hand edited parts should included here */\n" + " /*---AUTO_GEN_PARSE---*/\n" + "{7}" + " /*---AUTO_GEN_PARSE---*/\n" + "\n" + " // Callbacks from addon to Kodi\n" + "{8}" + "\n" + " directFuncToAddon_{3}* m_ifcToAddon{{nullptr}};\n" + "}};\n" + "\n" + "}} /* namespace INTERFACE */\n" + "}} /* namespace ADDONS */\n" + "}} /* namespace KODI */\n" + ).format( + HEADER_FILE_COPYRIGHT, + path, + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_1"), + self.header_group_id, + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_2"), + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_3"), + self.GetKodiChildHeaderPart(), + CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_4"), + self.GetKodiParentHeaderPart(), + "class IOffscreenRenderProcess;\n" if self.offscreen.used else "", + ) + + # Make now the creation and copy of file + temp_file = target_file.replace("{}xbmc/addons".format(KODI_DIR), "./tmp") + if not write_file(temp_file, file_text, True): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + raise NameError("Dev kit scan failure") + + present = os.path.isfile(target_file) + if options.force or not present or not filecmp.cmp(target_file, temp_file): + os.makedirs(os.path.dirname(target_file), exist_ok=True) + shutil.copyfile(temp_file, target_file) + if present: + Log.PrintResult(Result.UPDATE) + else: + Log.PrintResult(Result.NEW) + else: + Log.PrintResult(Result.ALREADY_DONE) + + 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 = "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_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-1) */" if parent.options.debug else "", + ) + self.msgpack_out_value = "std::get<{}>(t).SetCStructure({});{}".format( + self.cnt_out, + self.value_name, + " /* CheckAPIUse_WAY_15 (0003-2) */" 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 = ( + " *{0} = static_cast<{1}>(calloc(ifc_{0}.size(), sizeof({2})));{3}\n" + " for (size_t i = 0; i < ifc_{0}.size(); ++i)\n" + " ifc_{0}[i].SetCStructure(&(*{0})[i]);\n" + ).format( + self.value_name, + self.value_type.replace("**", "*").replace("struct ", ""), + ifc_struct_name, + " /* CheckAPIUse_WAY_17 (0003) */" if parent.options.debug else "", + ) + + 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, + "{}{}/src/addon/api/".format(KODI_DIR, DEVKIT_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, + "{}{}/src/addon/api/".format(KODI_DIR, DEVKIT_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 + + dbg = parent.options.debug + + # 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(80)::PLACE_12 + if ContainsHdlVoidPointer(self.value_type): + d1 = " /* CheckAPIUse(80)::PLACE_12(1) */" if dbg else "" + d2 = " /* CheckAPIUse(80)::PLACE_12(2) */" if dbg else "" + + n = self.value_name + t = self.value_type.replace("const ", "") + cnt = self.cnt - self.ignored_count + + self.function_value = "{0}{1}".format(n, d1) + self.msgpack_in_value = "{0} {1} = reinterpret_cast<{0}>(std::get<{2}>(t));{3}".format( + t, n, cnt, d2 + ) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse(80)::PLACE_13 + if self.value_type.replace("const ", "") in known_STANDARD_C_PTR_TYPES: + d1 = " /* CheckAPIUse(80)::PLACE_13(1) */" if dbg else "" + d2 = " /* CheckAPIUse(80)::PLACE_13(2) */" if dbg else "" + d3 = " /* CheckAPIUse(80)::PLACE_13(3) */" if dbg else "" + + n = self.value_name + t = self.value_type.replace("*", "") + cnt = self.cnt - self.ignored_count + + if self.value_type.count("*") == 1: + self.msgpack_in_value = "{} {} = std::get<{}>(t);{}".format(t, n, cnt, d1) + self.function_value = "&{}{}".format(n, d2) + self.msgpack_out_value = "{}{}".format(n, d3) if not "const " in t else "" + else: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + 'Error: Function "{}" Not supported on InterfaceDataChild::GenerateKodiSourceCPPSwitchCase (on CheckAPIUse(80)::PLACE_13)'.format( + parent.function_complete + ) + ) + raise NameError("Dev kit scan failure") + + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse(80)::PLACE_14 + if CheckKnownEnum(self.value_type): + d1 = " /* CheckAPIUse(80)::PLACE_14(1) */" if dbg else "" + d2 = " /* CheckAPIUse(80)::PLACE_14(2) */" if dbg else "" + d3 = " /* CheckAPIUse(80)::PLACE_14(3) */" if dbg else "" + d4 = " /* CheckAPIUse(80)::PLACE_14(4) */" if dbg else "" + d5 = " /* CheckAPIUse(80)::PLACE_14(5) */" if dbg else "" + + n = self.value_name + t = self.value_type.replace("*", "") + cnt = self.cnt - self.ignored_count + + if self.value_type.count("*") == 0: + self.msgpack_in_value = "{} {} = std::get<{}>(t);{}".format(t, n, cnt, d1) + self.function_value = "{}{}".format(n, d2) + elif self.value_type.count("*") == 1: + self.msgpack_in_value = "{} {} = std::get<{}>(t);{}".format(t, n, cnt, d3) + self.function_value = "&{}{}".format(n, d4) + if not "const " in self.value_type: + self.msgpack_out_value = "{}{}".format(n, d5) + else: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + 'Error: Function "{}" Not supported on InterfaceDataChild::GenerateKodiSourceCPPSwitchCase (on CheckAPIUse(80)::PLACE_14)'.format( + parent.function_complete + ) + ) + raise NameError("Dev kit scan failure") + + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse(80)::PLACE_15 + if ( + self.value_type.startswith("struct ") + and self.value_type.count("*") == 1 + and parent.group_data.KnownSharedStructure(self.value_type) + ): + d1 = " /* CheckAPIUse(80)::PLACE_15(1) */" if dbg else "" + d2 = " /* CheckAPIUse(80)::PLACE_15(2) */" if dbg else "" + d3 = " /* CheckAPIUse(80)::PLACE_15(3) */" if dbg else "" + d4 = " /* CheckAPIUse(80)::PLACE_15(4) */" if dbg else "" + d5 = " /* CheckAPIUse(80)::PLACE_15(5) */" if dbg else "" + + n = self.value_name + t = self.value_type.replace("*", "") + cnt = self.cnt - self.ignored_count + + struct_name = self.value_type.replace("struct ", "").replace("*", "").strip() + + if struct_name == "tm": + self.additional_code_1 = " {} {};{}".format(struct_name, n, d1) + self.msgpack_in_value = "std::get<{}>(t).SetCStructure(&{});{}".format(cnt, n, d2) + else: + self.ignored_count += 1 + self.additional_code_2 = " {} {} = {{}};{}\n".format(t, n, d3) + + self.function_value = "&{}{}".format(n, d4) + self.msgpack_out_value = "&{}{}".format(n, d5) + + 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 ", ""), n + ) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse(80)::PLACE_16 + if ( + self.value_type.startswith("const struct ") + and self.value_type.count("*") == 1 + and parent.group_data.KnownSharedStructure(self.value_type) + ): + d1 = " /* CheckAPIUse(80)::PLACE_16(1) */" if dbg else "" + d2 = " /* CheckAPIUse(80)::PLACE_16(2) */" if dbg else "" + d3 = " /* CheckAPIUse(80)::PLACE_16(3) */" if dbg else "" + + n = self.value_name + cnt = self.cnt - self.ignored_count + struct_name = self.value_type.replace("*", "").replace("const struct ", "") + + self.additional_code_1 = " {} {};{}".format(struct_name, n, d1) + self.msgpack_in_value = "std::get<{}>(t).SetCStructure(&{});{}".format(cnt, n, d2) + self.function_value = "&{}{}".format(n, d3) + 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) + ): + d1 = " /* CheckAPIUse(80)::PLACE_17(1) */" if dbg else "" + d2 = " /* CheckAPIUse(80)::PLACE_17(2) */" if dbg else "" + d3 = " /* CheckAPIUse(80)::PLACE_17(3) */" if dbg else "" + + self.ignored_count += 1 + + n = self.value_name + 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("**", "*"), n, d1) + self.function_value = "&{}{}".format(n, d2) + self.msgpack_out_value = "ifc_{}".format(n) + self.additional_code_3 = ( + " std::vector ifc_{0};{3}\n" + " if ({0})\n" + " {{\n" + " ifc_{0}.reserve({1});\n" + " for (size_t i = 0; i < {1}; ++i)\n" + " {{\n" + " ifc_{0}.emplace_back(&{0}[i]);" + " ifc_{0}[i].CleanCStructure(&{0}[i]);" + " }}\n" + " free({0});\n" + " }}\n" + ).format( + n, size_name, struct_name, d3 # 0 # 1 # 2 # 3 + ) + + 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" + " {{\n" + " // Original API call: {}\n" + " // Tuple in: {}\n" + " // Tuple out: {}\n" + ).format( + self.funcname_ifc, + self.function_complete, + self.parent_addon_c_lib_function_shared_tuple_in, + 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: + 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 + if apiUse.msgpack_in_value: + 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 "", + ) + + if in_values: + code += " msgParent__IN_{} t = in.get().as();\n".format(self.funcname_ifc) + code += in_values + # if "kodi_get_initial_instance_info_v1" == self.funcname_ifc: + # print("-------------> {}".format(str(in_values))) + # exit() + 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" + " if (auto_gen_ret)\n" + " {{\n" + " auto_gen_ret_cpp.reserve({0});\n" + " for (size_t i = 0; i < {0}; ++i)\n" + " {{\n" + " if (auto_gen_ret[i])\n" + " {{\n" + " auto_gen_ret_cpp.emplace_back(auto_gen_ret[i]);\n" + " free(auto_gen_ret[i]);\n" + " }}\n" + " }}\n" + " free(auto_gen_ret);\n" + " }}\n" + ).format(api_use_list[-1].value_name) + 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_typedef = "" + + 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 = "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_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_typedef = "PFN_{}_V{}".format(m.group(2), self.api_added) + for line in file_text.splitlines(): + m = re.search("^\ *" + self.ifc_name_typedef + "\ *([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 = "" + + dbg = parent.options.debug # To have shorter below + + 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 dbg 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 dbg 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 dbg 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]: + d = " /* CheckAPIUse(100)::PLACE_8(1) */" if dbg else "" + + self.msgpack_in_value = "" + self.msgpack_out_value = "std::string" + d + 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] + ): + d = " /* CheckAPIUse(100)::PLACE_9(1) */" if dbg else "" + vt = self.value_type.replace("*", "") + + self.msgpack_in_value = "" + self.msgpack_out_value = "std::vector<{}>".format(vt) + d + 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] + ): + d1 = " /* CheckAPIUse(100)::PLACE_10(1) */" if dbg else "" + d2 = " /* CheckAPIUse(100)::PLACE_10(2) */" if dbg else "" + vt = self.value_type + + self.msgpack_in_value = "std::vector<{}>".format(vt) + d1 + self.msgpack_out_value = "std::vector<{}>".format(vt) + d2 + self.done = True + return + + # CheckAPIUse_WAY_11 + if self.value_type in known_STANDARD_C_TYPES: + d = " /* CheckAPIUse(100)::PLACE_11(1) */" if dbg else "" + + self.msgpack_in_value = self.value_type + d + self.msgpack_out_value = "" + self.done = True + return + + # CheckAPIUse(100)::PLACE_12 + if ContainsHdlVoidPointer(self.value_type): + d = " /* CheckAPIUse(100)::PLACE_12(1) */" if dbg else "" + + self.msgpack_in_value = "PtrValue" + d + self.msgpack_out_value = "" + self.done = True + return + + # CheckAPIUse(100)::PLACE_13 + if ContainsHdlVoidAsReturnPointer(self.value_type): + d = " /* CheckAPIUse(100)::PLACE_13(1) */" if dbg else "" + + self.msgpack_in_value = "" + self.msgpack_out_value = "PtrValue" + d + self.done = True + return + + # CheckAPIUse(100)::PLACE_14 + 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] + ): + d = " /* CheckAPIUse(100)::PLACE_14(1) */" if dbg else "" + vt = self.value_type.replace("*", "").replace("const ", "") + + self.msgpack_in_value = "std::vector<{}>".format(vt) + d + self.msgpack_out_value = "" + self.done = True + return + + # CheckAPIUse(100)::PLACE_15 + if self.value_type in known_STANDARD_C_PTR_TYPES: + d = " /* CheckAPIUse(100)::PLACE_15(1) */" if dbg else "" + vt = self.value_type.replace("*", "") + + self.msgpack_in_value = vt + d + self.msgpack_out_value = vt + d + self.done = True + return + + # CheckAPIUse(100)::PLACE_16 + if CheckKnownEnum(self.value_type): + d = " /* CheckAPIUse(100)::PLACE_16(1) */" if dbg else "" + vt = self.value_type.replace("enum ", "").replace("*", "") + if vt not in parent.group_data.used_enums: + parent.group_data.used_enums.append(vt) + + if not "*" in self.value_type: + self.msgpack_in_value = vt + elif "*" in self.value_type and self.value_type.count("*") == 1 and not "const" in self.value_type: + self.msgpack_in_value = vt + d + self.msgpack_out_value = vt + d + else: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + 'ERROR: "{}" Not supported on InterfaceDataParent::GenerateSharedTuples'.format( + parent.function_complete + ) + ) + raise NameError("Dev kit scan failure") + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse(100)::PLACE_17 - 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) + ): + d = " /* CheckAPIUse(100)::PLACE_18(1) */" if dbg else "" + vt = self.value_type.replace("struct ", "").replace("*", "").strip() + + self.msgpack_in_value = "IFC_{}".format(vt) if vt == "tm" else "" + self.msgpack_out_value = "IFC_{}".format(vt) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse(100)::PLACE_18 - 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) + ): + d = " /* CheckAPIUse(100)::PLACE_18(1) */" if dbg else "" + vt = self.value_type.replace("const struct ", "").replace("*", "").strip() + + self.msgpack_in_value = "IFC_{}".format(vt) + d + self.msgpack_out_value = "" + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse(100)::PLACE_19 - 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) + ): + d = " /* CheckAPIUse(100)::PLACE_19(1) */" if dbg else "" + vt = self.value_type.replace("struct ", "").replace("*", "").strip() + + self.msgpack_in_value = "" + self.msgpack_out_value = "std::vector".format(vt) + d + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse(100)::PLACE_20 - 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) + ): + d = " /* CheckAPIUse(100)::PLACE_20(1) */" if dbg else "" + vt = self.value_type.replace("struct ", "").strip() + + self.msgpack_in_value = "std::vector".format(vt) + d + self.msgpack_out_value = "std::vector".format(vt) + d + self.done = True + return + + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("ERROR: Failed to scan code for shared code generate!") + + print("FUNCTION: {}".format(self.parent.function_complete)) + print("COMPLETE: {}".format(self.value)) + print("NAME: {}".format(self.value_name)) + print("TYPE: {}".format(self.value_type)) + raise NameError("Dev kit scan failure") + 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 = "{}{}/include/kodi/c-api/".format(KODI_DIR, DEVKIT_DIR) + target_dir = "{}{}/src/shared/api/".format(KODI_DIR, DEVKIT_DIR) + 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 = [] + + if self.group_data.offscreen.used: + if self.funcname.endswith(self.group_data.offscreen.start_func): + tuple_in_values += ( + "PtrKodiOffscreen, uint64_t, int, int, int, int, PtrValue /* < Offscreen render */{}".format( + ", " if self.values else "" + ) + ) + if self.retval: + tuple_out_values += ", " + + tuple_out_values += "PtrAddonOffscreen, bool /* < Offscreen render */" + + if self.values: + tuple_out_values += ", " + elif self.funcname.endswith(self.group_data.offscreen.stop_func) or self.funcname.endswith( + self.group_data.offscreen.render_func + ): + tuple_in_values += "PtrAddonOffscreen /* < Offscreen render */{}".format(", " if self.values else "") + + 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" + + 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 [] + ) + + if ret_value: + self.child_addon_c_lib_function_shared_tuple_out_list.append(ret_value) + tuple_out += ret_value + + if self.ContainsOutOnIn() and not tuple_out.endswith(", ") and not tuple_out_values.startswith(", "): + tuple_out += ", " if ret_value 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! */" + ) + ) + + # if (self.funcname_ifc == "kodi_addon_web_create_control_v1"): + # print(tuple_out) + # exit() + + 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, file_text): + 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 + + dbg = parent.options.debug # To have shorter below + + # 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 + #): + #print("-ss-> " + self.parent.funcname) + #print("-ss-> " + self.value_type) + #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 < len(value_list) - 1 and "size_t*" in value_list[cnt + 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, + 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-A (0004) */" if parent.options.debug else "", + ) + self.function_value = "{}.data(){}".format( + self.value_name, + " /* CheckAPIUse_WAY_11-B (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_12b + if (ContainsHdlVoidPointer(self.value_type.replace("*", "")) or self.value_type == "KODI_ADDON_HDL*") and self.value_type.count("*") == 1: + d1 = " /* CheckAPIUse(90)::PLACE_12(1) */" if dbg else "" + d2 = " /* CheckAPIUse(90)::PLACE_12(2) */" if dbg else "" + d3 = " /* CheckAPIUse(90)::PLACE_12(3) */" if dbg else "" + + n = self.value_name + t = self.value_type.replace("*", "") + no = self.cnt - self.ignored_count + + self.msgpack_in_value = "{} {} = nullptr;{}".format(t, n, d1) + self.function_value = "&{}{}".format(n, d2) + self.msgpack_out_value = "PtrValue({}){}".format(n, d3) + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_12 + if ContainsHdlVoidPointer(self.value_type): + n = self.value_name + t = self.value_type + no = self.cnt - self.ignored_count + + if self.value_type == "KODI_OWN_HDL": + d1 = " /* CheckAPIUse(90)::PLACE_13_1(1) */" if dbg else "" + + self.function_value = "auto_gen_hdl{}".format(d1) + + elif self.value_type == "const KODI_ADDON_INSTANCE_HDL": + d1 = " /* CheckAPIUse(90)::PLACE_13_2(1) */" if dbg else "" + d2 = " /* CheckAPIUse(90)::PLACE_13_2(2) */" if dbg else "" + + self.function_value = "{}->hdl{}".format(n, d1) + self.msgpack_in_value = "KODI_ADDON_INSTANCE_STRUCT* {} = reinterpret_cast(std::get<{}>(t));{}".format( + n, no, d2 + ) + + else: + d1 = " /* CheckAPIUse(90)::PLACE_13_3(1) */" if dbg else "" + d2 = " /* CheckAPIUse(90)::PLACE_13_3(2) */" if dbg else "" + + self.function_value = "{}{}".format(n, d1) + self.msgpack_in_value = "{} {} = reinterpret_cast<{}>(std::get<{}>(t));{}".format( + t, n, t.replace("const ", ""), no, d2 + ) + + 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: + d1 = " /* CheckAPIUse(90)::PLACE_14(1) */" if dbg else "" + d2 = " /* CheckAPIUse(90)::PLACE_14(2) */" if dbg else "" + d3 = " /* CheckAPIUse(90)::PLACE_14(3) */" if dbg else "" + + n = self.value_name + t = self.value_type.replace("*", "") + no = self.cnt - self.ignored_count + + self.msgpack_in_value = "{} {} = std::get<{}>(t);{}".format(t, n, no, d1) + self.function_value = "&{}{}".format(n, d2) + self.msgpack_out_value = "{}{}".format(n, d3) if not "const " in t else "" + + else: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + 'ERROR: Function "{}" Not supported on InterfaceDataParent::GenerateKodiSourceCPPSwitchCase (on CheckAPIUse(90)::PLACE_13)'.format( + parent.function_complete + ) + ) + raise NameError("Dev kit scan failure") + + self.done = True + return + + # WARNING CONFIRMED_NO + # CheckAPIUse_WAY_14 + if CheckKnownEnum(self.value_type): + n = self.value_name + t = self.value_type.replace("*", "") + no = self.cnt - self.ignored_count + + if self.value_type.count("*") == 0: + d1 = " /* CheckAPIUse(90)::PLACE_15_1(1) */" if dbg else "" + d2 = " /* CheckAPIUse(90)::PLACE_15_1(2) */" if dbg else "" + d3 = " /* CheckAPIUse(90)::PLACE_15_1(3) */" if dbg else "" + + self.msgpack_in_value = "{} {} = std::get<{}>(t);{}".format(t, n, no, d1) + self.function_value = "{}{}".format(n, d2) + self.msgpack_out_value = "" + + elif self.value_type.count("*") == 1: + d1 = " /* CheckAPIUse(90)::PLACE_15_2(1) */" if dbg else "" + d2 = " /* CheckAPIUse(90)::PLACE_15_2(2) */" if dbg else "" + d3 = " /* CheckAPIUse(90)::PLACE_15_2(3) */" if dbg else "" + + self.msgpack_in_value = "{} {} = std::get<{}>(t);{}".format(t, n, no, d1) + self.function_value = "&{}{}".format(n, d2) + self.msgpack_out_value = "{}{}".format(n, d3) if not "const " in t else "" + + else: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal( + 'FATAL: Function "{}" Not supported on InterfaceDataParent::GenerateKodiSourceCPPSwitchCase (on CheckAPIUse(90)::PLACE_14)'.format( + parent.function_complete + ) + ) + raise NameError("Dev kit scan failure") + + 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) + ): + d1 = " /* CheckAPIUse(90)::PLACE_16_1(1) */" if dbg else "" + d2 = " /* CheckAPIUse(90)::PLACE_16_1(2) */" if dbg else "" + d3 = " /* CheckAPIUse(90)::PLACE_16_1(3) */" if dbg else "" + d4 = " /* CheckAPIUse(90)::PLACE_16_1(4) */" if dbg else "" + d5 = " /* CheckAPIUse(90)::PLACE_16_1(5) */" if dbg else "" + + n = self.value_name + t = self.value_type.replace("*", "") + no = self.cnt - self.ignored_count + struct_name = self.value_type.replace("struct ", "").replace("*", "").strip() + + if struct_name == "tm": + self.additional_code_1 = " {} {};{}".format(struct_name, n, d1) + self.msgpack_in_value = "std::get<{}>(t).SetCStructure(&{});{}".format(no, n, d2) + else: + self.ignored_count += 1 + self.msgpack_in_value = "{} {} = {{}};{}".format(t, n, d3) + + self.function_value = "&{}{}".format(n, d4) + self.msgpack_out_value = "&{}{}".format(n, d5) + + shared_struct = t + if parent.group_data.KnownSharedStructureWithClean(shared_struct): + self.additional_code_4 += " IFC_{}::CleanCStructure(&{});\n".format( + shared_struct.replace("struct ", ""), n + ) + 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) + ): + d1 = " /* CheckAPIUse(90)::PLACE_19_1(1) */" if dbg else "" + d2 = " /* CheckAPIUse(90)::PLACE_19_2(1) */" if dbg else "" + d3 = " /* CheckAPIUse(90)::PLACE_19_3(1) */" if dbg else "" + d4 = " /* CheckAPIUse(90)::PLACE_19_4(1) */" if dbg else "" + d5 = " /* CheckAPIUse(90)::PLACE_19_5(1) */" if dbg else "" + + 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, d1 + ) + self.additional_code_2 = " std::vector<{}> {}({});{}\n".format( + self.value_type, value_name, value_list[cnt + ignored_count + 1].split()[-1].strip(), d2 + ) + 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, d3) + 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, d4 + ) + self.additional_code_3 += " }\n" + self.msgpack_out_value = "ifc_{}{}".format(value_name, d5) + self.done = True + return + + if self.group_data.override_use_direct_api_only: + return True + + dbg = self.options.debug # To have shorter below + + if "---AUTO_GEN_PARSE---".format(self.funcname_ifc) in file_text: + upper_name = self.funcname_ifc.upper() + target_file = self.group_data.path.replace( + self.search_dir, + "{}{}/src/addon/api/".format(KODI_DIR, DEVKIT_DIR), + ).replace(".h", ".cpp") + code_work = CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD_{}".format(upper_name)) + + code = ( + " case funcChild_{0}:\n" + " {{\n" + " // Original API call: {1}\n" + " // Tuple in: {2}\n" + " // Tuple out: {3}\n" + "\n" + " /*---AUTO_GEN_PARSE---*/\n" + "{4}" + " /*---AUTO_GEN_PARSE---*/\n" + " return true;\n" + " }}\n" + ).format( + self.funcname_ifc, # 0 + self.function_complete, # 1 + self.child_addon_c_lib_function_shared_tuple_in, # 2 + self.child_addon_c_lib_function_shared_tuple_out, # 3 + code_work + if code_work + else '#warning USE_HAND_MAKE set for function "{}" and must be set by hand.\n'.format( + self.function_complete + ), # 4 + upper_name, + ) # 5 + 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: + if self.retval == "char*": + d1 = " /* CheckAPIUse(90)::RETURN(1) */" if dbg else "" + + return_value = 'auto_gen_ret ? auto_gen_ret : ""{}'.format(d1) + + elif self.retval in known_STANDARD_C_TYPES: + d1 = " /* CheckAPIUse(90)::RETURN(2) */" if dbg else "" + + return_value = "auto_gen_ret{}".format(d1) + + elif CheckKnownEnum(self.retval): + d1 = " /* CheckAPIUse(90)::RETURN(3) */" if dbg else "" + + return_value = "auto_gen_ret{}".format(d1) + + elif ContainsHdlVoidPointer(self.retval): + d1 = " /* CheckAPIUse(90)::RETURN(4) */" if dbg else "" + + return_value = "PtrValue(auto_gen_ret){}\n".format(d1) + + elif self.retval != "void": + d1 = " /* CheckAPIUse(90)::RETURN(5) */" if dbg else "" + + return_value = "auto_gen_ret{}".format(self.retval, d1) + + else: + return_value = "" + + msgpack_out_values.append(return_value) + + if self.group_data.offscreen.used: + if self.funcname.endswith(self.group_data.offscreen.start_func): + msgpack_out_values.append("PtrAddonOffscreen(auto_gen_render_control)") + msgpack_out_values.append("auto_gen_render_ret") + count += 7 # Increase count about offscreen render parts + elif self.funcname.endswith(self.group_data.offscreen.stop_func) or self.funcname.endswith( + self.group_data.offscreen.render_func + ): + count += 1 # Increase count about offscreen render parts + + for value in self.values: + apiUse = CheckAPIUse(self, count, value, self.values, ignored_count, file_text) + 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) + + code = ( + " case funcChild_{}:\n" + " {{\n" + " // Original API call: {}\n" + " // Tuple in: {}\n" + " // Tuple out: {}\n" + "\n" + ).format( + self.funcname_ifc, + self.function_complete, + self.child_addon_c_lib_function_shared_tuple_in, + self.child_addon_c_lib_function_shared_tuple_out, + ) + + if not no_in: + get_no = 0 + code += " msgChild__IN_{} t = in.get().as();\n".format(self.funcname_ifc) + if self.group_data.offscreen.used: + self.group_data.additional_addon_lib_includes.append( + '#include "src/addon/core/addon_offscreen_render_control.h"' + ) + if self.funcname.endswith(self.group_data.offscreen.start_func): + code += ( + " PtrKodiOffscreen kodiOffsetHdl = std::get<0>(t);\n" + " uint64_t renderId = std::get<1>(t);\n" + " int x = std::get<2>(t);\n" + " int y = std::get<3>(t);\n" + " int width = std::get<4>(t);\n" + " int height = std::get<5>(t);\n" + " ADDON_HARDWARE_CONTEXT context = reinterpret_cast(std::get<6>(t));\n" + " IAddonOffscreenRenderControl* auto_gen_render_control = GenerateOffscreenControl(kodiOffsetHdl,\n" + " renderId,\n" + " x,\n" + " y,\n" + " width,\n" + " height,\n" + " context);\n" + " bool auto_gen_render_ret = auto_gen_render_control && auto_gen_render_control->Start();\n" + "\n" + ) + elif self.funcname.endswith(self.group_data.offscreen.render_func): + code += ( + " IAddonOffscreenRenderControl* auto_gen_render_control = reinterpret_cast(std::get<0>(t));\n" + " if (auto_gen_render_control)\n" + " auto_gen_render_control->RenderBegin();\n" + "\n" + ) + elif self.funcname.endswith(self.group_data.offscreen.stop_func): + code += " IAddonOffscreenRenderControl* auto_gen_render_control = reinterpret_cast(std::get<0>(t));\n" + else: + code += " KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t));\n" + elif "kodi_addon_create" != self.funcname: + code += " KODI_ADDON_HDL auto_gen_hdl = reinterpret_cast(std::get<0>(t));\n" + + code += ("{0}" " {1}\n" "{2}" " {3}{4}(this{5}{6});\n" "\n" "{7}").format( + "".join(additional_code_1), # 0 + "\n ".join(msgpack_in_values), # 1 + "".join(additional_code_2), # 2 + "{} auto_gen_ret = ".format(self.retval) if default_ret else "", # 3 + self.funcname_ifc, # 4 + ", " if len(function_values) > 0 else "", # 5 + ", ".join(function_values), # 6 + "".join(additional_code_3), # 7 + ) + + 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) + + if self.group_data.offscreen.used: + if self.funcname.endswith(self.group_data.offscreen.render_func): + code += " if (auto_gen_render_control) \n" " auto_gen_render_control->RenderEnd();\n" + elif self.funcname.endswith(self.group_data.offscreen.stop_func): + code += ( + " if (auto_gen_render_control)\n" + " {{\n" + " auto_gen_render_control->Stop();\n" + " delete auto_gen_render_control;\n" + " }}\n" + ) + + 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): + vt = self.value_type.replace("*", "") + g3 = m.group(3) + g5 = m.group(5) + + self.msgpack_in_value = "ifc_{}".format(m.group(3)) + self.msgpack_out_value = ( + "std::memcpy(*{0}, std::get<{1}>(t).data(), sizeof({2}) * {3});" + ).format( + g3, + cnt_out, + vt, + g5, + ) + self.additional_code_1 = ( + " std::array<{0}, {1}> ifc_{2};\n" + " std::memcpy(ifc_{2}.data(), *{2}, sizeof({3}) * {1});\n" + ).format( + self.value_type, + g5, + g3, + vt, + ) + + 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): + vt = self.value_type.replace("*", "") + g3 = m.group(3) + g4 = m.group(4) + + self.msgpack_in_value = "ifc_{}".format(m.group(3)) + self.msgpack_out_value = ( + "std::memcpy(*{}, std::get<{}>(t).data(), sizeof({}) * {});" + ).format( + g3, + cnt_out, + vt, + g4, + ) + self.additional_code_1 = ( + " std::array<{0}, {1}> ifc_{2};\n" " std::memcpy(ifc_{2}.data(), *{2}, sizeof({3}) * {1});\n" + ).format( + self.value_type, + g4, + g3, + vt + ) + 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-1) */" 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" + + if self.group_data.offscreen.used and ( + self.funcname.endswith(self.group_data.offscreen.render_func) + or self.funcname.endswith(self.group_data.offscreen.start_func) + or self.funcname.endswith(self.group_data.offscreen.stop_func) + ): + offscreenUsed = True + else: + offscreenUsed = False + + # Generate the initial first part of function + code = "" + code += "{} CHdl_kodi_{}::{}({}{})\n".format( + self.retval, + self.header_group_id, + self.funcname_ifc, + "IOffscreenRenderProcess* proc, " if offscreenUsed else "", + 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" " if (!m_interface.m_directDll)\n" " {\n" + + haveRenderIn = False + if self.group_data.offscreen.used: + if self.funcname.endswith(self.group_data.offscreen.start_func): + code += ( + " int x = 0;\n" + " int y = 0;\n" + " int width = 0;\n" + " int height = 0;\n" + " ADDON_HARDWARE_CONTEXT context = nullptr;\n" + " if (!proc || !proc->GetOffscreenRenderInfos(x, y, width, height, context) || !proc->CreateRenderHelper(m_process))\n" + " return{};\n" + "\n" + ).format(GetDefaultReturn(self.retval, self.function_complete, file_text)) + elif self.funcname.endswith(self.group_data.offscreen.render_func): + code += ( + " if (!proc)\n" + " return{};\n" "\n" + " proc->GetRenderHelper()->Begin();\n" "\n" + ).format(GetDefaultReturn(self.retval, self.function_complete, file_text)) + elif self.funcname.endswith(self.group_data.offscreen.stop_func): + code += ( + " if (!proc)\n" + " return{};\n" "\n" + ).format( + GetDefaultReturn(self.retval, self.function_complete, file_text) + ) + haveRenderIn = 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 and not haveRenderIn: + code += (" m_process->SendMessage(funcGroup_{}, funcChild_{});\n" " return;\n").format( + self.header_group_id, self.funcname_ifc + ) + 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 or haveRenderIn: + 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 = "" + if haveRenderIn: + if self.funcname.endswith(self.group_data.offscreen.start_func): + in_values += "PtrKodiOffscreen(proc), proc->GetUsedId(), x, y, width, height, PtrValue(context){}".format( + ", " if haveIn else "" + ) + cnt_out += 2 + elif self.funcname.endswith(self.group_data.offscreen.stop_func) or self.funcname.endswith( + self.group_data.offscreen.render_func + ): + in_values += "proc->GetAddonOffscreenHdl(){}".format(", " if haveIn else "") + if haveIn: + 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 or haveRenderIn) and haveOut: + code += ( + " if (!m_process->SendMessage(funcGroup_{}, funcChild_{}, in, out))\n" " return{};\n" + ).format( + self.header_group_id, + self.funcname_ifc, + 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 + ) + if haveRenderIn: + if self.funcname.endswith(self.group_data.offscreen.stop_func): + code += "\n" " proc->GetRenderHelper()->Deinit();\n" + elif self.funcname.endswith(self.group_data.offscreen.render_func): + code += "\n" " proc->GetRenderHelper()->End();\n" + + code += " return;\n" + else: + code += ( + " if (!m_process->SendMessageOnlyGetReturn(funcGroup_{}, funcChild_{}, out))\n" + " return{};\n" + ).format( + self.header_group_id, + self.funcname_ifc, + 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" + " msgChild_OUT_{} t = ident.get().as();\n" + ).format(self.funcname_ifc) + if haveRenderIn: + if self.funcname.endswith(self.group_data.offscreen.start_func): + code += ( + " if (std::get<{0}>(t) == 0 || std::get<{1}>(t) == false)\n" + " return{2};\n" + " proc->SetAddonOffscreenHdl(std::get<{0}>(t));\n" + " proc->GetRenderHelper()->Init();\n" + ).format( + "0" if not haveOut else "1", + "1" if not haveOut else "2", + GetDefaultReturn(self.retval, self.function_complete, file_text), + ) + + 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" + + if self.group_data.offscreen.used and ( + self.funcname.endswith(self.group_data.offscreen.render_func) + or self.funcname.endswith(self.group_data.offscreen.start_func) + or self.funcname.endswith(self.group_data.offscreen.stop_func) + ): + offscreenUsed = True + else: + offscreenUsed = False + + self.child_kodi_cpp_function_header = (" {} {}({}{}); // Added with API {}\n").format( + self.retval, + self.funcname_ifc, + "IOffscreenRenderProcess* proc, " if offscreenUsed else "", + 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 ( + cnt == 1 + and (self.value_type.replace("const ", "") == self.parent.groupname.upper() + "_INSTANCE_HDL") + and self.value_type.replace("const ", "") in KNOWN_VOID_PTR_DEFINES + ): + self.value_name = "instanceStruct->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, + "{}{}/src/addon/api/".format(KODI_DIR, DEVKIT_DIR), + ).replace(".h", ".cpp") + + values = [] + retval = "" + code_override = "" + if self.funcname == "kodi_addon_create": + code = CodeGetField_AUTO_GEN_PARSE(target_file, "HAND_EDITED_FIELD={}_2".format(self.funcname_ifc.upper())) + if code != "": + code_override += ( + "/*---AUTO_GEN_PARSE---*/\n" + "{1}" + "/*---AUTO_GEN_PARSE---*/\n" + ).format(self.funcname_ifc.upper(), code) + elif self.funcname == "kodi_addon_create_instance" or 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 self.funcname == "kodi_addon_create_instance" and code.create_code: + code_override += "{}\n".format(code.create_code) + elif self.funcname == "kodi_addon_destroy_instance" and code.destroy_code: + code_override += "{}\n".format(code.destroy_code) + 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 GenerateDevKitSourceCPPFunction'.format(file_text)) + raise + + 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] + void_ptr_value_name_2 = "" + if ( + len(values) > 2 + and values[1][: -len(values[1].split()[-1].strip())].replace("const ", "").strip() + == "KODI_ADDON_INSTANCE_HDL" + ): + void_ptr_value_name_2 = values[1].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 + ) + if void_ptr_value_name_2: + code += " UnionAddonFunctions* instanceStruct = reinterpret_cast({});\n".format( + void_ptr_value_name_2 + ) + 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 GenerateOffscreenRenderSystem(self, file_text, callbacks): + if self.group_data.override_use_direct_api_only: + return True + + scan_name = "---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 "---AUTO_GEN_PARSE---*\/*" + ) + m = re.search(regex_code, line) + if m and m.group(1): + struct_name = m.group(1) + if not struct_name.startswith("struct "): + struct_name = "struct {}".format(struct_name) + + group_data.GenerateSharedStructure(struct_name) + + 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[0], 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[0], options) + + function_kodi = " ".join(function_kodi.split()) + function_kodi = re.sub(",", ", ", function_kodi) + function_kodi = " ".join(function_kodi.replace(")( ", ")(").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.GenerateOffscreenRenderSystem(file_text, callbacks[1]) + 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) + ): + function_kodi = "" + continue + + group_data.interface_data_to_addon.append(data) + function_kodi = "" + + ret.append(group_data) + + for group in ret: + Log.PrintBegin('Generate API interface group "{}" codes ...'.format(group.header_group_id)) + Log.PrintResult(Result.SEE_BELOW) + + group.Generate__xbmc_addons_kodidevkit_src_shared_kodi_ALL_FILES(options) + group.Generate__xbmc_addons_kodidevkit_src_addon_api_ALL_FILES_CPP(options) + group.Generate__xbmc_addons_kodidevkit_src_addon_api_ALL_FILES_H(options) + group.Generate__xbmc_addons_interface_api_ALL_FILES_CPP(options) + group.Generate__xbmc_addons_interface_api_ALL_FILES_H(options) + group.Generate__xbmc_addons_kodidevkit_src_shared_kodi_ALL_FILES_additional(options) + + return ret diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/helper_Log.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/tools/helper_Log.py similarity index 100% rename from xbmc/addons/kodi-dev-kit/tools/code-generator/src/helper_Log.py rename to xbmc/addons/kodi-dev-kit/tools/code-generator/src/tools/helper_Log.py diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/tools/helpers.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/tools/helpers.py new file mode 100644 index 0000000000000..30f22c9d92038 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/tools/helpers.py @@ -0,0 +1,322 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +# Own includes +from code_generator import DEVKIT_DIR, KODI_DIR, INTERFACE_DIR +from .helper_Log import * +from .sub_file_hdl import * + +# Global includes +import glob, os, re + +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 */ +""" + +ignored_FUNCTIONS = [ ] +known_C_STRUCTURES = [ ] + + +def TranslatePathToCUsableString(path, search_dir): + return ( + path.replace(search_dir, "") + .replace(".h", "_h") + .replace("/", "_") + .replace("-", "") + .replace(".in", "") + ) + + +def FileContainsInterfaceAPICalls(file_path): + with open(file_path) as f: + data = f.read() + 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 + + +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: + data = read_file(src_part) + if not data: + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("Error: {}".format(code_generator.LAST_ERROR)) + raise NameError("Dev kit scan failure") + + found = False + begin_found = False + in_doc = 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('//'): + continue + if code_line.startswith('/*'): + in_doc = True + if '*/' in code_line: + in_doc = False + if code_line.endswith("*/"): + continue + code_line.split("*/")[1] + if in_doc: + continue + + if not found: + m = re.search('^\ *(?:typedef)?\ *?struct *([a-zA-Z[0-9_]*)$', code_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_]*)\;$', code_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 IsIgnoredFunction(name): + if name in ignored_FUNCTIONS: + 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 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_typedef = '' + 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): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("ERROR: Function '{}' not match wanted API!".format(self.function)) + raise NameError("Dev kit scan failure") + + 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_typedef = 'PFN_{}_V{}'.format(m.group(2), self.api_added) + for line in file_text.splitlines(): + m = re.search('^\ *' + self.ifc_name_typedef + '\ *([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: + Log.PrintResult(Result.FAILURE) + 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): + Log.PrintResult(Result.FAILURE) + Log.PrintFatal("ERROR: Function '{}' not match wanted API!".format(self.function)) + raise NameError("Dev kit scan failure") + + 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 diff --git a/xbmc/addons/kodi-dev-kit/tools/code-generator/src/tools/sub_file_hdl.py b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/tools/sub_file_hdl.py new file mode 100644 index 0000000000000..fbbca76aad344 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/tools/code-generator/src/tools/sub_file_hdl.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2021-2022 Team Kodi +# This file is part of Kodi - https://kodi.tv +# +# SPDX-License-Identifier: GPL-2.0-or-later +# See LICENSES/README.md for more information. + +import code_generator +import os, sys + +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 + code_generator.LAST_ERROR = "Failed to write file {}: {}".format(name, strerror) + return False + + +def write_file(name, data, clang=False): + """Write a file.""" + try: + os.makedirs(os.path.dirname(name), exist_ok=True) + 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 + code_generator.LAST_ERROR = "Failed to write file {}: {}".format(name, strerror) + return False + if clang: + os.system("clang-format -style=file -i {}".format(name)) + + return True diff --git a/xbmc/addons/settings/AddonSettings.cpp b/xbmc/addons/settings/AddonSettings.cpp index 24f1c05b6c60e..b5d70e91d738b 100644 --- a/xbmc/addons/settings/AddonSettings.cpp +++ b/xbmc/addons/settings/AddonSettings.cpp @@ -12,7 +12,6 @@ #include "GUIInfoManager.h" #include "LangInfo.h" #include "ServiceBroker.h" -#include "addons/binary-addons/AddonInstanceHandler.h" #include "addons/gui/GUIDialogAddonSettings.h" #include "addons/settings/SettingUrlEncodedString.h" #include "filesystem/Directory.h" diff --git a/xbmc/application/ApplicationPowerHandling.cpp b/xbmc/application/ApplicationPowerHandling.cpp index b3b274a047d8a..191215e0efe99 100644 --- a/xbmc/application/ApplicationPowerHandling.cpp +++ b/xbmc/application/ApplicationPowerHandling.cpp @@ -407,18 +407,20 @@ void CApplicationPowerHandling::ActivateScreenSaver(bool forceType /*= false */) m_screensaverIdInUse = "screensaver.xbmc.builtin.dim"; } + ADDON::AddonPtr screenSaver; if (m_screensaverIdInUse == "screensaver.xbmc.builtin.dim" || m_screensaverIdInUse == "screensaver.xbmc.builtin.black" || m_screensaverIdInUse.empty()) { return; } - else if (CServiceBroker::GetAddonMgr().GetAddon(m_screensaverIdInUse, m_pythonScreenSaver, + else if (CServiceBroker::GetAddonMgr().GetAddon(m_screensaverIdInUse, screenSaver, ADDON::ADDON_SCREENSAVER, ADDON::OnlyEnabled::CHOICE_YES)) { - std::string libPath = m_pythonScreenSaver->LibPath(); + std::string libPath = screenSaver->LibPath(); if (CScriptInvocationManager::GetInstance().HasLanguageInvoker(libPath)) { + m_pythonScreenSaver = screenSaver; CLog::Log(LOGDEBUG, "using python screensaver add-on {}", m_screensaverIdInUse); // Don't allow a previously-scheduled alarm to kill our new screensaver diff --git a/xbmc/application/ApplicationVolumeHandling.cpp b/xbmc/application/ApplicationVolumeHandling.cpp index 3f1ba9fbb480a..f3fdcadc5340c 100644 --- a/xbmc/application/ApplicationVolumeHandling.cpp +++ b/xbmc/application/ApplicationVolumeHandling.cpp @@ -20,6 +20,7 @@ #include "settings/lib/Setting.h" #include "utils/Variant.h" #include "utils/XMLUtils.h" +#include "web/WebManager.h" #include @@ -59,6 +60,9 @@ void CApplicationVolumeHandling::VolumeChanged() // if player has volume control, set it. m_appPlayer.SetVolume(m_volumeLevel); m_appPlayer.SetMute(m_muted); + + // if webbrowser has volume control, set it to prevent stream send if not needed. + CServiceBroker::GetWEBManager().SetMute(m_muted || m_volumeLevel <= VOLUME_MINIMUM); } void CApplicationVolumeHandling::ShowVolumeBar(const CAction* action) diff --git a/xbmc/cdrip/EncoderAddon.cpp b/xbmc/cdrip/EncoderAddon.cpp index 4d250adeeaa53..4ea8a5e94ce81 100644 --- a/xbmc/cdrip/EncoderAddon.cpp +++ b/xbmc/cdrip/EncoderAddon.cpp @@ -11,28 +11,13 @@ using namespace ADDON; using namespace KODI::CDRIP; CEncoderAddon::CEncoderAddon(const AddonInfoPtr& addonInfo) - : IAddonInstanceHandler(ADDON_INSTANCE_AUDIOENCODER, addonInfo) + : IInstanceHandler(this, ADDON_INSTANCE_AUDIOENCODER, addonInfo) { - // Create "C" interface structures, used as own parts to prevent API problems on update - m_ifc.audioencoder = new AddonInstance_AudioEncoder(); - m_ifc.audioencoder->toAddon = new KodiToAddonFuncTable_AudioEncoder(); - m_ifc.audioencoder->toKodi = new AddonToKodiFuncTable_AudioEncoder(); - m_ifc.audioencoder->toKodi->kodiInstance = this; - m_ifc.audioencoder->toKodi->write = cb_write; - m_ifc.audioencoder->toKodi->seek = cb_seek; -} - -CEncoderAddon::~CEncoderAddon() -{ - // Delete "C" interface structures - delete m_ifc.audioencoder->toKodi; - delete m_ifc.audioencoder->toAddon; - delete m_ifc.audioencoder; } bool CEncoderAddon::Init() { - if (CreateInstance() != ADDON_STATUS_OK || !m_ifc.audioencoder->toAddon->start) + if (CreateInstance() != ADDON_STATUS_OK) return false; KODI_ADDON_AUDIOENCODER_INFO_TAG tag{}; @@ -49,21 +34,24 @@ bool CEncoderAddon::Init() tag.genre = m_strGenre.c_str(); tag.comment = m_strComment.c_str(); - return m_ifc.audioencoder->toAddon->start(m_ifc.hdl, &tag); + const auto ifc = m_ifc->kodi_addoninstance_audioencoder_h; + const bool ret = ifc->kodi_addon_audioencoder_start_v1(m_instance, &tag); + if (!ret) + DestroyInstance(); + + return ret; } ssize_t CEncoderAddon::Encode(uint8_t* pbtStream, size_t nNumBytesRead) { - if (m_ifc.audioencoder->toAddon->encode) - return m_ifc.audioencoder->toAddon->encode(m_ifc.hdl, pbtStream, nNumBytesRead); - return 0; + const auto ifc = m_ifc->kodi_addoninstance_audioencoder_h; + return ifc->kodi_addon_audioencoder_encode_v1(m_instance, pbtStream, nNumBytesRead); } bool CEncoderAddon::Close() { - bool ret = false; - if (m_ifc.audioencoder->toAddon->finish) - ret = m_ifc.audioencoder->toAddon->finish(m_ifc.hdl); + const auto ifc = m_ifc->kodi_addoninstance_audioencoder_h; + const bool ret = ifc->kodi_addon_audioencoder_finish_v1(m_instance); DestroyInstance(); @@ -79,17 +67,3 @@ ssize_t CEncoderAddon::Seek(ssize_t pos, int whence) { return CEncoder::Seek(pos, whence); } - -ssize_t CEncoderAddon::cb_write(KODI_HANDLE kodiInstance, const uint8_t* data, size_t len) -{ - if (!kodiInstance || !data) - return -1; - return static_cast(kodiInstance)->Write(data, len); -} - -ssize_t CEncoderAddon::cb_seek(KODI_HANDLE kodiInstance, ssize_t pos, int whence) -{ - if (!kodiInstance) - return -1; - return static_cast(kodiInstance)->Seek(pos, whence); -} diff --git a/xbmc/cdrip/EncoderAddon.h b/xbmc/cdrip/EncoderAddon.h index 6721d281afb1c..b3984692dfe79 100644 --- a/xbmc/cdrip/EncoderAddon.h +++ b/xbmc/cdrip/EncoderAddon.h @@ -8,19 +8,19 @@ #pragma once #include "Encoder.h" -#include "addons/binary-addons/AddonInstanceHandler.h" -#include "addons/kodi-dev-kit/include/kodi/addon-instance/AudioEncoder.h" +#include "addons/interface/InstanceHandler.h" +#include "addons/interface/api/addon-instance/audioencoder.h" namespace KODI { namespace CDRIP { -class CEncoderAddon : public CEncoder, public ADDON::IAddonInstanceHandler +class CEncoderAddon : public CEncoder, public KODI::ADDONS::INTERFACE::IInstanceHandler { public: explicit CEncoderAddon(const ADDON::AddonInfoPtr& addonInfo); - ~CEncoderAddon() override; + ~CEncoderAddon() override = default; // Child functions related to IEncoder within CEncoder bool Init() override; @@ -29,14 +29,9 @@ class CEncoderAddon : public CEncoder, public ADDON::IAddonInstanceHandler // Addon callback functions ssize_t Write(const uint8_t* data, size_t len) override; + /*---AUTO_GEN_PARSE---*/ ssize_t Seek(ssize_t pos, int whence) override; - -private: - // Currently needed addon interface parts - //@{ - static ssize_t cb_write(KODI_HANDLE kodiInstance, const uint8_t* data, size_t len); - static ssize_t cb_seek(KODI_HANDLE kodiInstance, ssize_t pos, int whence); - //@} + /*---AUTO_GEN_PARSE---*/ }; } /* namespace CDRIP */ diff --git a/xbmc/cores/AudioEngine/Interfaces/AE.h b/xbmc/cores/AudioEngine/Interfaces/AE.h index a8562eaa42f77..a51e65f0adbeb 100644 --- a/xbmc/cores/AudioEngine/Interfaces/AE.h +++ b/xbmc/cores/AudioEngine/Interfaces/AE.h @@ -34,10 +34,16 @@ class IAudioCallback; class IAEClockCallback; class CAEStreamInfo; -namespace ADDON +namespace KODI { -struct Interface_AudioEngine; -} +namespace ADDONS +{ +namespace INTERFACE +{ +class CHdl_kodi_audio_engine_h; +} // namespace INTERFACE +} // namespace ADDONS +} // namespace KODI /* sound options */ #define AE_SOUND_OFF 0 /*! disable sounds */ @@ -269,7 +275,7 @@ class IAE private: friend class IAEStreamDeleter; friend class IAESoundDeleter; - friend struct ADDON::Interface_AudioEngine; + friend struct KODI::ADDONS::INTERFACE::CHdl_kodi_audio_engine_h; /*! * \brief This method will remove the specified stream from the engine. diff --git a/xbmc/cores/RetroPlayer/RetroPlayer.cpp b/xbmc/cores/RetroPlayer/RetroPlayer.cpp index c2df077b3c08c..941b775929402 100644 --- a/xbmc/cores/RetroPlayer/RetroPlayer.cpp +++ b/xbmc/cores/RetroPlayer/RetroPlayer.cpp @@ -32,6 +32,7 @@ #include "games/GameSettings.h" #include "games/GameUtils.h" #include "games/addons/GameClient.h" +#include "games/addons/GameClientController.h" #include "games/addons/input/GameClientInput.h" #include "games/tags/GameInfoTag.h" #include "guilib/GUIComponent.h" @@ -122,7 +123,8 @@ bool CRetroPlayer::OpenFile(const CFileItem& file, const CPlayerOptions& options } else { - m_gameClient = std::static_pointer_cast(addon); + auto client = CServiceBroker::GetGameServices().GameClientController().GetGameClient(addon->ID()); + m_gameClient = client->GetActiveGameClient(); if (m_gameClient->Initialize()) { m_streamManager.reset(new CRPStreamManager(*m_renderManager, *m_processInfo)); diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.cpp index be78d9cfc37e6..15cd6abc02445 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,20 +20,9 @@ CAddonVideoCodec::CAddonVideoCodec(CProcessInfo& processInfo, ADDON::AddonInfoPtr& addonInfo, KODI_HANDLE parentInstance) : CDVDVideoCodec(processInfo), - IAddonInstanceHandler( - ADDON_INSTANCE_VIDEOCODEC, addonInfo, ADDON::ADDON_INSTANCE_ID_UNUSED, parentInstance), - m_codecFlags(0), - m_displayAspect(0.0f) + IInstanceHandler(this, ADDON_INSTANCE_VIDEOCODEC, addonInfo, ADDON::ADDON_INSTANCE_ID_UNUSED, parentInstance) { - m_ifc.videocodec = new AddonInstance_VideoCodec; - m_ifc.videocodec->props = new AddonProps_VideoCodec(); - m_ifc.videocodec->toAddon = new KodiToAddonFuncTable_VideoCodec(); - m_ifc.videocodec->toKodi = new AddonToKodiFuncTable_VideoCodec(); - - m_ifc.videocodec->toKodi->kodiInstance = this; - m_ifc.videocodec->toKodi->get_frame_buffer = get_frame_buffer; - m_ifc.videocodec->toKodi->release_frame_buffer = release_frame_buffer; - if (CreateInstance() != ADDON_STATUS_OK || !m_ifc.videocodec->toAddon->open) + if (CreateInstance() != ADDON_STATUS_OK) { CLog::Log(LOGERROR, "CInputStreamAddon: Failed to create add-on instance for '{}'", addonInfo->ID()); @@ -46,17 +36,11 @@ CAddonVideoCodec::~CAddonVideoCodec() Reset(); DestroyInstance(); - - // Delete "C" interface structures - delete m_ifc.videocodec->toAddon; - delete m_ifc.videocodec->toKodi; - delete m_ifc.videocodec->props; - delete m_ifc.videocodec; } 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: @@ -65,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; @@ -100,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; @@ -126,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; @@ -165,9 +149,6 @@ bool CAddonVideoCodec::CopyToInitData(VIDEOCODEC_INITDATA &initData, CDVDStreamI bool CAddonVideoCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) { - if (!m_ifc.videocodec->toAddon->open) - return false; - unsigned int nformats(0); m_formats[nformats++] = VIDEOCODEC_FORMAT_YV12; m_formats[nformats] = VIDEOCODEC_FORMAT_UNKNOWN; @@ -176,7 +157,8 @@ bool CAddonVideoCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) if (!CopyToInitData(initData, hints)) return false; - bool ret = m_ifc.videocodec->toAddon->open(m_ifc.videocodec, &initData); + bool ret = + m_ifc->kodi_addoninstance_videocodec_h->kodi_addon_videocodec_open_v1(m_instance, &initData); m_processInfo.SetVideoDecoderName(GetName(), false); return ret; @@ -184,34 +166,28 @@ bool CAddonVideoCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) bool CAddonVideoCodec::Reconfigure(CDVDStreamInfo &hints) { - if (!m_ifc.videocodec->toAddon->reconfigure) - return false; - VIDEOCODEC_INITDATA initData; if (!CopyToInitData(initData, hints)) return false; - return m_ifc.videocodec->toAddon->reconfigure(m_ifc.videocodec, &initData); + return m_ifc->kodi_addoninstance_videocodec_h->kodi_addon_videocodec_reconfigure_v1(m_instance, + &initData); } bool CAddonVideoCodec::AddData(const DemuxPacket &packet) { - if (!m_ifc.videocodec->toAddon->add_data) - return false; - - return m_ifc.videocodec->toAddon->add_data(m_ifc.videocodec, &packet); + return m_ifc->kodi_addoninstance_videocodec_h->kodi_addon_videocodec_add_data_v1(m_instance, + &packet); } CDVDVideoCodec::VCReturn CAddonVideoCodec::GetPicture(VideoPicture* pVideoPicture) { - if (!m_ifc.videocodec->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_ifc.videocodec->toAddon->get_picture(m_ifc.videocodec, &picture)) + switch (m_ifc->kodi_addoninstance_videocodec_h->kodi_addon_videocodec_get_picture_v1(m_instance, + &picture)) { case VIDEOCODEC_RETVAL::VC_NONE: return CDVDVideoCodec::VC_NONE; @@ -248,15 +224,16 @@ 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; @@ -275,8 +252,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) @@ -297,9 +274,7 @@ CDVDVideoCodec::VCReturn CAddonVideoCodec::GetPicture(VideoPicture* pVideoPictur const char* CAddonVideoCodec::GetName() { - if (m_ifc.videocodec->toAddon->get_name) - return m_ifc.videocodec->toAddon->get_name(m_ifc.videocodec); - return ""; + return m_ifc->kodi_addoninstance_videocodec_h->kodi_addon_videocodec_get_name_v1(m_instance); } void CAddonVideoCodec::Reset() @@ -313,54 +288,38 @@ void CAddonVideoCodec::Reset() picture.flags = VIDEOCODEC_PICTURE_FLAG_DRAIN; VIDEOCODEC_RETVAL ret; - while ((ret = m_ifc.videocodec->toAddon->get_picture(m_ifc.videocodec, &picture)) != - VIDEOCODEC_RETVAL::VC_EOF) + while ((ret = m_ifc->kodi_addoninstance_videocodec_h->kodi_addon_videocodec_get_picture_v1( + m_instance, &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_ifc.videocodec->toAddon->reset) - m_ifc.videocodec->toAddon->reset(m_ifc.videocodec); + m_ifc->kodi_addoninstance_videocodec_h->kodi_addon_videocodec_reset_v1(m_instance); } -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 8e3015c1258ff..b4b06b3d34d5f 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.h +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.h @@ -10,14 +10,12 @@ #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 +class CAddonVideoCodec : public CDVDVideoCodec, public KODI::ADDONS::INTERFACE::IInstanceHandler { public: CAddonVideoCodec(CProcessInfo& processInfo, @@ -33,22 +31,21 @@ 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 address 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); - int m_codecFlags; + 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 576ddda150a0a..9362d8c50dc65 100644 --- a/xbmc/cores/VideoPlayer/DVDInputStreams/CMakeLists.txt +++ b/xbmc/cores/VideoPlayer/DVDInputStreams/CMakeLists.txt @@ -8,10 +8,7 @@ set(SOURCES BlurayStateSerializer.cpp DVDInputStreamStack.cpp DVDStateSerializer.cpp InputStreamAddon.cpp - InputStreamMultiSource.cpp - InputStreamPVRBase.cpp - InputStreamPVRChannel.cpp - InputStreamPVRRecording.cpp) + InputStreamMultiSource.cpp) set(HEADERS BlurayStateSerializer.h DVDFactoryInputStream.h @@ -25,10 +22,7 @@ set(HEADERS BlurayStateSerializer.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 9ef1d48a3f0e7..581ed5f76d429 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" @@ -100,10 +98,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 6ad62229b282a..cab3c314f0cf4 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" @@ -44,8 +45,8 @@ CInputStreamAddon::CInputStreamAddon(const AddonInfoPtr& addonInfo, IVideoPlayer* player, const CFileItem& fileitem, const std::string& instanceId) - : IAddonInstanceHandler( - ADDON_INSTANCE_INPUTSTREAM, addonInfo, ADDON_INSTANCE_ID_UNUSED, nullptr, instanceId), + : IInstanceHandler( + this, ADDON_INSTANCE_INPUTSTREAM, addonInfo, ADDON_INSTANCE_ID_UNUSED, nullptr, instanceId), CDVDInputStream(DVDSTREAM_TYPE_ADDON, fileitem), m_player(player) { @@ -122,24 +123,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_ifc.inputstream = new AddonInstance_InputStream; - m_ifc.inputstream->props = new AddonProps_InputStream(); - m_ifc.inputstream->toAddon = new KodiToAddonFuncTable_InputStream(); - m_ifc.inputstream->toKodi = new AddonToKodiFuncTable_InputStream(); - - m_ifc.inputstream->toKodi->kodiInstance = this; - m_ifc.inputstream->toKodi->free_demux_packet = cb_free_demux_packet; - m_ifc.inputstream->toKodi->allocate_demux_packet = cb_allocate_demux_packet; - m_ifc.inputstream->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() != ADDON_STATUS_OK || !m_ifc.inputstream->toAddon->open) + if (CreateInstance() != ADDON_STATUS_OK) return false; INPUTSTREAM_PROPERTY props = {}; @@ -182,30 +166,24 @@ bool CInputStreamAddon::Open() m_player->GetVideoResolution(videoWidth, videoHeight); SetVideoResolution(videoWidth, videoHeight); - bool ret = m_ifc.inputstream->toAddon->open(m_ifc.inputstream, &props); + bool ret = + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_open_v1(m_instance, &props); if (ret) { m_caps = {}; - m_ifc.inputstream->toAddon->get_capabilities(m_ifc.inputstream, &m_caps); + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_capabilities_v1(m_instance, + &m_caps); - m_subAddonProvider = std::shared_ptr( - new CInputStreamProvider(GetAddonInfo(), m_ifc.inputstream->toAddon->addonInstance)); + m_subAddonProvider = + std::shared_ptr(new CInputStreamProvider(GetAddonInfo(), m_instance)); } return ret; } void CInputStreamAddon::Close() { - if (m_ifc.inputstream->toAddon->close) - m_ifc.inputstream->toAddon->close(m_ifc.inputstream); + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_close_v1(m_instance); DestroyInstance(); - - // Delete "C" interface structures - delete m_ifc.inputstream->toAddon; - delete m_ifc.inputstream->toKodi; - delete m_ifc.inputstream->props; - delete m_ifc.inputstream; - m_ifc.inputstream = nullptr; } bool CInputStreamAddon::IsEOF() @@ -215,34 +193,26 @@ bool CInputStreamAddon::IsEOF() int CInputStreamAddon::Read(uint8_t* buf, int buf_size) { - if (!m_ifc.inputstream->toAddon->read_stream) - return -1; - - return m_ifc.inputstream->toAddon->read_stream(m_ifc.inputstream, buf, buf_size); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_read_stream_v1( + m_instance, buf, buf_size); } int64_t CInputStreamAddon::Seek(int64_t offset, int whence) { - if (!m_ifc.inputstream->toAddon->seek_stream) - return -1; - - return m_ifc.inputstream->toAddon->seek_stream(m_ifc.inputstream, offset, whence); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_seek_stream_v1( + m_instance, offset, whence); } int64_t CInputStreamAddon::GetLength() { - if (!m_ifc.inputstream->toAddon->length_stream) - return -1; - - return m_ifc.inputstream->toAddon->length_stream(m_ifc.inputstream); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_length_stream_v1( + m_instance); } int CInputStreamAddon::GetBlockSize() { - if (!m_ifc.inputstream->toAddon->block_size_stream) - return 0; - - return m_ifc.inputstream->toAddon->block_size_stream(m_ifc.inputstream); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_block_size_stream_v1( + m_instance); } bool CInputStreamAddon::CanSeek() @@ -266,18 +236,13 @@ CDVDInputStream::IDisplayTime* CInputStreamAddon::GetIDisplayTime() int CInputStreamAddon::GetTotalTime() { - if (!m_ifc.inputstream->toAddon->get_total_time) - return 0; - - return m_ifc.inputstream->toAddon->get_total_time(m_ifc.inputstream); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_total_time_v1( + m_instance); } int CInputStreamAddon::GetTime() { - if (!m_ifc.inputstream->toAddon->get_time) - return 0; - - return m_ifc.inputstream->toAddon->get_time(m_ifc.inputstream); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_time_v1(m_instance); } // ITime @@ -291,12 +256,10 @@ CDVDInputStream::ITimes* CInputStreamAddon::GetITimes() bool CInputStreamAddon::GetTimes(Times ×) { - if (!m_ifc.inputstream->toAddon->get_times) - return false; - INPUTSTREAM_TIMES i_times; - if (m_ifc.inputstream->toAddon->get_times(m_ifc.inputstream, &i_times)) + if (m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_times_v1(m_instance, + &i_times)) { times.ptsBegin = i_times.ptsBegin; times.ptsEnd = i_times.ptsEnd; @@ -318,10 +281,8 @@ CDVDInputStream::IPosTime* CInputStreamAddon::GetIPosTime() bool CInputStreamAddon::PosTime(int ms) { - if (!m_ifc.inputstream->toAddon->pos_time) - return false; - - return m_ifc.inputstream->toAddon->pos_time(m_ifc.inputstream, ms); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_pos_time_v1(m_instance, + ms); } // IDemux @@ -343,10 +304,8 @@ bool CInputStreamAddon::OpenDemux() DemuxPacket* CInputStreamAddon::ReadDemux() { - if (!m_ifc.inputstream->toAddon->demux_read) - return nullptr; - - return static_cast(m_ifc.inputstream->toAddon->demux_read(m_ifc.inputstream)); + return static_cast( + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_demux_read_v1(m_instance)); } std::vector CInputStreamAddon::GetStreams() const @@ -354,7 +313,8 @@ std::vector CInputStreamAddon::GetStreams() const std::vector streams; INPUTSTREAM_IDS streamIDs = {}; - bool ret = m_ifc.inputstream->toAddon->get_stream_ids(m_ifc.inputstream, &streamIDs); + bool ret = m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_stream_ids_v1( + m_instance, &streamIDs); if (!ret || streamIDs.m_streamCount > INPUTSTREAM_MAX_STREAM_COUNT) return streams; @@ -369,8 +329,8 @@ CDemuxStream* CInputStreamAddon::GetStream(int streamId) const { INPUTSTREAM_INFO stream{}; KODI_HANDLE demuxStream = nullptr; - bool ret = m_ifc.inputstream->toAddon->get_stream(m_ifc.inputstream, streamId, &stream, - &demuxStream, cb_get_stream_transfer); + bool ret = m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_stream_v1( + m_instance, streamId, &stream, &demuxStream, cb_get_stream_transfer); if (!ret || stream.m_streamType == INPUTSTREAM_TYPE_NONE) return nullptr; @@ -510,12 +470,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) { @@ -546,18 +501,14 @@ KODI_HANDLE CInputStreamAddon::cb_get_stream_transfer(KODI_HANDLE handle, void CInputStreamAddon::EnableStream(int streamId, bool enable) { - if (!m_ifc.inputstream->toAddon->enable_stream) - return; - - m_ifc.inputstream->toAddon->enable_stream(m_ifc.inputstream, streamId, enable); + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_enable_stream_v1( + m_instance, streamId, enable); } bool CInputStreamAddon::OpenStream(int streamId) { - if (!m_ifc.inputstream->toAddon->open_stream) - return false; - - return m_ifc.inputstream->toAddon->open_stream(m_ifc.inputstream, streamId); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_open_stream_v1(m_instance, + streamId); } int CInputStreamAddon::GetNrOfStreams() const @@ -567,17 +518,12 @@ int CInputStreamAddon::GetNrOfStreams() const void CInputStreamAddon::SetSpeed(int speed) { - if (!m_ifc.inputstream->toAddon->demux_set_speed) - return; - - m_ifc.inputstream->toAddon->demux_set_speed(m_ifc.inputstream, speed); + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_demux_set_speed_v1(m_instance, + speed); } bool CInputStreamAddon::SeekTime(double time, bool backward, double* startpts) { - if (!m_ifc.inputstream->toAddon->demux_seek_time) - return false; - if ((m_caps.m_mask & INPUTSTREAM_SUPPORTS_IPOSTIME) != 0) { if (!PosTime(static_cast(time))) @@ -590,32 +536,30 @@ bool CInputStreamAddon::SeekTime(double time, bool backward, double* startpts) return true; } - return m_ifc.inputstream->toAddon->demux_seek_time(m_ifc.inputstream, time, backward, startpts); + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_demux_seek_time_v1( + m_instance, time, backward, startpts); } void CInputStreamAddon::AbortDemux() { - if (m_ifc.inputstream->toAddon->demux_abort) - m_ifc.inputstream->toAddon->demux_abort(m_ifc.inputstream); + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_demux_abort_v1(m_instance); } void CInputStreamAddon::FlushDemux() { - if (m_ifc.inputstream->toAddon->demux_flush) - m_ifc.inputstream->toAddon->demux_flush(m_ifc.inputstream); + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_demux_flush_v1(m_instance); } void CInputStreamAddon::SetVideoResolution(int width, int height) { - if (m_ifc.inputstream->toAddon->set_video_resolution) - m_ifc.inputstream->toAddon->set_video_resolution(m_ifc.inputstream, width, height); + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_set_video_resolution_v1( + m_instance, width, height); } bool CInputStreamAddon::IsRealtime() { - if (m_ifc.inputstream->toAddon->is_real_time_stream) - return m_ifc.inputstream->toAddon->is_real_time_stream(m_ifc.inputstream); - return false; + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_is_real_time_stream_v1( + m_instance); } @@ -630,45 +574,35 @@ CDVDInputStream::IChapter* CInputStreamAddon::GetIChapter() int CInputStreamAddon::GetChapter() { - if (m_ifc.inputstream->toAddon->get_chapter) - return m_ifc.inputstream->toAddon->get_chapter(m_ifc.inputstream); - - return -1; + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_chapter_v1(m_instance); } int CInputStreamAddon::GetChapterCount() { - if (m_ifc.inputstream->toAddon->get_chapter_count) - return m_ifc.inputstream->toAddon->get_chapter_count(m_ifc.inputstream); - - return 0; + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_chapter_count_v1( + m_instance); } void CInputStreamAddon::GetChapterName(std::string& name, int ch) { name.clear(); - if (m_ifc.inputstream->toAddon->get_chapter_name) - { - const char* res = m_ifc.inputstream->toAddon->get_chapter_name(m_ifc.inputstream, ch); - if (res) - name = res; - } + const char* res = + m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_chapter_name_v1( + m_instance, ch); + if (res) + name = res; } int64_t CInputStreamAddon::GetChapterPos(int ch) { - if (m_ifc.inputstream->toAddon->get_chapter_pos) - return m_ifc.inputstream->toAddon->get_chapter_pos(m_ifc.inputstream, ch); - - return 0; + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_get_chapter_pos_v1( + m_instance, ch); } bool CInputStreamAddon::SeekChapter(int ch) { - if (m_ifc.inputstream->toAddon->seek_chapter) - return m_ifc.inputstream->toAddon->seek_chapter(m_ifc.inputstream, ch); - - return false; + return m_ifc->kodi_addoninstance_inputstream_h->kodi_addon_inputstream_seek_chapter_v1(m_instance, + ch); } int CInputStreamAddon::ConvertVideoCodecProfile(STREAMCODEC_PROFILE profile) @@ -706,18 +640,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 611b8c740c0f5..a6ca46834c08f 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 @@ -33,14 +33,13 @@ class CInputStreamProvider }; //! \brief Input stream class -class CInputStreamAddon - : public ADDON::IAddonInstanceHandler - , public CDVDInputStream - , public CDVDInputStream::IDisplayTime - , public CDVDInputStream::ITimes - , public CDVDInputStream::IPosTime - , public CDVDInputStream::IDemux - , public CDVDInputStream::IChapter +class CInputStreamAddon : public KODI::ADDONS::INTERFACE::IInstanceHandler, + public CDVDInputStream, + public CDVDInputStream::IDisplayTime, + public CDVDInputStream::ITimes, + public CDVDInputStream::IPosTime, + public CDVDInputStream::IDemux, + public CDVDInputStream::IChapter { public: CInputStreamAddon(const ADDON::AddonInfoPtr& addonInfo, @@ -100,19 +99,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; - - std::shared_ptr m_subAddonProvider; - /*! * Callbacks from add-on to kodi */ @@ -123,7 +109,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 @@ -132,16 +119,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 @@ -158,4 +146,17 @@ 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; + + 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 779b552247ea3..2dfee47495c8b 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" @@ -25,7 +24,6 @@ #include "DVDInputStreams/DVDInputStreamBluray.h" #endif #include "DVDInputStreams/DVDInputStreamNavigator.h" -#include "DVDInputStreams/InputStreamPVRBase.h" #include "FileItem.h" #include "GUIUserMessages.h" #include "LangInfo.h" @@ -2895,12 +2893,6 @@ void CVideoPlayer::HandleMessages() m_processInfo->SeekFinished(0); } - 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/favourites/FavouritesService.cpp b/xbmc/favourites/FavouritesService.cpp index 2a912e79f3b02..f7e2e63bee3c3 100644 --- a/xbmc/favourites/FavouritesService.cpp +++ b/xbmc/favourites/FavouritesService.cpp @@ -259,6 +259,10 @@ std::string CFavouritesService::GetExecutePath(const CFileItem &item, const std: const CURL url(item.GetPath()); execute = CURL::Decode(url.GetHostName()); } + else if (URIUtils::IsProtocol(item.GetPath(), "web")) + { + execute = item.GetPath(); + } else if (item.m_bIsFolder && (CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_playlistAsFolders || !(item.IsSmartPlayList() || item.IsPlayList()))) { diff --git a/xbmc/filesystem/AddonsDirectory.cpp b/xbmc/filesystem/AddonsDirectory.cpp index ddcf9b341b63b..8d609f5f0b245 100644 --- a/xbmc/filesystem/AddonsDirectory.cpp +++ b/xbmc/filesystem/AddonsDirectory.cpp @@ -18,7 +18,8 @@ #include "addons/PluginSource.h" #include "addons/RepositoryUpdater.h" #include "games/GameUtils.h" -#include "games/addons/GameClient.h" +#include "games/GameServices.h" +#include "games/addons/GameClientController.h" #include "guilib/LocalizeStrings.h" #include "guilib/TextureManager.h" #include "interfaces/generic/ScriptInvocationManager.h" @@ -110,7 +111,10 @@ static bool IsStandaloneGame(const AddonPtr& addon) static bool IsEmulator(const AddonPtr& addon) { - return addon->Type() == ADDON_GAMEDLL && std::static_pointer_cast(addon)->SupportsPath(); + if (addon->Type() != ADDON_GAMEDLL) + return false; + auto client = CServiceBroker::GetGameServices().GameClientController().GetGameClient(addon->ID()); + return client->SupportsPath(); } static bool IsGameProvider(const AddonPtr& addon) @@ -125,9 +129,11 @@ static bool IsGameResource(const AddonPtr& addon) static bool IsGameSupportAddon(const AddonPtr& addon) { - return addon->Type() == ADDON_GAMEDLL && - !std::static_pointer_cast(addon)->SupportsPath() && - !std::static_pointer_cast(addon)->SupportsStandalone(); + if (addon->Type() != ADDON_GAMEDLL) + return false; + + auto client = CServiceBroker::GetGameServices().GameClientController().GetGameClient(addon->ID()); + return !client->SupportsPath() && client->SupportsStandalone(); } static bool IsGameAddon(const AddonPtr& addon) @@ -688,6 +694,8 @@ bool CAddonsDirectory::GetDirectory(const CURL& url, CFileItemList &items) type = ADDON_PVRDLL; else if (path.GetFileName() == "kodi.vfs") type = ADDON_VFS; + else if (path.GetFileName() == "kodi.web") + type = ADDON_WEB_MANAGER; else type = ADDON_UNKNOWN; @@ -819,6 +827,8 @@ void CAddonsDirectory::GenerateAddonListing(const CURL& path, pItem->SetProperty("Addon.ValidUpdateOrigin", validUpdateOrigin); pItem->SetProperty("Addon.IsFromOfficialRepo", fromOfficialRepo); pItem->SetProperty("Addon.IsBinary", addon->IsBinary()); + const int programmingLanguage = addon->Type(addon->Type())->LanguageLocalizedStringID(); + pItem->SetProperty("Addon.ProgrammingLanguage", g_localizeStrings.Get(programmingLanguage)); if (installed) pItem->SetProperty("Addon.Status", g_localizeStrings.Get(305)); diff --git a/xbmc/filesystem/CMakeLists.txt b/xbmc/filesystem/CMakeLists.txt index 78aa59b298fdc..e1bb98846cb4e 100644 --- a/xbmc/filesystem/CMakeLists.txt +++ b/xbmc/filesystem/CMakeLists.txt @@ -52,6 +52,7 @@ set(SOURCES AddonsDirectory.cpp VideoDatabaseDirectory.cpp VideoDatabaseFile.cpp VirtualDirectory.cpp + WebDirectory.cpp XbtDirectory.cpp XbtFile.cpp XbtManager.cpp @@ -115,6 +116,7 @@ set(HEADERS AddonsDirectory.h StackDirectory.h VideoDatabaseDirectory.h VirtualDirectory.h + WebDirectory.h XbtDirectory.h XbtFile.h XbtManager.h diff --git a/xbmc/filesystem/DirectoryFactory.cpp b/xbmc/filesystem/DirectoryFactory.cpp index a6fa92efa7802..d8cce8e92d9ba 100644 --- a/xbmc/filesystem/DirectoryFactory.cpp +++ b/xbmc/filesystem/DirectoryFactory.cpp @@ -79,6 +79,7 @@ #endif #include "ResourceDirectory.h" #include "ServiceBroker.h" +#include "WebDirectory.h" #include "addons/VFSEntry.h" using namespace ADDON; @@ -101,7 +102,7 @@ IDirectory* CDirectoryFactory::Create(const CURL& url) if (pDir) return pDir; - if (!url.GetProtocol().empty() && CServiceBroker::IsBinaryAddonCacheUp()) + if (!url.GetProtocol().empty() && CServiceBroker::IsAddonInterfaceUp()) { for (const auto& vfsAddon : CServiceBroker::GetVFSAddonCache().GetAddonInstances()) { @@ -153,6 +154,8 @@ IDirectory* CDirectoryFactory::Create(const CURL& url) if (url.IsProtocol("videodb")) return new CVideoDatabaseDirectory(); if (url.IsProtocol("library")) return new CLibraryDirectory(); if (url.IsProtocol("favourites")) return new CFavouritesDirectory(); + if (url.IsProtocol("web")) + return new CWebDirectory(); #if defined(TARGET_ANDROID) if (url.IsProtocol("androidapp")) return new CAndroidAppDirectory(); #endif diff --git a/xbmc/filesystem/FileDirectoryFactory.cpp b/xbmc/filesystem/FileDirectoryFactory.cpp index e6260e1ed7b08..f59dafd9309e1 100644 --- a/xbmc/filesystem/FileDirectoryFactory.cpp +++ b/xbmc/filesystem/FileDirectoryFactory.cpp @@ -66,7 +66,7 @@ IFileDirectory* CFileDirectoryFactory::Create(const CURL& url, CFileItem* pItem, std::string strExtension = URIUtils::GetExtension(url); StringUtils::ToLower(strExtension); - if (!strExtension.empty() && CServiceBroker::IsBinaryAddonCacheUp()) + if (!strExtension.empty() && CServiceBroker::IsAddonInterfaceUp()) { /*! * Scan here about audiodecoder addons. diff --git a/xbmc/filesystem/FileFactory.cpp b/xbmc/filesystem/FileFactory.cpp index d68d2b754e126..b248255e260ce 100644 --- a/xbmc/filesystem/FileFactory.cpp +++ b/xbmc/filesystem/FileFactory.cpp @@ -86,7 +86,7 @@ IFile* CFileFactory::CreateLoader(const CURL& url) if (!CWakeOnAccess::GetInstance().WakeUpHost(url)) return NULL; - if (!url.GetProtocol().empty() && CServiceBroker::IsBinaryAddonCacheUp()) + if (!url.GetProtocol().empty() && CServiceBroker::IsAddonInterfaceUp()) { for (const auto& vfsAddon : CServiceBroker::GetVFSAddonCache().GetAddonInstances()) { diff --git a/xbmc/filesystem/WebDirectory.cpp b/xbmc/filesystem/WebDirectory.cpp new file mode 100644 index 0000000000000..5d290f47e1b26 --- /dev/null +++ b/xbmc/filesystem/WebDirectory.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "WebDirectory.h" + +#include "FileItem.h" +#include "ServiceBroker.h" +#include "Util.h" +#include "filesystem/Directory.h" +#include "filesystem/File.h" +//#include "profiles/ProfilesManager.h" +#include "utils/StringUtils.h" +#include "utils/URIUtils.h" +#include "utils/log.h" +#include "web/WebManager.h" + +namespace XFILE +{ + +bool CWebDirectory::GetDirectory(const CURL& url, CFileItemList& items) +{ + std::string base(url.Get()); + URIUtils::RemoveSlashAtEnd(base); + + std::string fileName = url.GetFileName(); + URIUtils::RemoveSlashAtEnd(fileName); + CLog::Log(LOGDEBUG, "CWebDirectory::GetDirectory(%s)", base.c_str()); + items.SetCacheToDisc(CFileItemList::CACHE_NEVER); + + if (StringUtils::StartsWith(fileName, "sites/favourites")) + { + return CServiceBroker::GetWEBManager().GetFavourites(url.Get(), items); + } + else if (StringUtils::StartsWith(fileName, "sites/running")) + { + return CServiceBroker::GetWEBManager().GetRunningWebsites(url.Get(), items); + } + + return false; +} + +bool CWebDirectory::Exists(const CURL& url) +{ + if (!CServiceBroker::GetWEBManager().IsStarted()) + return false; + + return url.IsProtocol("web"); +} + +} // namespace XFILE diff --git a/xbmc/filesystem/WebDirectory.h b/xbmc/filesystem/WebDirectory.h new file mode 100644 index 0000000000000..9b6131fb8bf3d --- /dev/null +++ b/xbmc/filesystem/WebDirectory.h @@ -0,0 +1,40 @@ +#pragma once + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "IDirectory.h" + +class CFileItemList; +class CFileItem; + +namespace XFILE +{ + +class CWebDirectory : public IDirectory +{ +public: + CWebDirectory() = default; + + bool GetDirectory(const CURL& url, CFileItemList& items) override; + bool Exists(const CURL& url) override; +}; + +} // namespace XFILE diff --git a/xbmc/games/GameServices.cpp b/xbmc/games/GameServices.cpp index ecd5f6bf3ebea..4a11a88f7bb38 100644 --- a/xbmc/games/GameServices.cpp +++ b/xbmc/games/GameServices.cpp @@ -11,6 +11,7 @@ #include "controllers/Controller.h" #include "controllers/ControllerManager.h" #include "games/GameSettings.h" +#include "games/addons/GameClientController.h" #include "profiles/ProfileManager.h" using namespace KODI; @@ -23,12 +24,21 @@ CGameServices::CGameServices(CControllerManager& controllerManager, : m_controllerManager(controllerManager), m_gameRenderManager(renderManager), m_profileManager(profileManager), - m_gameSettings(new CGameSettings()) + m_gameSettings(new CGameSettings()), + m_gameClientController(new CGameClientController()) { } CGameServices::~CGameServices() = default; +bool CGameServices::Init() +{ + if (!m_gameClientController->Init()) + return false; + + return true; +} + ControllerPtr CGameServices::GetController(const std::string& controllerId) { return m_controllerManager.GetController(controllerId); diff --git a/xbmc/games/GameServices.h b/xbmc/games/GameServices.h index d489bf8b39061..eda763cefb894 100644 --- a/xbmc/games/GameServices.h +++ b/xbmc/games/GameServices.h @@ -11,10 +11,17 @@ #include "controllers/ControllerTypes.h" #include +#include #include +#include class CProfileManager; +namespace ADDON +{ +class CAddonInfo; +} + namespace PERIPHERALS { class CPeripherals; @@ -30,6 +37,7 @@ class CGUIGameRenderManager; namespace GAME { class CControllerManager; +class CGameClientController; class CGameSettings; class CGameServices @@ -41,6 +49,8 @@ class CGameServices const CProfileManager& profileManager); ~CGameServices(); + bool Init(); + ControllerPtr GetController(const std::string& controllerId); ControllerPtr GetDefaultController(); ControllerPtr GetDefaultKeyboard(); @@ -50,6 +60,7 @@ class CGameServices std::string GetSavestatesFolder() const; CGameSettings& GameSettings() { return *m_gameSettings; } + CGameClientController& GameClientController() { return *m_gameClientController; } RETRO::CGUIGameRenderManager& GameRenderManager() { return m_gameRenderManager; } @@ -61,6 +72,9 @@ class CGameServices // Game services std::unique_ptr m_gameSettings; + + // Game clients control + std::unique_ptr m_gameClientController; }; } // namespace GAME } // namespace KODI diff --git a/xbmc/games/GameTypes.h b/xbmc/games/GameTypes.h index 3be3195b20a66..0630651c69052 100644 --- a/xbmc/games/GameTypes.h +++ b/xbmc/games/GameTypes.h @@ -20,6 +20,10 @@ class CGameClient; using GameClientPtr = std::shared_ptr; using GameClientVector = std::vector; +class CGameClientInfo; +using GameClientInfoPtr = std::shared_ptr; +using GameClientInfoVector = std::vector; + class CGameClientPort; using GameClientPortPtr = std::unique_ptr; using GameClientPortVec = std::vector; diff --git a/xbmc/games/GameUtils.cpp b/xbmc/games/GameUtils.cpp index ff62fbcdc3065..38c42fbacfe06 100644 --- a/xbmc/games/GameUtils.cpp +++ b/xbmc/games/GameUtils.cpp @@ -14,11 +14,13 @@ #include "addons/Addon.h" #include "addons/AddonInstaller.h" #include "addons/AddonManager.h" -#include "addons/BinaryAddonCache.h" #include "cores/RetroPlayer/savestates/ISavestate.h" #include "cores/RetroPlayer/savestates/SavestateDatabase.h" #include "filesystem/SpecialProtocol.h" +#include "games/GameServices.h" #include "games/addons/GameClient.h" +#include "games/addons/GameClientController.h" +#include "games/addons/GameClientInfo.h" #include "games/dialogs/GUIDialogSelectGameClient.h" #include "games/dialogs/GUIDialogSelectSavestate.h" #include "games/tags/GameInfoTag.h" @@ -58,8 +60,8 @@ bool CGameUtils::FillInGameClient(CFileItem& item, std::string& savestatePath) else { // No game client specified, need to ask the user - GameClientVector candidates; - GameClientVector installable; + GameClientInfoVector candidates; + GameClientInfoVector installable; bool bHasVfsGameClient; GetGameClients(item, candidates, installable, bHasVfsGameClient); @@ -112,8 +114,8 @@ bool CGameUtils::FillInGameClient(CFileItem& item, std::string& savestatePath) } void CGameUtils::GetGameClients(const CFileItem& file, - GameClientVector& candidates, - GameClientVector& installable, + GameClientInfoVector& candidates, + GameClientInfoVector& installable, bool& bHasVfsGameClient) { using namespace ADDON; @@ -123,26 +125,16 @@ void CGameUtils::GetGameClients(const CFileItem& file, // Try to resolve path to a local file, as not all game clients support VFS CURL translatedUrl(CSpecialProtocol::TranslatePath(file.GetPath())); - // Get local candidates - VECADDONS localAddons; - CBinaryAddonCache& addonCache = CServiceBroker::GetBinaryAddonCache(); - addonCache.GetAddons(localAddons, ADDON_GAMEDLL); - - bool bVfs = false; - GetGameClients(localAddons, translatedUrl, candidates, bVfs); - bHasVfsGameClient |= bVfs; - - // Get remote candidates - VECADDONS remoteAddons; - if (CServiceBroker::GetAddonMgr().GetInstallableAddons(remoteAddons, ADDON_GAMEDLL)) - { - GetGameClients(remoteAddons, translatedUrl, installable, bVfs); - bHasVfsGameClient |= bVfs; - } + // Get local and remote candidates + GameClientInfoVector gameClients; + if (CServiceBroker::GetGameServices().GameClientController().GetAvailableGameClients(gameClients, GameInfoSelection::INSTALLED)) + GetGameClients(gameClients, translatedUrl, candidates, bHasVfsGameClient); + if (CServiceBroker::GetGameServices().GameClientController().GetAvailableGameClients(gameClients, GameInfoSelection::INSTALLABLE)) + GetGameClients(gameClients, translatedUrl, installable, bHasVfsGameClient); // Sort by name //! @todo Move to presentation code - auto SortByName = [](const GameClientPtr& lhs, const GameClientPtr& rhs) { + auto SortByName = [](const GameClientInfoPtr& lhs, const GameClientInfoPtr& rhs) { std::string lhsName = lhs->Name(); std::string rhsName = rhs->Name(); @@ -156,9 +148,9 @@ void CGameUtils::GetGameClients(const CFileItem& file, std::sort(installable.begin(), installable.end(), SortByName); } -void CGameUtils::GetGameClients(const ADDON::VECADDONS& addons, +void CGameUtils::GetGameClients(const GameClientInfoVector& gameClients, const CURL& translatedUrl, - GameClientVector& candidates, + GameClientInfoVector& candidates, bool& bHasVfsGameClient) { bHasVfsGameClient = false; @@ -168,22 +160,20 @@ void CGameUtils::GetGameClients(const ADDON::VECADDONS& addons, const bool bIsLocalFile = (translatedUrl.GetProtocol() == "file" || translatedUrl.GetProtocol().empty()); - for (auto& addon : addons) + for (auto& client : gameClients) { - GameClientPtr gameClient = std::static_pointer_cast(addon); - // Filter by extension - if (!gameClient->IsExtensionValid(extension)) + if (!client->IsExtensionValid(extension)) continue; // Filter by VFS - if (!bIsLocalFile && !gameClient->SupportsVFS()) + if (!bIsLocalFile && !client->SupportsVFS()) { bHasVfsGameClient = true; continue; } - candidates.push_back(gameClient); + candidates.emplace_back(client); } } @@ -206,24 +196,12 @@ bool CGameUtils::HasGameExtension(const std::string& path) StringUtils::ToLower(extension); // Look for a game client that supports this extension - VECADDONS gameClients; - CBinaryAddonCache& addonCache = CServiceBroker::GetBinaryAddonCache(); - addonCache.GetInstalledAddons(gameClients, ADDON_GAMEDLL); - for (auto& gameClient : gameClients) - { - GameClientPtr gc(std::static_pointer_cast(gameClient)); - if (gc->IsExtensionValid(extension)) - return true; - } - - // Check remote add-ons - gameClients.clear(); - if (CServiceBroker::GetAddonMgr().GetInstallableAddons(gameClients, ADDON_GAMEDLL)) + GameClientInfoVector gameClients; + if (CServiceBroker::GetGameServices().GameClientController().GetAvailableGameClients(gameClients, GameInfoSelection::ALL)) { for (auto& gameClient : gameClients) { - GameClientPtr gc(std::static_pointer_cast(gameClient)); - if (gc->IsExtensionValid(extension)) + if (gameClient->IsExtensionValid(extension)) return true; } } @@ -237,23 +215,12 @@ std::set CGameUtils::GetGameExtensions() std::set extensions; - VECADDONS gameClients; - CBinaryAddonCache& addonCache = CServiceBroker::GetBinaryAddonCache(); - addonCache.GetAddons(gameClients, ADDON_GAMEDLL); - for (auto& gameClient : gameClients) - { - GameClientPtr gc(std::static_pointer_cast(gameClient)); - extensions.insert(gc->GetExtensions().begin(), gc->GetExtensions().end()); - } - - // Check remote add-ons - gameClients.clear(); - if (CServiceBroker::GetAddonMgr().GetInstallableAddons(gameClients, ADDON_GAMEDLL)) + GameClientInfoVector gameClients; + if (CServiceBroker::GetGameServices().GameClientController().GetAvailableGameClients(gameClients, GameInfoSelection::ALL)) { for (auto& gameClient : gameClients) { - GameClientPtr gc(std::static_pointer_cast(gameClient)); - extensions.insert(gc->GetExtensions().begin(), gc->GetExtensions().end()); + extensions.insert(gameClient->GetExtensions().begin(), gameClient->GetExtensions().end()); } } @@ -268,7 +235,10 @@ bool CGameUtils::IsStandaloneGame(const ADDON::AddonPtr& addon) { case ADDON_GAMEDLL: { - return std::static_pointer_cast(addon)->SupportsStandalone(); + auto client = CServiceBroker::GetGameServices().GameClientController().GetGameClient(addon->ID()); + if (client) + return client->SupportsStandalone(); + return false; } case ADDON_SCRIPT: { diff --git a/xbmc/games/GameUtils.h b/xbmc/games/GameUtils.h index ec3ee9a2a3436..4c892668cf38e 100644 --- a/xbmc/games/GameUtils.h +++ b/xbmc/games/GameUtils.h @@ -67,12 +67,12 @@ class CGameUtils private: static void GetGameClients(const CFileItem& file, - GameClientVector& candidates, - GameClientVector& installable, + GameClientInfoVector& candidates, + GameClientInfoVector& installable, bool& bHasVfsGameClient); - static void GetGameClients(const ADDON::VECADDONS& addons, + static void GetGameClients(const GameClientInfoVector& gameClients, const CURL& translatedUrl, - GameClientVector& candidates, + GameClientInfoVector& candidates, bool& bHasVfsGameClient); /*! diff --git a/xbmc/games/addons/CMakeLists.txt b/xbmc/games/addons/CMakeLists.txt index 42ec18ddda97b..64c038bc76cd7 100644 --- a/xbmc/games/addons/CMakeLists.txt +++ b/xbmc/games/addons/CMakeLists.txt @@ -1,12 +1,16 @@ set(SOURCES GameClient.cpp + GameClientController.cpp GameClientInGameSaves.cpp + GameClientInfo.cpp GameClientProperties.cpp GameClientSubsystem.cpp GameClientTranslator.cpp) set(HEADERS GameClient.h GameClientCallbacks.h + GameClientController.h GameClientInGameSaves.h + GameClientInfo.h GameClientProperties.h GameClientSubsystem.h GameClientTranslator.h) diff --git a/xbmc/games/addons/GameClient.cpp b/xbmc/games/addons/GameClient.cpp index a5d06c2de3cee..463428949c50c 100644 --- a/xbmc/games/addons/GameClient.cpp +++ b/xbmc/games/addons/GameClient.cpp @@ -16,7 +16,6 @@ #include "ServiceBroker.h" #include "URL.h" #include "addons/AddonManager.h" -#include "addons/BinaryAddonCache.h" #include "filesystem/Directory.h" #include "filesystem/File.h" #include "filesystem/SpecialProtocol.h" @@ -79,17 +78,13 @@ std::string NormalizeExtension(const std::string& strExtension) // --- CGameClient ------------------------------------------------------------- CGameClient::CGameClient(const ADDON::AddonInfoPtr& addonInfo) - : CAddonDll(addonInfo, ADDON::ADDON_GAMEDLL), - m_subsystems(CGameClientSubsystem::CreateSubsystems(*this, *m_ifc.game, m_critSection)), - m_bSupportsAllExtensions(false), - m_bIsPlaying(false), - m_serializeSize(0), - m_region(GAME_REGION_UNKNOWN) + : IInstanceHandler(this, ADDON_INSTANCE_GAME, addonInfo), + m_subsystems(CGameClientSubsystem::CreateSubsystems(*this, *m_ifc->kodi_addoninstance_game_h, m_instance, m_critSection)) { using namespace ADDON; std::vector extensions = StringUtils::Split( - Type(ADDON_GAMEDLL)->GetValue(GAME_PROPERTY_EXTENSIONS).asString(), EXTENSION_SEPARATOR); + addonInfo->Type(ADDON_GAMEDLL)->GetValue(GAME_PROPERTY_EXTENSIONS).asString(), EXTENSION_SEPARATOR); std::transform(extensions.begin(), extensions.end(), std::inserter(m_extensions, m_extensions.begin()), NormalizeExtension); @@ -111,22 +106,27 @@ CGameClient::~CGameClient(void) CGameClientSubsystem::DestroySubsystems(m_subsystems); } -std::string CGameClient::LibPath() const +bool CGameClient::Initialized() { - // If the game client requires a proxy, load its DLL instead - if (m_ifc.game->props->proxy_dll_count > 0) - return GetDllPath(m_ifc.game->props->proxy_dll_paths[0]); - - return CAddonDll::LibPath(); + return m_instance != nullptr; } -ADDON::AddonPtr CGameClient::GetRunningInstance() const -{ - using namespace ADDON; - - CBinaryAddonCache& addonCache = CServiceBroker::GetBinaryAddonCache(); - return addonCache.GetAddonInstance(ID(), Type()); -} +// std::string CGameClient::LibPath() const +// { +// // If the game client requires a proxy, load its DLL instead +// // if (m_instance->props->proxy_dll_count > 0) +// // return GetDllPath(m_instance->props->proxy_dll_paths[0]); +// +// return CAddon::LibPath(); +// } +// +// ADDON::AddonPtr CGameClient::GetRunningInstance() const +// { +// using namespace ADDON; +// +// CBinaryAddonCache& addonCache = CServiceBroker::GetBinaryAddonCache(); +// return addonCache.GetAddonInstance(ID(), Type()); +// } bool CGameClient::SupportsPath() const { @@ -161,19 +161,7 @@ bool CGameClient::Initialize(void) if (!AddonProperties().InitializeProperties()) return false; - m_ifc.game->toKodi->kodiInstance = this; - m_ifc.game->toKodi->CloseGame = cb_close_game; - m_ifc.game->toKodi->OpenStream = cb_open_stream; - m_ifc.game->toKodi->GetStreamBuffer = cb_get_stream_buffer; - m_ifc.game->toKodi->AddStreamData = cb_add_stream_data; - m_ifc.game->toKodi->ReleaseStreamBuffer = cb_release_stream_buffer; - m_ifc.game->toKodi->CloseStream = cb_close_stream; - m_ifc.game->toKodi->HwGetProcAddress = cb_hw_get_proc_address; - m_ifc.game->toKodi->InputEvent = cb_input_event; - - memset(m_ifc.game->toAddon, 0, sizeof(KodiToAddonFuncTable_Game)); - - if (CreateInstance(&m_ifc) == ADDON_STATUS_OK) + if (CreateInstance() == ADDON_STATUS_OK) { Input().Initialize(); LogAddonProperties(); @@ -187,7 +175,7 @@ void CGameClient::Unload() { Input().Deinitialize(); - DestroyInstance(&m_ifc); + DestroyInstance(); } bool CGameClient::OpenFile(const CFileItem& file, @@ -223,8 +211,8 @@ bool CGameClient::OpenFile(const CFileItem& file, std::unique_lock lock(m_critSection); - if (!Initialized()) - return false; + if (!Initialized()) + return false; CloseFile(); @@ -235,7 +223,8 @@ bool CGameClient::OpenFile(const CFileItem& file, try { - LogError(error = m_ifc.game->toAddon->LoadGame(m_ifc.game, path.c_str()), "LoadGame()"); + const auto ifc = m_ifc->kodi_addoninstance_game_h; + LogError(error = ifc->kodi_addon_game_load_game_v1(m_instance, path.c_str()), "LoadGame()"); } catch (...) { @@ -273,7 +262,8 @@ bool CGameClient::OpenStandalone(RETRO::IStreamManager& streamManager, IGameInpu try { - LogError(error = m_ifc.game->toAddon->LoadStandalone(m_ifc.game), "LoadStandalone()"); + const auto ifc = m_ifc->kodi_addoninstance_game_h; + LogError(error = ifc->kodi_addon_game_load_standalone_v1(m_instance), "LoadStandalone()"); } catch (...) { @@ -306,7 +296,7 @@ bool CGameClient::InitializeGameplay(const std::string& gamePath, m_gamePath = gamePath; m_input = input; - m_inGameSaves.reset(new CGameClientInGameSaves(this, m_ifc.game)); + m_inGameSaves.reset(new CGameClientInGameSaves(this, m_ifc->kodi_addoninstance_game_h, m_instance)); m_inGameSaves->Load(); return true; @@ -317,10 +307,12 @@ bool CGameClient::InitializeGameplay(const std::string& gamePath, bool CGameClient::LoadGameInfo() { + const auto ifc = m_ifc->kodi_addoninstance_game_h; + bool bRequiresGameLoop; try { - bRequiresGameLoop = m_ifc.game->toAddon->RequiresGameLoop(m_ifc.game); + bRequiresGameLoop = ifc->kodi_addon_game_requires_game_loop_v1(m_instance); } catch (...) { @@ -336,7 +328,7 @@ bool CGameClient::LoadGameInfo() try { bSuccess = - LogError(m_ifc.game->toAddon->GetGameTiming(m_ifc.game, &timingInfo), "GetGameTiming()"); + LogError(ifc->kodi_addon_game_get_game_timing_v1(m_instance, &timingInfo), "GetGameTiming()"); } catch (...) { @@ -352,7 +344,7 @@ bool CGameClient::LoadGameInfo() GAME_REGION region; try { - region = m_ifc.game->toAddon->GetRegion(m_ifc.game); + region = ifc->kodi_addon_game_get_region_v1(m_instance); } catch (...) { @@ -363,7 +355,7 @@ bool CGameClient::LoadGameInfo() size_t serializeSize; try { - serializeSize = m_ifc.game->toAddon->SerializeSize(m_ifc.game); + serializeSize = ifc->kodi_addon_game_serialize_size_v1(m_instance); } catch (...) { @@ -417,7 +409,7 @@ std::string CGameClient::GetMissingResource() std::string strAddonId; - const auto& dependencies = GetDependencies(); + const auto& dependencies = GetAddonInfo()->GetDependencies(); for (auto it = dependencies.begin(); it != dependencies.end(); ++it) { const std::string& strDependencyId = it->id; @@ -445,7 +437,8 @@ void CGameClient::Reset() { try { - LogError(m_ifc.game->toAddon->Reset(m_ifc.game), "Reset()"); + const auto ifc = m_ifc->kodi_addoninstance_game_h; + LogError(ifc->kodi_addon_game_reset_v1(m_instance), "Reset()"); } catch (...) { @@ -472,7 +465,8 @@ void CGameClient::CloseFile() try { - LogError(m_ifc.game->toAddon->UnloadGame(m_ifc.game), "UnloadGame()"); + const auto ifc = m_ifc->kodi_addoninstance_game_h; + LogError(ifc->kodi_addon_game_unload_game_v1(m_instance), "UnloadGame()"); } catch (...) { @@ -501,7 +495,8 @@ void CGameClient::RunFrame() { try { - LogError(m_ifc.game->toAddon->RunFrame(m_ifc.game), "RunFrame()"); + const auto ifc = m_ifc->kodi_addoninstance_game_h; + LogError(ifc->kodi_addon_game_run_frame_v1(m_instance), "RunFrame()"); } catch (...) { @@ -522,7 +517,8 @@ bool CGameClient::Serialize(uint8_t* data, size_t size) { try { - bSuccess = LogError(m_ifc.game->toAddon->Serialize(m_ifc.game, data, size), "Serialize()"); + const auto ifc = m_ifc->kodi_addoninstance_game_h; + bSuccess = LogError(ifc->kodi_addon_game_serialize_v1(m_instance, data, size), "Serialize()"); } catch (...) { @@ -545,8 +541,9 @@ bool CGameClient::Deserialize(const uint8_t* data, size_t size) { try { + const auto ifc = m_ifc->kodi_addoninstance_game_h; bSuccess = - LogError(m_ifc.game->toAddon->Deserialize(m_ifc.game, data, size), "Deserialize()"); + LogError(ifc->kodi_addon_game_deserialize_v1(m_instance, data, size), "Deserialize()"); } catch (...) { @@ -587,7 +584,7 @@ void CGameClient::LogException(const char* strFunctionName) const CLog::Log(LOGERROR, "Please contact the developer of this add-on: {}", Author()); } -void CGameClient::cb_close_game(KODI_HANDLE kodiInstance) +void CGameClient::cb_close_game() { using namespace MESSAGING; @@ -595,21 +592,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) @@ -624,8 +615,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) @@ -638,8 +628,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) @@ -652,37 +641,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 6b2ad366f7635..17a40ce1f3f1d 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/interface/InstanceHandler.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/game.h" #include "threads/CriticalSection.h" #include @@ -41,6 +41,7 @@ class IGameInputCallback; * \ingroup games * \brief Helper class to have "C" struct created before other parts becomes his pointer. */ +/* class CGameClientStruct { public: @@ -81,6 +82,7 @@ class CGameClientStruct KODI_ADDON_INSTANCE_STRUCT m_ifc; }; +*/ /*! * \ingroup games @@ -111,13 +113,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 KODI::ADDONS::INTERFACE::IInstanceHandler { public: explicit CGameClient(const ADDON::AddonInfoPtr& addonInfo); ~CGameClient() override; + bool Initialized(); + // Game subsystems (const) const CGameClientCheevos& Cheevos() const { return *m_subsystems.Cheevos; } const CGameClientInput& Input() const { return *m_subsystems.Input; } @@ -131,8 +135,8 @@ class CGameClient : public ADDON::CAddonDll, private CGameClientStruct CGameClientStreams& Streams() { return *m_subsystems.Streams; } // Implementation of IAddon via CAddonDll - std::string LibPath() const override; - ADDON::AddonPtr GetRunningInstance() const override; +// std::string LibPath() const override; +// ADDON::AddonPtr GetRunningInstance() const override; // Query properties of the game client bool SupportsStandalone() const { return m_bSupportsStandalone; } @@ -166,17 +170,43 @@ 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_ifc.game; } - // 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, @@ -189,29 +219,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; @@ -219,18 +226,18 @@ class CGameClient : public ADDON::CAddonDll, private CGameClientStruct bool m_bSupportsVFS; bool m_bSupportsStandalone; std::set m_extensions; - bool m_bSupportsAllExtensions; + bool m_bSupportsAllExtensions{false}; // GamePlatforms m_platforms; // Properties of the current playing file - std::atomic_bool m_bIsPlaying; // True between OpenFile() and CloseFile() + std::atomic_bool m_bIsPlaying{false}; // True between OpenFile() and CloseFile() std::string m_gamePath; - bool m_bRequiresGameLoop = false; - size_t m_serializeSize; - IGameInputCallback* m_input = nullptr; // The input callback passed to OpenFile() - double m_framerate = 0.0; // Video frame rate (fps) - double m_samplerate = 0.0; // Audio sample rate (Hz) - GAME_REGION m_region; // Region of the loaded game + bool m_bRequiresGameLoop{false}; + size_t m_serializeSize{0}; + IGameInputCallback* m_input{nullptr}; // The input callback passed to OpenFile() + double m_framerate{0.0}; // Video frame rate (fps) + double m_samplerate{0.0}; // Audio sample rate (Hz) + GAME_REGION m_region{GAME_REGION_UNKNOWN}; // Region of the loaded game // In-game saves std::unique_ptr m_inGameSaves; diff --git a/xbmc/games/addons/GameClientController.cpp b/xbmc/games/addons/GameClientController.cpp new file mode 100644 index 0000000000000..3fd6a3fa193f6 --- /dev/null +++ b/xbmc/games/addons/GameClientController.cpp @@ -0,0 +1,113 @@ +/* + * 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 "GameClientController.h" + +#include "ServiceBroker.h" +#include "addons/AddonManager.h" + +using namespace ADDON; +using namespace KODI::GAME; + +CGameClientController::~CGameClientController() +{ + Deinit(); +} + +bool CGameClientController::Init() +{ + CServiceBroker::GetAddonMgr().Events().Subscribe(this, &CGameClientController::OnEvent); + Update(); + return false; +} + +void CGameClientController::Deinit() +{ + CServiceBroker::GetAddonMgr().Events().Unsubscribe(this); +} + +bool CGameClientController::GetAvailableGameClients(GameClientInfoVector& clients, GameInfoSelection select) +{ + std::unique_lock lock(m_critSection); + + for (auto &addon : m_gameClients) + { + if (select == GameInfoSelection::ALL || + (select == GameInfoSelection::INSTALLED && addon->IsInstalled()) || + (select == GameInfoSelection::INSTALLABLE && !addon->IsInstalled()) || + (select == GameInfoSelection::ENABLED && addon->IsEnabled()) || + (select == GameInfoSelection::DISABLED && !addon->IsEnabled())) + clients.emplace_back(addon); + } + + return !clients.empty(); +} + +GameClientInfoPtr CGameClientController::GetGameClient(const std::string& addonId) +{ + GameClientInfoPtr gameClient; + + std::unique_lock lock(m_critSection); + + auto itGameClient = std::find_if(m_gameClients.begin(), m_gameClients.end(), + [&addonId](const auto& gameClient) + { + return gameClient->ID() == addonId; + }); + + if (itGameClient != m_gameClients.end()) + gameClient = *itGameClient; + + return gameClient; +} + +void CGameClientController::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.addonId, ADDON_GAMEDLL)) + { + Update(); + } + } + else if (typeid(event) == typeid(AddonEvents::UnInstalled)) + { + Update(); + } +} + +void CGameClientController::Update() +{ + GameClientInfoVector gameClients; + + std::vector> infos; + if (CServiceBroker::GetAddonMgr().GetAddonInfos(infos, false, ADDON_GAMEDLL)) + { + for (const auto& info : infos) + { + const bool enabled = !CServiceBroker::GetAddonMgr().IsAddonDisabled(info->ID()); + gameClients.emplace_back(std::make_shared(info, true, enabled)); + } + } + + std::vector> installable; + if (CServiceBroker::GetAddonMgr().GetInstallableAddons(installable, ADDON_GAMEDLL)) + { + for (auto& gameClient : installable) + { + gameClients.emplace_back(std::make_shared(std::dynamic_pointer_cast(gameClient)->GetAddonInfo(), false, false)); + } + } + + { + std::unique_lock lock(m_critSection); + m_gameClients = std::move(gameClients); + } +} diff --git a/xbmc/games/addons/GameClientController.h b/xbmc/games/addons/GameClientController.h new file mode 100644 index 0000000000000..c217219b7995d --- /dev/null +++ b/xbmc/games/addons/GameClientController.h @@ -0,0 +1,59 @@ +/* + * 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 "GameClientInfo.h" +#include "games/GameTypes.h" +#include "threads/CriticalSection.h" + +#include +#include + +namespace ADDON +{ +struct AddonEvent; +} + +namespace KODI +{ +namespace GAME +{ + +enum class GameInfoSelection +{ + ALL, + INSTALLABLE, + INSTALLED, + ENABLED, + DISABLED +}; + +class CGameClientController +{ +public: + CGameClientController() = default; + ~CGameClientController(); + + bool Init(); + void Deinit(); + + bool GetAvailableGameClients(GameClientInfoVector& clients, GameInfoSelection select); + GameClientInfoPtr GetGameClient(const std::string& addonId); + +protected: + void Update(); + void OnEvent(const ADDON::AddonEvent& event); + +private: + CCriticalSection m_critSection; + GameClientInfoVector m_gameClients; +}; + +} // namespace GAME +} // namespace KODI diff --git a/xbmc/games/addons/GameClientInGameSaves.cpp b/xbmc/games/addons/GameClientInGameSaves.cpp index 802ebb71ff375..3a2f3d54731f0 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,12 @@ 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 +127,12 @@ 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/GameClientInfo.cpp b/xbmc/games/addons/GameClientInfo.cpp new file mode 100644 index 0000000000000..777afc91c33a4 --- /dev/null +++ b/xbmc/games/addons/GameClientInfo.cpp @@ -0,0 +1,91 @@ +/* + * 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. + */ + +#include "GameClientInfo.h" + +#include "addons/addoninfo/AddonInfo.h" +#include "games/addons/GameClient.h" + +using namespace ADDON; +using namespace KODI::GAME; + +namespace +{ + +constexpr const char* EXTENSION_SEPARATOR = "|"; +constexpr const char* EXTENSION_WILDCARD = "*"; + +constexpr const char* GAME_PROPERTY_EXTENSIONS = "extensions"; +constexpr const char* GAME_PROPERTY_SUPPORTS_VFS = "supports_vfs"; +constexpr const char* GAME_PROPERTY_SUPPORTS_STANDALONE = "supports_standalone"; + +/* + * \brief Convert to lower case and canonicalize with a leading "." + */ +std::string NormalizeExtension(const std::string& strExtension) +{ + std::string ext = strExtension; + + if (!ext.empty() && ext != EXTENSION_WILDCARD) + { + StringUtils::ToLower(ext); + + if (ext[0] != '.') + ext.insert(0, "."); + } + + return ext; +} + +} // namespace + +CGameClientInfo::CGameClientInfo(const ADDON::AddonInfoPtr& info, bool installed, bool enabled) + : m_addonInfo(info), m_installed(installed), m_enabled(enabled) +{ + std::vector extensions = StringUtils::Split( + info->Type(ADDON_GAMEDLL)->GetValue(GAME_PROPERTY_EXTENSIONS).asString(), EXTENSION_SEPARATOR); + std::transform(extensions.begin(), extensions.end(), + std::inserter(m_extensions, m_extensions.begin()), NormalizeExtension); + + // Check for wildcard extension + if (m_extensions.find(EXTENSION_WILDCARD) != m_extensions.end()) + { + m_bSupportsAllExtensions = true; + m_extensions.clear(); + } + + m_bSupportsVFS = info->Type(ADDON_GAMEDLL)->GetValue(GAME_PROPERTY_SUPPORTS_VFS).asBoolean(); + m_bSupportsStandalone = + info->Type(ADDON_GAMEDLL)->GetValue(GAME_PROPERTY_SUPPORTS_STANDALONE).asBoolean(); + +} + +bool CGameClientInfo::SupportsPath() const +{ + return !m_extensions.empty() || m_bSupportsAllExtensions; +} + +bool CGameClientInfo::IsExtensionValid(const std::string& strExtension) const +{ + if (strExtension.empty()) + return false; + + if (SupportsAllExtensions()) + return true; + + return m_extensions.find(NormalizeExtension(strExtension)) != m_extensions.end(); +} + +GameClientPtr CGameClientInfo::GetActiveGameClient() +{ + if (!m_usedGameClient) + m_usedGameClient = std::make_shared(m_addonInfo); + + return m_usedGameClient; +} + diff --git a/xbmc/games/addons/GameClientInfo.h b/xbmc/games/addons/GameClientInfo.h new file mode 100644 index 0000000000000..a7ab1c6512dfe --- /dev/null +++ b/xbmc/games/addons/GameClientInfo.h @@ -0,0 +1,57 @@ +/* + * 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 "addons/addoninfo/AddonInfo.h" +#include "games/GameTypes.h" + +#include +#include +#include +#include + +namespace KODI +{ +namespace GAME +{ + +class CGameClientInfo +{ +public: + CGameClientInfo(const ADDON::AddonInfoPtr& info, bool installed, bool enabled); + + std::string ID() const { return m_addonInfo->ID(); } + std::string Name() const { return m_addonInfo->Name(); } + bool SupportsStandalone() const { return m_bSupportsStandalone; } + bool SupportsPath() const; + bool SupportsVFS() const { return m_bSupportsVFS; } + const std::set& GetExtensions() const { return m_extensions; } + bool SupportsAllExtensions() const { return m_bSupportsAllExtensions; } + bool IsExtensionValid(const std::string& strExtension) const; + bool IsInstalled() const { return m_installed; } + bool IsEnabled() const { return m_enabled; } + + GameClientPtr GetActiveGameClient(); + +private: + // Game API xml parameters + bool m_bSupportsVFS; + bool m_bSupportsStandalone; + std::set m_extensions; + bool m_bSupportsAllExtensions; + + GameClientPtr m_usedGameClient; + + const ADDON::AddonInfoPtr m_addonInfo; + const bool m_installed; + const bool m_enabled; +}; + +} // namespace GAME +} // namespace KODI diff --git a/xbmc/games/addons/GameClientProperties.cpp b/xbmc/games/addons/GameClientProperties.cpp index 9994b4a2310fa..91c760ca78386 100644 --- a/xbmc/games/addons/GameClientProperties.cpp +++ b/xbmc/games/addons/GameClientProperties.cpp @@ -30,8 +30,7 @@ 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 +75,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.Addon()->LibPath(); m_strLibraryPath = CSpecialProtocol::TranslatePath(strLibPath); URIUtils::RemoveSlashAtEnd(m_strLibraryPath); } @@ -88,7 +87,7 @@ const char** CGameClientProperties::GetProxyDllPaths(const ADDON::VECADDONS& add if (m_proxyDllPaths.empty()) { for (const auto& addon : addons) - AddProxyDll(std::static_pointer_cast(addon)); + AddProxyDll(addon->Path()); } if (!m_proxyDllPaths.empty()) @@ -107,7 +106,7 @@ const char** CGameClientProperties::GetResourceDirectories(void) if (m_resourceDirectories.empty()) { // Add all other game resources - const auto& dependencies = m_parent.GetDependencies(); + const auto& dependencies = m_parent.GetAddonInfo()->GetDependencies(); for (auto it = dependencies.begin(); it != dependencies.end(); ++it) { const std::string& strAddonId = it->id; @@ -200,7 +199,7 @@ bool CGameClientProperties::GetProxyAddons(ADDON::VECADDONS& addons) ADDON::VECADDONS ret; std::vector missingDependencies; // ID or name of missing dependencies - for (const auto& dependency : m_parent.GetDependencies()) + for (const auto& dependency : m_parent.GetAddonInfo()->GetDependencies()) { AddonPtr addon; if (CServiceBroker::GetAddonMgr().GetAddon(dependency.id, addon, ADDON_UNKNOWN, @@ -264,11 +263,8 @@ bool CGameClientProperties::GetProxyAddons(ADDON::VECADDONS& addons) return true; } -void CGameClientProperties::AddProxyDll(const GameClientPtr& gameClient) +void CGameClientProperties::AddProxyDll(const std::string& strLibPath) { - // Get the add-on's real path - std::string strLibPath = gameClient->CAddon::LibPath(); - // Ignore add-on if it is already added if (!HasProxyDll(strLibPath)) { diff --git a/xbmc/games/addons/GameClientProperties.h b/xbmc/games/addons/GameClientProperties.h index 83a44171c1de8..e5fc0b3e05444 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); @@ -68,12 +70,12 @@ class CGameClientProperties // Helper functions bool GetProxyAddons(ADDON::VECADDONS& addons); - void AddProxyDll(const GameClientPtr& gameClient); + void AddProxyDll(const std::string& strLibPath); bool HasProxyDll(const std::string& strLibPath) const; // 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 599125fef6e5d..537d621868646 100644 --- a/xbmc/games/addons/GameClientSubsystem.cpp +++ b/xbmc/games/addons/GameClientSubsystem.cpp @@ -10,32 +10,40 @@ #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/cheevos/GameClientCheevos.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, - CCriticalSection& clientAccess) +GameClientSubsystems CGameClientSubsystem::CreateSubsystems( + CGameClient& gameClient, + CHdl_kodi_addoninstance_game_h& gameClientIfc, + const KODI_ADDON_GAME_HDL gameClientHdl, + CCriticalSection& clientAccess) { GameClientSubsystems subsystems = {}; - subsystems.Cheevos = std::make_unique(gameClient, gameStruct); - subsystems.Input.reset(new CGameClientInput(gameClient, gameStruct, clientAccess)); - subsystems.AddonProperties.reset(new CGameClientProperties(gameClient, *gameStruct.props)); + subsystems.Cheevos = std::make_unique(gameClient, gameClientIfc, gameClientHdl); + 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 4711011fd454e..5233519f5f158 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 @@ -38,7 +39,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(); @@ -53,9 +55,11 @@ class CGameClientSubsystem * * \return A fully-allocated GameClientSubsystems struct */ - static GameClientSubsystems CreateSubsystems(CGameClient& gameClient, - AddonInstance_Game& gameStruct, - CCriticalSection& clientAccess); + static GameClientSubsystems CreateSubsystems( + CGameClient& gameClient, + KODI::ADDONS::INTERFACE::CHdl_kodi_addoninstance_game_h& gameStruct, + const KODI_ADDON_GAME_HDL gameClientHdl, + CCriticalSection& clientAccess); /*! * \brief Deallocate subsystems @@ -73,7 +77,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/cheevos/GameClientCheevos.cpp b/xbmc/games/addons/cheevos/GameClientCheevos.cpp index e9d457b8a2220..a76df7f40f2f1 100644 --- a/xbmc/games/addons/cheevos/GameClientCheevos.cpp +++ b/xbmc/games/addons/cheevos/GameClientCheevos.cpp @@ -13,10 +13,13 @@ #include "games/addons/GameClient.h" using namespace KODI; +using namespace KODI::ADDONS::INTERFACE; using namespace GAME; -CGameClientCheevos::CGameClientCheevos(CGameClient& gameClient, AddonInstance_Game& addonStruct) - : m_gameClient(gameClient), m_struct(addonStruct) +CGameClientCheevos::CGameClientCheevos(CGameClient& gameClient, + CHdl_kodi_addoninstance_game_h& gameClientIfc, + const KODI_ADDON_GAME_HDL gameClientHdl) + : m_gameClient(gameClient), m_gameClientIfc(gameClientIfc), m_gameClientHdl(gameClientHdl) { } @@ -30,8 +33,8 @@ bool CGameClientCheevos::RCGenerateHashFromFile(std::string& hash, try { m_gameClient.LogError( - error = m_struct.toAddon->RCGenerateHashFromFile( - &m_struct, &_hash, static_cast(consoleID), filePath.c_str()), + error = m_gameClientIfc.kodi_addon_game_rc_generate_hash_from_file_v1( + m_gameClientHdl, &_hash, static_cast(consoleID), filePath.c_str()), "RCGenerateHashFromFile()"); } catch (...) @@ -42,7 +45,7 @@ bool CGameClientCheevos::RCGenerateHashFromFile(std::string& hash, if (_hash) { hash = _hash; - m_struct.toAddon->FreeString(&m_struct, _hash); + free(_hash); } return error == GAME_ERROR_NO_ERROR; @@ -55,7 +58,7 @@ bool CGameClientCheevos::RCGetGameIDUrl(std::string& url, const std::string& has try { - m_gameClient.LogError(error = m_struct.toAddon->RCGetGameIDUrl(&m_struct, &_url, hash.c_str()), + m_gameClient.LogError(error = m_gameClientIfc.kodi_addon_game_rc_get_game_id_url_v1(m_gameClientHdl, &_url, hash.c_str()), "RCGetGameIDUrl()"); } catch (...) @@ -66,7 +69,7 @@ bool CGameClientCheevos::RCGetGameIDUrl(std::string& url, const std::string& has if (_url) { url = _url; - m_struct.toAddon->FreeString(&m_struct, _url); + free(_url); } return error == GAME_ERROR_NO_ERROR; @@ -82,8 +85,8 @@ bool CGameClientCheevos::RCGetPatchFileUrl(std::string& url, try { - m_gameClient.LogError(error = m_struct.toAddon->RCGetPatchFileUrl( - &m_struct, &_url, username.c_str(), token.c_str(), gameID), + m_gameClient.LogError(error = m_gameClientIfc.kodi_addon_game_rc_get_patch_file_url_v1( + m_gameClientHdl, &_url, username.c_str(), token.c_str(), gameID), "RCGetPatchFileUrl()"); } catch (...) @@ -94,7 +97,7 @@ bool CGameClientCheevos::RCGetPatchFileUrl(std::string& url, if (_url) { url = _url; - m_struct.toAddon->FreeString(&m_struct, _url); + free(_url); } return error == GAME_ERROR_NO_ERROR; @@ -113,8 +116,8 @@ bool CGameClientCheevos::RCPostRichPresenceUrl(std::string& url, try { - m_gameClient.LogError(error = m_struct.toAddon->RCPostRichPresenceUrl( - &m_struct, &_url, &_postData, username.c_str(), token.c_str(), gameID, + m_gameClient.LogError(error = m_gameClientIfc.kodi_addon_game_rc_post_rich_presence_url_v1( + m_gameClientHdl, &_url, &_postData, username.c_str(), token.c_str(), gameID, richPresence.c_str()), "RCPostRichPresenceUrl()"); } @@ -126,12 +129,12 @@ bool CGameClientCheevos::RCPostRichPresenceUrl(std::string& url, if (_url) { url = _url; - m_struct.toAddon->FreeString(&m_struct, _url); + free(_url); } if (_postData) { postData = _postData; - m_struct.toAddon->FreeString(&m_struct, _postData); + free(_postData); } return error == GAME_ERROR_NO_ERROR; @@ -143,7 +146,7 @@ void CGameClientCheevos::RCEnableRichPresence(const std::string& script) try { - m_gameClient.LogError(error = m_struct.toAddon->RCEnableRichPresence(&m_struct, script.c_str()), + m_gameClient.LogError(error = m_gameClientIfc.kodi_addon_game_rc_enable_rich_presence_v1(m_gameClientHdl, script.c_str()), "RCEnableRichPresence()"); } catch (...) @@ -160,14 +163,14 @@ void CGameClientCheevos::RCGetRichPresenceEvaluation(std::string& evaluation, try { - m_gameClient.LogError(error = m_struct.toAddon->RCGetRichPresenceEvaluation( - &m_struct, &_evaluation, static_cast(consoleID)), + m_gameClient.LogError(error = m_gameClientIfc.kodi_addon_game_rc_get_rich_presence_evaluation_v1( + m_gameClientHdl, &_evaluation, static_cast(consoleID)), "RCGetRichPresenceEvaluation()"); if (_evaluation) { evaluation = _evaluation; - m_struct.toAddon->FreeString(&m_struct, _evaluation); + free(_evaluation); } } catch (...) @@ -182,7 +185,7 @@ void CGameClientCheevos::RCResetRuntime() try { - m_gameClient.LogError(error = m_struct.toAddon->RCResetRuntime(&m_struct), "RCResetRuntime()"); + m_gameClient.LogError(error = m_gameClientIfc.kodi_addon_game_rc_reset_runtime_v1(m_gameClientHdl), "RCResetRuntime()"); } catch (...) { diff --git a/xbmc/games/addons/cheevos/GameClientCheevos.h b/xbmc/games/addons/cheevos/GameClientCheevos.h index 2be8c7a4cab20..0e9a81705e075 100644 --- a/xbmc/games/addons/cheevos/GameClientCheevos.h +++ b/xbmc/games/addons/cheevos/GameClientCheevos.h @@ -8,11 +8,11 @@ #pragma once +#include "addons/interface/api/addon-instance/game.h" + #include /* size_t */ #include -struct AddonInstance_Game; - namespace KODI { namespace RETRO @@ -28,7 +28,9 @@ class CGameClient; class CGameClientCheevos { public: - CGameClientCheevos(CGameClient& gameClient, AddonInstance_Game& addonStruct); + CGameClientCheevos(CGameClient& gameClient, + KODI::ADDONS::INTERFACE::CHdl_kodi_addoninstance_game_h& gameClientIfc, + const KODI_ADDON_GAME_HDL gameClientHdl); bool RCGenerateHashFromFile(std::string& hash, RETRO::RConsoleID consoleID, @@ -51,7 +53,8 @@ class CGameClientCheevos private: CGameClient& m_gameClient; - AddonInstance_Game& m_struct; + KODI::ADDONS::INTERFACE::CHdl_kodi_addoninstance_game_h& m_gameClientIfc; + const KODI_ADDON_GAME_HDL m_gameClientHdl; }; } // namespace GAME } // namespace KODI diff --git a/xbmc/games/addons/input/GameClientController.h b/xbmc/games/addons/input/GameClientController.h index 5445868ef7278..5f50434727aa1 100644 --- a/xbmc/games/addons/input/GameClientController.h +++ b/xbmc/games/addons/input/GameClientController.h @@ -20,7 +20,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 "games/controllers/ControllerTypes.h" #include diff --git a/xbmc/games/addons/input/GameClientDevice.cpp b/xbmc/games/addons/input/GameClientDevice.cpp index 589fb66cb4eba..8fb4e5ddf2ad8 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/input/PhysicalTopology.h" diff --git a/xbmc/games/addons/input/GameClientInput.cpp b/xbmc/games/addons/input/GameClientInput.cpp index 4108f3ee418e4..ed15a4f49c960 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" @@ -33,12 +32,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), + : CGameClientSubsystem(gameClient, gameClientIfc, gameClientHdl, clientAccess), m_topology(new CGameClientTopology), m_portManager(std::make_unique()) { @@ -151,8 +152,8 @@ bool CGameClientInput::HasFeature(const std::string& controllerId, try { - bHasFeature = - m_struct.toAddon->HasFeature(&m_struct, controllerId.c_str(), featureName.c_str()); + bHasFeature = m_gameClientIfc.kodi_addon_game_has_feature_v1( + m_gameClientHdl, controllerId.c_str(), featureName.c_str()); } catch (...) { @@ -179,7 +180,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 (...) { @@ -197,7 +198,7 @@ void CGameClientInput::LoadTopology() { try { - topologyStruct = m_struct.toAddon->GetTopology(&m_struct); + topologyStruct = m_gameClientIfc.kodi_addon_game_get_topology_v1(m_gameClientHdl); } catch (...) { @@ -223,7 +224,7 @@ void CGameClientInput::LoadTopology() try { - m_struct.toAddon->FreeTopology(&m_struct, topologyStruct); + m_gameClientIfc.kodi_addon_game_free_topology_v1(m_gameClientHdl, topologyStruct); } catch (...) { @@ -271,8 +272,9 @@ void CGameClientInput::SetControllerLayouts(const ControllerVector& controllers) try { - m_struct.toAddon->SetControllerLayouts(&m_struct, controllerStructs.data(), - static_cast(controllerStructs.size())); + m_gameClientIfc.kodi_addon_game_set_controller_layouts_v1( + m_gameClientHdl, controllerStructs.data(), + static_cast(controllerStructs.size())); } catch (...) { @@ -342,8 +344,8 @@ bool CGameClientInput::ConnectController(const std::string& portAddress, try { - if (!m_struct.toAddon->ConnectController(&m_struct, true, portAddress.c_str(), - controller->ID().c_str())) + if (!m_gameClientIfc.kodi_addon_game_connect_controller_v1( + m_gameClientHdl, true, portAddress.c_str(), controller->ID().c_str())) { return false; } @@ -391,7 +393,8 @@ bool CGameClientInput::DisconnectController(const std::string& portAddress) try { - if (!m_struct.toAddon->ConnectController(&m_struct, false, portAddress.c_str(), "")) + if (!m_gameClientIfc.kodi_addon_game_connect_controller_v1(m_gameClientHdl, false, + portAddress.c_str(), "")) return false; } catch (...) @@ -469,7 +472,8 @@ 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 (...) { @@ -499,7 +503,7 @@ void CGameClientInput::CloseKeyboard() { try { - m_struct.toAddon->EnableKeyboard(&m_struct, false, ""); + m_gameClientIfc.kodi_addon_game_enable_keyboard_v1(m_gameClientHdl, false, ""); } catch (...) { @@ -534,7 +538,8 @@ 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 (...) { @@ -563,7 +568,7 @@ void CGameClientInput::CloseMouse() { try { - m_struct.toAddon->EnableMouse(&m_struct, false, ""); + m_gameClientIfc.kodi_addon_game_enable_mouse_v1(m_gameClientHdl, false, ""); } catch (...) { @@ -789,7 +794,7 @@ ControllerVector CGameClientInput::GetControllers(const CGameClient& gameClient) CGameServices& gameServices = CServiceBroker::GetGameServices(); - const auto& dependencies = gameClient.GetDependencies(); + const auto& dependencies = gameClient.GetAddonInfo()->GetDependencies(); for (auto it = dependencies.begin(); it != dependencies.end(); ++it) { ControllerPtr controller = gameServices.GetController(it->id); diff --git a/xbmc/games/addons/input/GameClientInput.h b/xbmc/games/addons/input/GameClientInput.h index a200a859c3046..9d323d1469557 100644 --- a/xbmc/games/addons/input/GameClientInput.h +++ b/xbmc/games/addons/input/GameClientInput.h @@ -44,7 +44,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 6ef9b5652662f..64656ae234084 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 c582fff9fc435..c5bee8abb3861 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/input/PhysicalTopology.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/games/controllers/windows/GUIControllerWindow.cpp b/xbmc/games/controllers/windows/GUIControllerWindow.cpp index 724dd1bf619f7..013cf3b9e3708 100644 --- a/xbmc/games/controllers/windows/GUIControllerWindow.cpp +++ b/xbmc/games/controllers/windows/GUIControllerWindow.cpp @@ -17,7 +17,9 @@ #include "addons/gui/GUIWindowAddonBrowser.h" #include "cores/RetroPlayer/guibridge/GUIGameRenderManager.h" #include "cores/RetroPlayer/guibridge/GUIGameSettingsHandle.h" +#include "games/GameServices.h" #include "games/addons/GameClient.h" +#include "games/addons/GameClientController.h" #include "games/controllers/dialogs/ControllerInstaller.h" #include "games/controllers/dialogs/GUIDialogIgnoreInput.h" #include "guilib/GUIButtonControl.h" @@ -221,11 +223,10 @@ void CGUIControllerWindow::OnInitWindow(void) auto gameSettingsHandle = CServiceBroker::GetGameRenderManager().RegisterGameSettingsDialog(); if (gameSettingsHandle) { - ADDON::AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(gameSettingsHandle->GameClientID(), addon, - ADDON::ADDON_GAMEDLL, - ADDON::OnlyEnabled::CHOICE_YES)) - gameClient = std::static_pointer_cast(addon); + auto& controller = CServiceBroker::GetGameServices().GameClientController(); + auto info = controller.GetGameClient(gameSettingsHandle->GameClientID()); + if (info) + gameClient = info->GetActiveGameClient(); } } m_gameClient = std::move(gameClient); diff --git a/xbmc/games/dialogs/GUIDialogSelectGameClient.cpp b/xbmc/games/dialogs/GUIDialogSelectGameClient.cpp index 11acc098485b1..1e2f462d2c902 100644 --- a/xbmc/games/dialogs/GUIDialogSelectGameClient.cpp +++ b/xbmc/games/dialogs/GUIDialogSelectGameClient.cpp @@ -11,6 +11,7 @@ #include "dialogs/GUIDialogSelect.h" #include "filesystem/AddonsDirectory.h" #include "games/addons/GameClient.h" +#include "games/addons/GameClientInfo.h" #include "guilib/GUIComponent.h" #include "guilib/GUIWindowManager.h" #include "guilib/LocalizeStrings.h" @@ -24,12 +25,12 @@ using namespace KODI::MESSAGING; using namespace GAME; std::string CGUIDialogSelectGameClient::ShowAndGetGameClient(const std::string& gamePath, - const GameClientVector& candidates, - const GameClientVector& installable) + const GameClientInfoVector& candidates, + const GameClientInfoVector& installables) { std::string gameClient; - LogGameClients(candidates, installable); + LogGameClients(candidates, installables); std::string extension = URIUtils::GetExtension(gamePath); @@ -43,13 +44,23 @@ std::string CGUIDialogSelectGameClient::ShowAndGetGameClient(const std::string& CFileItemList installableItems; for (const auto& candidate : candidates) { - CFileItemPtr item(XFILE::CAddonsDirectory::FileItemFromAddon(candidate, candidate->ID())); + ADDON::AddonPtr addon; + if (!CServiceBroker::GetAddonMgr().GetAddon(candidate->ID(), addon, + ADDON::ADDON_GAMEDLL, + ADDON::OnlyEnabled::CHOICE_YES)) + continue; + + CFileItemPtr item(XFILE::CAddonsDirectory::FileItemFromAddon(addon, candidate->ID())); item->SetLabel2(g_localizeStrings.Get(35257)); // "Installed" items.Add(std::move(item)); } - for (const auto& addon : installable) + for (const auto& installable : installables) { - CFileItemPtr item(XFILE::CAddonsDirectory::FileItemFromAddon(addon, addon->ID())); + ADDON::AddonPtr addon; + if (!CServiceBroker::GetAddonMgr().FindInstallableById(installable->ID(), addon)) + continue; + + CFileItemPtr item(XFILE::CAddonsDirectory::FileItemFromAddon(addon, installable->ID())); installableItems.Add(std::move(item)); } items.Sort(SortByLabel, SortOrderAscending); @@ -102,8 +113,8 @@ CGUIDialogSelect* CGUIDialogSelectGameClient::GetDialog(const std::string& title return dialog; } -void CGUIDialogSelectGameClient::LogGameClients(const GameClientVector& candidates, - const GameClientVector& installable) +void CGUIDialogSelectGameClient::LogGameClients(const GameClientInfoVector& candidates, + const GameClientInfoVector& installable) { CLog::Log(LOGDEBUG, "Select game client dialog: Found {} candidates", static_cast(candidates.size())); diff --git a/xbmc/games/dialogs/GUIDialogSelectGameClient.h b/xbmc/games/dialogs/GUIDialogSelectGameClient.h index c492481df1963..57a05ede112a8 100644 --- a/xbmc/games/dialogs/GUIDialogSelectGameClient.h +++ b/xbmc/games/dialogs/GUIDialogSelectGameClient.h @@ -35,8 +35,8 @@ class CGUIDialogSelectGameClient * was selected */ static std::string ShowAndGetGameClient(const std::string& gamePath, - const GameClientVector& candidates, - const GameClientVector& installable); + const GameClientInfoVector& candidates, + const GameClientInfoVector& installable); private: /*! @@ -54,8 +54,8 @@ class CGUIDialogSelectGameClient * * Other than logging, this has no side effects. */ - static void LogGameClients(const GameClientVector& candidates, - const GameClientVector& installable); + static void LogGameClients(const GameClientInfoVector& candidates, + const GameClientInfoVector& installable); }; } // namespace GAME } // namespace KODI diff --git a/xbmc/games/ports/windows/GUIPortList.cpp b/xbmc/games/ports/windows/GUIPortList.cpp index 21a3f719ea9ef..915aed28eb221 100644 --- a/xbmc/games/ports/windows/GUIPortList.cpp +++ b/xbmc/games/ports/windows/GUIPortList.cpp @@ -12,6 +12,7 @@ #include "GUIPortDefines.h" #include "GUIPortWindow.h" #include "ServiceBroker.h" +#include "addons/AddonManager.h" #include "games/GameServices.h" #include "games/addons/GameClient.h" #include "games/addons/input/GameClientInput.h" diff --git a/xbmc/games/ports/windows/GUIPortWindow.cpp b/xbmc/games/ports/windows/GUIPortWindow.cpp index 47e7aa347b6d5..441b697833f93 100644 --- a/xbmc/games/ports/windows/GUIPortWindow.cpp +++ b/xbmc/games/ports/windows/GUIPortWindow.cpp @@ -15,7 +15,9 @@ #include "addons/IAddon.h" #include "cores/RetroPlayer/guibridge/GUIGameRenderManager.h" #include "cores/RetroPlayer/guibridge/GUIGameSettingsHandle.h" +#include "games/GameServices.h" #include "games/addons/GameClient.h" +#include "games/addons/GameClientController.h" #include "guilib/GUIButtonControl.h" #include "guilib/GUIControl.h" #include "guilib/GUIMessage.h" @@ -117,11 +119,10 @@ void CGUIPortWindow::OnInitWindow() auto gameSettingsHandle = CServiceBroker::GetGameRenderManager().RegisterGameSettingsDialog(); if (gameSettingsHandle) { - ADDON::AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(gameSettingsHandle->GameClientID(), addon, - ADDON::ADDON_GAMEDLL, - ADDON::OnlyEnabled::CHOICE_YES)) - gameClient = std::static_pointer_cast(addon); + auto& controller = CServiceBroker::GetGameServices().GameClientController(); + auto info = controller.GetGameClient(gameSettingsHandle->GameClientID()); + if (info) + gameClient = info->GetActiveGameClient(); } } m_gameClient = std::move(gameClient); diff --git a/xbmc/guilib/CMakeLists.txt b/xbmc/guilib/CMakeLists.txt index d96ce09abf5a4..b23f8e51438a2 100644 --- a/xbmc/guilib/CMakeLists.txt +++ b/xbmc/guilib/CMakeLists.txt @@ -56,6 +56,7 @@ set(SOURCES DDSImage.cpp GUIToggleButtonControl.cpp GUIVideoControl.cpp GUIVisualisationControl.cpp + GUIWebAddonControl.cpp GUIWindow.cpp GUIWindowManager.cpp GUIWrappingListContainer.cpp @@ -133,6 +134,7 @@ set(HEADERS DDSImage.h GUIToggleButtonControl.h GUIVideoControl.h GUIVisualisationControl.h + GUIWebAddonControl.h GUIWindow.h GUIWindowManager.h GUIWrappingListContainer.h diff --git a/xbmc/guilib/GUIControl.h b/xbmc/guilib/GUIControl.h index ffe0e183a40dc..b27c134346abc 100644 --- a/xbmc/guilib/GUIControl.h +++ b/xbmc/guilib/GUIControl.h @@ -285,6 +285,7 @@ class CGUIControl GUICONTROL_SCROLLBAR, GUICONTROL_LISTLABEL, GUICONTROL_GAMECONTROLLER, + GUICONTROL_WEB_ADDON, GUICONTAINER_LIST, GUICONTAINER_WRAPLIST, GUICONTAINER_FIXEDLIST, diff --git a/xbmc/guilib/GUIControlFactory.cpp b/xbmc/guilib/GUIControlFactory.cpp index 1013c46c0ed02..b82c6ee10225a 100644 --- a/xbmc/guilib/GUIControlFactory.cpp +++ b/xbmc/guilib/GUIControlFactory.cpp @@ -43,6 +43,7 @@ #include "GUIToggleButtonControl.h" #include "GUIVideoControl.h" #include "GUIVisualisationControl.h" +#include "GUIWebAddonControl.h" #include "GUIWrappingListContainer.h" #include "LocalizeStrings.h" #include "Util.h" @@ -96,6 +97,7 @@ static const ControlMapping controls[] = { {"grouplist", CGUIControl::GUICONTROL_GROUPLIST}, {"scrollbar", CGUIControl::GUICONTROL_SCROLLBAR}, {"gamecontroller", CGUIControl::GUICONTROL_GAMECONTROLLER}, + {"webaddon", CGUIControl::GUICONTROL_WEB_ADDON}, {"list", CGUIControl::GUICONTAINER_LIST}, {"wraplist", CGUIControl::GUICONTAINER_WRAPLIST}, {"fixedlist", CGUIControl::GUICONTAINER_FIXEDLIST}, @@ -836,6 +838,12 @@ CGUIControl* CGUIControlFactory::Create(int parentID, const CRect &rect, TiXmlEl UTILS::MOVING_SPEED::MapEventConfig movingSpeedCfg; + // Web add-on control related + bool transparent = false; + bool singleReload = false; // If true can button also do other commands (load and reload) + std::string addonBrowserOwnId; // Identifier for addon related part to get a running site + std::string url; + ///////////////////////////////////////////////////////////////////////////// // Read control properties from XML // @@ -1081,6 +1089,11 @@ CGUIControl* CGUIControlFactory::Create(int parentID, const CRect &rect, TiXmlEl XMLUtils::GetBoolean(pControlNode, "password", bPassword); + XMLUtils::GetBoolean(pControlNode, "transparent", transparent); + XMLUtils::GetBoolean(pControlNode, "singlereload", singleReload); + GetString(pControlNode, "url", url); + GetString(pControlNode, "browserownid", addonBrowserOwnId); + // view type VIEW_TYPE viewType = VIEW_TYPE_NONE; std::string viewLabel; @@ -1546,6 +1559,13 @@ CGUIControl* CGUIControlFactory::Create(int parentID, const CRect &rect, TiXmlEl case CGUIControl::GUICONTROL_GAMECONTROLLER: control = new GAME::CGUIGameController(parentID, id, posX, posY, width, height); break; + case CGUIControl::GUICONTROL_WEB_ADDON: + control = new GUILIB::CGUIWebAddonControl(parentID, id, posX, posY, width, height, url); + dynamic_cast(control)->SetTransparent(transparent); + dynamic_cast(control)->SetReloadButton(!singleReload); + if (!addonBrowserOwnId.empty()) + dynamic_cast(control)->SetWebControlIdString(addonBrowserOwnId); + break; case CGUIControl::GUICONTROL_COLORBUTTON: { control = new CGUIColorButtonControl(parentID, id, posX, posY, width, height, textureFocus, diff --git a/xbmc/guilib/GUIControlProfiler.cpp b/xbmc/guilib/GUIControlProfiler.cpp index a3605a2033950..bfec9e1af1d1b 100644 --- a/xbmc/guilib/GUIControlProfiler.cpp +++ b/xbmc/guilib/GUIControlProfiler.cpp @@ -128,6 +128,9 @@ void CGUIControlProfilerItem::SaveToXML(TiXmlElement *parent) lpszType = "scrollbar"; break; case CGUIControl::GUICONTROL_LISTLABEL: lpszType = "label"; break; + case CGUIControl::GUICONTROL_WEB_ADDON: + lpszType = "webaddon"; + break; case CGUIControl::GUICONTAINER_LIST: lpszType = "list"; break; case CGUIControl::GUICONTAINER_WRAPLIST: diff --git a/xbmc/guilib/GUIVisualisationControl.cpp b/xbmc/guilib/GUIVisualisationControl.cpp index aa008a0a3e77c..556b57864027c 100644 --- a/xbmc/guilib/GUIVisualisationControl.cpp +++ b/xbmc/guilib/GUIVisualisationControl.cpp @@ -26,8 +26,6 @@ #include "utils/URIUtils.h" #include "utils/log.h" -using namespace ADDON; - #define LABEL_ROW1 10 #define LABEL_ROW2 11 #define LABEL_ROW3 12 @@ -161,7 +159,9 @@ void CGUIVisualisationControl::Process(unsigned int currentTime, CDirtyRegionLis } else if (m_callStart && m_instance) { - CServiceBroker::GetWinSystem()->GetGfxContext().CaptureStateBlock(); + auto& context = CServiceBroker::GetWinSystem()->GetGfxContext(); + + context.CaptureStateBlock(); if (m_alreadyStarted) { m_instance->Stop(); @@ -173,7 +173,7 @@ void CGUIVisualisationControl::Process(unsigned int currentTime, CDirtyRegionLis if (tag && !tag->GetTitle().empty()) songTitle = tag->GetTitle(); m_alreadyStarted = m_instance->Start(m_channels, m_samplesPerSec, m_bitsPerSample, songTitle); - CServiceBroker::GetWinSystem()->GetGfxContext().ApplyStateBlock(); + context.ApplyStateBlock(); m_callStart = false; m_updateTrack = true; } @@ -195,16 +195,18 @@ void CGUIVisualisationControl::Render() { if (m_instance && m_alreadyStarted) { + auto& context = CServiceBroker::GetWinSystem()->GetGfxContext(); + /* * set the viewport - note: We currently don't have any control over how * the addon renders, so the best we can do is attempt to define * a viewport?? */ - CServiceBroker::GetWinSystem()->GetGfxContext().SetViewPort(m_posX, m_posY, m_width, m_height); - CServiceBroker::GetWinSystem()->GetGfxContext().CaptureStateBlock(); + context.SetViewPort(m_posX, m_posY, m_width, m_height); + context.CaptureStateBlock(); m_instance->Render(); - CServiceBroker::GetWinSystem()->GetGfxContext().ApplyStateBlock(); - CServiceBroker::GetWinSystem()->GetGfxContext().RestoreViewPort(); + context.ApplyStateBlock(); + context.RestoreViewPort(); } CGUIControl::Render(); @@ -249,7 +251,6 @@ void CGUIVisualisationControl::OnAudioData(const float* audioData, unsigned int // Save our audio data in the buffers std::unique_ptr pBuffer(new CAudioBuffer(audioDataLength)); pBuffer->Set(audioData, audioDataLength); - //m_vecBuffers.push_back(pBuffer.release()); m_vecBuffers.emplace_back(std::move(pBuffer)); if (m_vecBuffers.size() < m_numBuffers) @@ -258,23 +259,8 @@ void CGUIVisualisationControl::OnAudioData(const float* audioData, unsigned int std::unique_ptr ptrAudioBuffer = std::move(m_vecBuffers.front()); m_vecBuffers.pop_front(); - // Fourier transform the data if the vis wants it... - if (m_wantsFreq) - { - const float *psAudioData = ptrAudioBuffer->Get(); - - if (!m_transform) - m_transform.reset(new RFFT(AUDIO_BUFFER_SIZE/2, false)); // half due to stereo - - m_transform->calc(psAudioData, m_freq); - - // Transfer data to our visualisation - m_instance->AudioData(psAudioData, ptrAudioBuffer->Size(), m_freq, AUDIO_BUFFER_SIZE/2); // half due to complex-conjugate - } - else - { // Transfer data to our visualisation - m_instance->AudioData(ptrAudioBuffer->Get(), ptrAudioBuffer->Size(), nullptr, 0); - } + // Transfer data to our visualisation + m_instance->AudioData(ptrAudioBuffer->Get(), ptrAudioBuffer->Size()); } void CGUIVisualisationControl::UpdateTrack() @@ -299,7 +285,7 @@ void CGUIVisualisationControl::UpdateTrack() std::string albumArtist(tag->GetAlbumArtistString()); std::string genre(StringUtils::Join(tag->GetGenre(), CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_musicItemSeparator)); - VIS_TRACK track = {}; + KODI_ADDON_VISUALIZATION_TRACK track = {}; track.title = tag->GetTitle().c_str(); track.artist = artist.c_str(); track.album = tag->GetAlbum().c_str(); @@ -364,6 +350,11 @@ bool CGUIVisualisationControl::GetPresetList(std::vector &vecpreset bool CGUIVisualisationControl::InitVisualization() { + IAE* ae = CServiceBroker::GetActiveAE(); + CWinSystemBase* const winSystem = CServiceBroker::GetWinSystem(); + if (!ae || !winSystem) + return false; + const std::string addon = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString( CSettings::SETTING_MUSICPLAYER_VISUALISATION); const ADDON::AddonInfoPtr addonBase = @@ -371,28 +362,30 @@ bool CGUIVisualisationControl::InitVisualization() if (!addonBase) return false; - CServiceBroker::GetActiveAE()->RegisterAudioCallback(this); + ae->RegisterAudioCallback(this); + + auto& context = CServiceBroker::GetWinSystem()->GetGfxContext(); - CServiceBroker::GetWinSystem()->GetGfxContext().CaptureStateBlock(); + context.CaptureStateBlock(); - float x = CServiceBroker::GetWinSystem()->GetGfxContext().ScaleFinalXCoord(GetXPosition(), GetYPosition()); - float y = CServiceBroker::GetWinSystem()->GetGfxContext().ScaleFinalYCoord(GetXPosition(), GetYPosition()); - float w = CServiceBroker::GetWinSystem()->GetGfxContext().ScaleFinalXCoord(GetXPosition() + GetWidth(), GetYPosition() + GetHeight()) - x; - float h = CServiceBroker::GetWinSystem()->GetGfxContext().ScaleFinalYCoord(GetXPosition() + GetWidth(), GetYPosition() + GetHeight()) - y; + float x = context.ScaleFinalXCoord(GetXPosition(), GetYPosition()); + float y = context.ScaleFinalYCoord(GetXPosition(), GetYPosition()); + float w = context.ScaleFinalXCoord(GetXPosition() + GetWidth(), GetYPosition() + GetHeight()) - x; + float h = context.ScaleFinalYCoord(GetXPosition() + GetWidth(), GetYPosition() + GetHeight()) - y; if (x < 0) x = 0; if (y < 0) y = 0; - if (x + w > CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth()) - w = CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth() - x; - if (y + h > CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight()) - h = CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight() - y; + if (x + w > context.GetWidth()) + w = context.GetWidth() - x; + if (y + h > context.GetHeight()) + h = context.GetHeight() - y; - m_instance = new ADDON::CVisualization(addonBase, x, y, w, h); + m_instance = new KODI::ADDONS::CVisualization(addonBase, x, y, w, h); CreateBuffers(); m_alreadyStarted = false; - CServiceBroker::GetWinSystem()->GetGfxContext().ApplyStateBlock(); + context.ApplyStateBlock(); return true; } @@ -401,6 +394,10 @@ void CGUIVisualisationControl::DeInitVisualization() if (!m_attemptedLoad) return; + CWinSystemBase* const winSystem = CServiceBroker::GetWinSystem(); + if (!winSystem) + return; + IAE * ae = CServiceBroker::GetActiveAE(); if (ae) ae->UnregisterAudioCallback(this); @@ -416,9 +413,11 @@ void CGUIVisualisationControl::DeInitVisualization() { if (m_alreadyStarted) { - CServiceBroker::GetWinSystem()->GetGfxContext().CaptureStateBlock(); + auto& context = winSystem->GetGfxContext(); + + context.CaptureStateBlock(); m_instance->Stop(); - CServiceBroker::GetWinSystem()->GetGfxContext().ApplyStateBlock(); + context.ApplyStateBlock(); m_alreadyStarted = false; } @@ -433,14 +432,9 @@ void CGUIVisualisationControl::CreateBuffers() { ClearBuffers(); - // Get the number of buffers from the current vis - VIS_INFO info { false, 0 }; - + m_numBuffers = 1; if (m_instance) - m_instance->GetInfo(&info); - - m_numBuffers = info.iSyncDelay + 1; - m_wantsFreq = info.bWantsFreq; + m_numBuffers += m_instance->GetSyncDelay(); if (m_numBuffers > MAX_AUDIO_BUFFERS) m_numBuffers = MAX_AUDIO_BUFFERS; if (m_numBuffers < 1) @@ -449,15 +443,6 @@ void CGUIVisualisationControl::CreateBuffers() void CGUIVisualisationControl::ClearBuffers() { - m_wantsFreq = false; m_numBuffers = 0; m_vecBuffers.clear(); - - for (float& freq : m_freq) - { - freq = 0.0f; - } - - if (m_transform) - m_transform.reset(); } diff --git a/xbmc/guilib/GUIVisualisationControl.h b/xbmc/guilib/GUIVisualisationControl.h index 207850c444914..3ca4280ad6aa4 100644 --- a/xbmc/guilib/GUIVisualisationControl.h +++ b/xbmc/guilib/GUIVisualisationControl.h @@ -11,7 +11,6 @@ #include "GUIControl.h" #include "addons/Visualization.h" #include "cores/AudioEngine/Interfaces/IAudioCallback.h" -#include "utils/rfft.h" #include #include @@ -79,10 +78,7 @@ class CGUIVisualisationControl : public CGUIControl, public IAudioCallback std::list> m_vecBuffers; unsigned int m_numBuffers; /*!< Number of Audio buffers */ - bool m_wantsFreq; - float m_freq[AUDIO_BUFFER_SIZE]; /*!< Frequency data */ std::vector m_presets; /*!< cached preset list */ - std::unique_ptr m_transform; /* values set from "OnInitialize" IAudioCallback */ int m_channels; @@ -94,5 +90,5 @@ class CGUIVisualisationControl : public CGUIControl, public IAudioCallback std::string m_presetsPath; /*!< To add-on sended preset path */ std::string m_profilePath; /*!< To add-on sended profile path */ - ADDON::CVisualization* m_instance; + KODI::ADDONS::CVisualization* m_instance; }; diff --git a/xbmc/guilib/GUIWebAddonControl.cpp b/xbmc/guilib/GUIWebAddonControl.cpp new file mode 100644 index 0000000000000..0ab603cde9acf --- /dev/null +++ b/xbmc/guilib/GUIWebAddonControl.cpp @@ -0,0 +1,575 @@ +/* + * Copyright (C) 2005-2019 Team Kodi + * 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 "GUIWebAddonControl.h" + +#include "Application.h" +#include "GUIComponent.h" +#include "GUIUserMessages.h" +#include "GUIWindowManager.h" +#include "ServiceBroker.h" +#include "addons/interface/tools/GUITranslator.h" +#include "addons/kodi-dev-kit/include/kodi/c-api/gui/input/action.h" +#include "filesystem/SpecialProtocol.h" +#include "input/Key.h" +#include "utils/StringUtils.h" +#include "utils/URIUtils.h" +#include "utils/log.h" +#include "web/Favourites.h" +#include "web/WebManager.h" +#include "web/windows/GUIWindowWebBrowser.h" + +using namespace KODI::GUILIB; +using namespace KODI::WEB; + +CGUIWebAddonControl::CGUIWebAddonControl(int parentID, + int controlID, + float posX, + float posY, + float width, + float height, + const std::string& startAddress) + : CGUIControl(parentID, controlID, posX, posY, width, height), + m_startAddress(startAddress), + m_transparentBackground(false), + m_singleReload(true), + m_isFullScreen(false) +{ + ControlType = GUICONTROL_WEB_ADDON; +} + +CGUIWebAddonControl::CGUIWebAddonControl(const CGUIWebAddonControl& from) + : CGUIControl(from), + m_startAddress(from.m_startAddress), + m_transparentBackground(from.m_transparentBackground), + m_singleReload(from.m_singleReload), + m_isFullScreen(from.m_isFullScreen) +{ + ControlType = GUICONTROL_WEB_ADDON; +} + +CGUIWebAddonControl::~CGUIWebAddonControl() +{ + if (m_addonControl != nullptr) + m_addonControl->UnregisterGUIControl(this); +} + +void CGUIWebAddonControl::UpdateInfo(const CGUIListItem* item) +{ + if (item && m_bInvalidated) + { + if (m_addonControl == nullptr) + { + m_idString = item->GetProperty("browseridstring").asString(); + if (m_idString.empty()) + { + CLog::Log(LOGERROR, + "CGUIWebAddonControl::{}: Called without defined 'browseridstring' for '{}'", + __func__, item->GetLabel2()); + return; + } + + m_addonControl = CServiceBroker::GetWEBManager().m_addonControl.GetControl(m_idString); + if (m_addonControl == nullptr) + { + CLog::Log(LOGERROR, "CGUIWebAddonControl::{}: Failed to get web addon control!", + __func__); + return; + } + m_addonControl->RegisterGUIControl(this); + } + + CGUIWebAddonControl* control = m_addonControl->GetFirstControl(); + if (control == nullptr) + return; + + m_idString = control->m_idString; + m_props = control->m_props; + m_attemptedLoad = false; + } +} + +bool CGUIWebAddonControl::OnMessage(CGUIMessage& message) +{ + if (m_addonControl && message.GetControlId() == GetID()) + { + switch (message.GetMessage()) + { + case GUI_MSG_WEB_CONTROL_GO_BACK: + { + m_addonControl->GoBack(); + return true; + } + case GUI_MSG_WEB_CONTROL_GO_FWD: + { + m_addonControl->GoForward(); + return true; + } + case GUI_MSG_WEB_CONTROL_LOAD: + { + std::string url = message.GetLabel(); + m_addonControl->OpenWebsite(url); + m_loadAddress = url; + return true; + } + case GUI_MSG_WEB_CONTROL_RELOAD: + { + std::string url = message.GetLabel(); + if (m_singleReload && url != m_addonControl->OpenedAddress()) + m_addonControl->OpenWebsite(url); + else + m_addonControl->Reload(); + return true; + } + case GUI_MSG_WEB_CONTROL_HOME: + { + std::string startAddress = GenerateAddress(m_startAddress); + m_addonControl->OpenWebsite(startAddress); + return true; + } + case GUI_MSG_WEB_CONTROL_SETTINGS: + { + m_addonControl->OpenOwnContextMenu(); + return true; + } + case GUI_MSG_WEB_CONTROL_ADD_TO_FAVOURITES: + { + CWebFavourites::AddToFavourites(m_addonControl->OpenedTitle(), + m_addonControl->OpenedAddress(), m_addonControl->IconURL()); + return true; + } + default: + break; + } + } + + return CGUIControl::OnMessage(message); +} + +EVENT_RESULT CGUIWebAddonControl::OnMouseEvent(const CPoint& point, const CMouseEvent& event) +{ + if (m_addonControl && m_addonControl->OnMouseEvent(event.m_id, point.x, point.y, event.m_offsetX, + event.m_offsetY, event.m_state)) + return EVENT_RESULT_HANDLED; + + return EVENT_RESULT_UNHANDLED; +} + +bool CGUIWebAddonControl::OnAction(const CAction& action) +{ + using namespace KODI::ADDONS::INTERFACE; + + int nextItem = -1; + + KODI_ADDON_ACTION_DATA actionAddon; + actionAddon.id = CAddonGUITranslator::TranslateActionIdToAddon(action.GetID()); + actionAddon.name = action.GetName().c_str(); + actionAddon.repeat = action.GetRepeat(); + actionAddon.hold_time = action.GetHoldTime(); + actionAddon.button_code = action.GetButtonCode(); + actionAddon.unicode = action.GetUnicode(); + actionAddon.text = action.GetText().c_str(); + for (unsigned int i = 0; i < ADDON_ACTION_AMOUNT_MAX; i++) + actionAddon.amount[i] = action.GetAmount(i); + + if (!m_addonControl || !m_addonControl->OnAction(&actionAddon, nextItem)) + return CGUIControl::OnAction(action); + + if (nextItem > 0) + { + // Advance the selected item one notch + CGUIMessage msg(GUI_MSG_SETFOCUS, GetParentID(), nextItem); + OnMessage(msg); + } + + return true; +} + +void CGUIWebAddonControl::Process(unsigned int currentTime, CDirtyRegionList& dirtyregions) +{ + /* Load the addon on first call */ + if (m_addonControl == nullptr && !m_attemptedLoad) + { + if (m_idString.empty()) + m_idString = StringUtils::CreateUUID(); + + m_addonControl = CServiceBroker::GetWEBManager().m_addonControl.GetControl(m_idString); + if (m_addonControl == nullptr) + { + CLog::Log(LOGERROR, "CGUIWebAddonControl::{}: Failed to get web addon control!", + __func__); + return; + } + m_addonControl->RegisterGUIControl(this); + } + + if (m_addonControl && !m_attemptedLoad) + { + m_props.fSkinXPos = GetXPosition(); + m_props.fSkinYPos = GetYPosition(); + if (m_props.fSkinWidth == 0.0f) + m_props.fSkinWidth = GetWidth(); + if (m_props.fSkinHeight == 0.0f) + m_props.fSkinHeight = GetHeight(); + + CServiceBroker::GetWinSystem()->GetGfxContext().CaptureStateBlock(); + float x = CServiceBroker::GetWinSystem()->GetGfxContext().ScaleFinalXCoord(GetXPosition(), + GetYPosition()); + float y = CServiceBroker::GetWinSystem()->GetGfxContext().ScaleFinalYCoord(GetXPosition(), + GetYPosition()); + float w = CServiceBroker::GetWinSystem()->GetGfxContext().ScaleFinalXCoord( + GetXPosition() + m_props.fSkinWidth, GetYPosition() + m_props.fSkinHeight) - + x; + float h = CServiceBroker::GetWinSystem()->GetGfxContext().ScaleFinalYCoord( + GetXPosition() + m_props.fSkinWidth, GetYPosition() + m_props.fSkinHeight) - + y; + if (x < 0) + x = 0; + if (y < 0) + y = 0; + if (x + w > CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth()) + w = CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth() - x; + if (y + h > CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight()) + h = CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight() - y; + + strncpy(m_props.strName, m_idString.c_str(), sizeof(m_props.strName)); + m_props.pDevice = CServiceBroker::GetWinSystem()->GetHWContext(); + m_props.fXPos = x + 0.5f; + m_props.fYPos = y + 0.5f; + m_props.fWidth = w + 0.5f; + m_props.fHeight = h + 0.5f; + + m_props.fPixelRatio = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo().fPixelRatio; + m_props.fFPS = CServiceBroker::GetWinSystem()->GetGfxContext().GetFPS(); + m_props.bUseTransparentBackground = m_transparentBackground; + m_props.iBackgroundColorARGB = static_cast(m_diffuseColor); + m_props.iGUIItemLeft = GetAction(ACTION_MOVE_LEFT).GetNavigation(); + m_props.iGUIItemRight = GetAction(ACTION_MOVE_RIGHT).GetNavigation(); + m_props.iGUIItemTop = GetAction(ACTION_MOVE_UP).GetNavigation(); + m_props.iGUIItemBottom = GetAction(ACTION_MOVE_DOWN).GetNavigation(); + m_props.iGUIItemBack = GetAction(ACTION_NAV_BACK).GetNavigation(); + m_props.pControlIdent = m_addonControl.get(); + + std::string startAddress = + GenerateAddress(m_loadAddress.empty() ? m_startAddress : m_loadAddress); + if (m_addonControl->CreateWebControl(this, startAddress)) + { + CLog::Log(LOGDEBUG, "{} - Web addon control successfully created, for '{}'", __func__, + m_idString); + CServiceBroker::GetWinSystem()->GetGfxContext().ApplyStateBlock(); + } + else + { + CLog::Log(LOGERROR, "{} - Web addon control creation for '{}' failed", __func__, + m_idString); + m_addonControl.reset(); + } + + m_attemptedLoad = true; + } + + // TODO Add processing to the addon so it could mark when actually changing + if (m_addonControl && m_addonControl->Dirty()) + MarkDirtyRegion(); + + CGUIControl::Process(currentTime, dirtyregions); +} + +void CGUIWebAddonControl::Render() +{ + if (m_addonControl && + static_cast(m_renderRegion.x1) < + CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth() && + static_cast(m_renderRegion.y1) < + CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight() && + m_renderRegion.x2 >= 0.0f && + m_renderRegion.y2 >= + 0.0f) // Do not render if control is outside of visible view (brings a badly fullscreen of a small control) + { + // set the viewport - note: We currently don't have any control over how + // the addon renders, so the best we can do is attempt to define + // a viewport?? + CServiceBroker::GetWinSystem()->GetGfxContext().SetViewPort(m_posX, m_posY, m_width, m_height); + CServiceBroker::GetWinSystem()->GetGfxContext().CaptureStateBlock(); + m_addonControl->Render(); + CServiceBroker::GetWinSystem()->GetGfxContext().ApplyStateBlock(); + CServiceBroker::GetWinSystem()->GetGfxContext().RestoreViewPort(); + } + + CGUIControl::Render(); +} + +void CGUIWebAddonControl::FreeResources(bool immediately) +{ + // tell our app that we're going + if (!m_addonControl || !m_attemptedLoad) + return; + + if (m_props.strName) + { + // Destroy the addon control side only partly with the "false" to allow + // background work. + CServiceBroker::GetWinSystem()->GetGfxContext().CaptureStateBlock(); //TODO locking + m_addonControl->DestroyWebControl(this); + CServiceBroker::GetWinSystem()->GetGfxContext().ApplyStateBlock(); + } + + CGUIControl::FreeResources(immediately); + + m_attemptedLoad = false; +} + +void CGUIWebAddonControl::UpdateVisibility(const CGUIListItem* item) +{ + if (m_idString.empty()) + return; + + // if made invisible, start timer, only free addonptr after + // some period, configurable by window class + CGUIControl::UpdateVisibility(item); + if (!IsVisible() && m_attemptedLoad) + { + FreeResources(); + } +} + +bool CGUIWebAddonControl::CanFocusFromPoint(const CPoint& point) const +{ + // mouse is allowed to focus this control, but it doesn't actually receive focus + return IsVisible() && HitTest(point); +} + +/// Set functions for CGUIControlFactory +//@{ +void CGUIWebAddonControl::SetWebControlIdString(const std::string& id) +{ + m_idString = id; +} + +void CGUIWebAddonControl::SetTransparent(bool transparent) +{ + m_transparentBackground = transparent; +} + +void CGUIWebAddonControl::SetReloadButton(bool singleReload) +{ + m_singleReload = singleReload; +} + +void CGUIWebAddonControl::SetFullscreen(bool enable) +{ + if (!m_addonControl) + return; + + if (enable && !m_isFullScreen) + { + m_windowedXPos = GetXPosition(); + m_windowedYPos = GetYPosition(); + m_windowedWidth = GetWidth(); + m_windowedHeight = GetHeight(); + m_windowedAddonXPos = m_props.fXPos; + m_windowedAddonYPos = m_props.fYPos; + m_windowedAddonWidth = m_props.fWidth; + m_windowedAddonHeight = m_props.fHeight; + m_windowedSkinXPos = m_props.fSkinXPos; + m_windowedSkinYPos = m_props.fSkinYPos; + m_windowedSkinWidth = m_props.fSkinWidth; + m_windowedSkinHeight = m_props.fSkinHeight; + + m_props.fXPos = 0; + m_props.fYPos = 0; + m_props.fWidth = CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth(); + m_props.fHeight = CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight(); + m_props.fSkinXPos = 0; + m_props.fSkinYPos = 0; + m_props.fSkinWidth = m_props.fWidth; + m_props.fSkinHeight = m_props.fHeight; + m_isFullScreen = true; + + SetPosition(m_props.fXPos, m_props.fYPos); + SetWidth(m_props.fWidth); + SetHeight(m_props.fHeight); + } + else if (!enable && m_isFullScreen) + { + m_props.fXPos = m_windowedAddonXPos; + m_props.fYPos = m_windowedAddonYPos; + m_props.fWidth = m_windowedAddonWidth; + m_props.fHeight = m_windowedAddonHeight; + m_props.fSkinXPos = m_windowedSkinXPos; + m_props.fSkinYPos = m_windowedSkinYPos; + m_props.fSkinWidth = m_windowedSkinWidth; + m_props.fSkinHeight = m_windowedSkinHeight; + m_isFullScreen = false; + + SetPosition(m_windowedXPos, m_windowedYPos); + SetWidth(m_windowedWidth); + SetHeight(m_windowedHeight); + } + + m_addonControl->ScreenSizeChange(m_props.fXPos, m_props.fYPos, m_props.fWidth, m_props.fHeight, + m_isFullScreen); +} +//@} + +/// Interact functions between CGUIWebAddonControl and CWebAddonControl +//@{ +void CGUIWebAddonControl::UpdateOpenedAddress(const std::string& address) +{ + CGUIMessage msg(GUI_MSG_WEB_UPDATE_ADDRESS, GetID(), GetParentID()); + msg.SetLabel(address); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); +} + +void CGUIWebAddonControl::UpdateOpenedTitle(const std::string& title) +{ + CGUIMessage msg(GUI_MSG_WEB_UPDATE_NAME, GetID(), GetParentID()); + msg.SetLabel(title); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); +} + +void CGUIWebAddonControl::UpdateIconURL(const std::string& icon) +{ + CGUIMessage msg(GUI_MSG_WEB_UPDATE_ICON, GetID(), GetParentID()); + msg.SetLabel(icon); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); +} + +void CGUIWebAddonControl::RequestOpenSiteInNewTab(const std::string& url) +{ + CGUIMessage msg(GUI_MSG_WEB_NEW_TAB, GetID(), GetParentID()); + msg.SetLabel(url); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); +} +//@} + +/// GUI interface info functions (used from places where control is on window) +//@{ +bool CGUIWebAddonControl::IsLoading() const +{ + if (!m_addonControl) + return false; + + return m_addonControl->IsLoading(); +} + +bool CGUIWebAddonControl::CanGoBack() const +{ + if (!m_addonControl) + return false; + + return m_addonControl->CanGoBack(); +} + +bool CGUIWebAddonControl::CanGoForward() const +{ + if (!m_addonControl) + return false; + + return m_addonControl->CanGoForward(); +} + +const std::string& CGUIWebAddonControl::OpenedAddress() const +{ + if (!m_addonControl) + return StringUtils::Empty; + + std::string url = m_addonControl->OpenedAddress(); + if (url.empty()) + return m_loadAddress.empty() ? m_startAddress : m_loadAddress; + + return m_addonControl->OpenedAddress(); +} + +const std::string& CGUIWebAddonControl::OpenedTitle() const +{ + if (!m_addonControl) + return StringUtils::Empty; + + return m_addonControl->OpenedTitle(); +} + +const std::string& CGUIWebAddonControl::IconURL() const +{ + if (!m_addonControl) + return StringUtils::Empty; + + return m_addonControl->IconURL(); +} + +const std::string& CGUIWebAddonControl::StatusMessage() const +{ + if (!m_addonControl) + return StringUtils::Empty; + + return m_addonControl->StatusMessage(); +} + +const std::string& CGUIWebAddonControl::Tooltip() const +{ + if (!m_addonControl) + return StringUtils::Empty; + + return m_addonControl->Tooltip(); +} + +void CGUIWebAddonControl::SetLoadAddress(const std::string& loadAddress) +{ + m_loadAddress = loadAddress; +} + +bool CGUIWebAddonControl::GetHistory(std::vector& historyWebsiteNames, + bool behindCurrent) +{ + if (!m_addonControl) + return false; + + return m_addonControl->GetHistory(historyWebsiteNames, behindCurrent); +} + +void CGUIWebAddonControl::SearchText(const std::string& text, + bool forward, + bool matchCase, + bool findNext) +{ + if (!m_addonControl) + return; + + m_addonControl->SearchText(text, forward, matchCase, findNext); +} + +void CGUIWebAddonControl::StopSearch(bool clearSelection) +{ + if (!m_addonControl) + return; + + m_addonControl->StopSearch(clearSelection); +} +//@} + +void CGUIWebAddonControl::SetWebAddonInvalid() +{ + if (m_addonControl != nullptr) + m_addonControl->UnregisterGUIControl(this); + m_addonControl = nullptr; +} + +std::string CGUIWebAddonControl::GenerateAddress(const std::string& startAddress) +{ + // if empty do not check, empty means start URL + if (startAddress.empty()) + return startAddress; + + std::string address = CSpecialProtocol::TranslatePath(startAddress); + if (!URIUtils::IsURL(address)) + { + address = "file://" + address; + } + + return address; +} diff --git a/xbmc/guilib/GUIWebAddonControl.h b/xbmc/guilib/GUIWebAddonControl.h new file mode 100644 index 0000000000000..496a27570c49a --- /dev/null +++ b/xbmc/guilib/GUIWebAddonControl.h @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2005-2019 Team Kodi + * 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 "GUIControl.h" +#include "web/WebAddonControl.h" + +namespace KODI +{ +namespace GUILIB +{ + +class CGUIWebAddonControl : public CGUIControl +{ +public: + CGUIWebAddonControl(int parentID, + int controlID, + float posX, + float posY, + float width, + float height, + const std::string& startAddress = ""); + CGUIWebAddonControl(const CGUIWebAddonControl& from); + ~CGUIWebAddonControl() override; + CGUIWebAddonControl* Clone() const override { return new CGUIWebAddonControl(*this); } + + void FreeResources(bool immediately = false) override; + void Process(unsigned int currentTime, CDirtyRegionList& dirtyregions) override; + bool OnAction(const CAction& action) override; + bool OnMessage(CGUIMessage& message) override; + void Render() override; + void UpdateVisibility(const CGUIListItem* item) override; + bool CanFocus() const override { return true; } + bool CanFocusFromPoint(const CPoint& point) const override; + void UpdateInfo(const CGUIListItem* item = nullptr) override; + + // Set functions for CGUIControlFactory + void SetWebControlIdString(const std::string& id); + void SetTransparent(bool transparent); + void SetReloadButton(bool singleReload); + void SetFullscreen(bool enable); + + // Interact functions between CGUIWebAddonControl and CWebAddonControl + const WEB_ADDON_GUI_PROPS& GetProps() { return m_props; } + void UpdateOpenedAddress(const std::string& address); + void UpdateOpenedTitle(const std::string& title); + void UpdateIconURL(const std::string& icon); + void RequestOpenSiteInNewTab(const std::string& url); + + // GUI interface info functions (used from places where control is on window) + const std::string& WebControlIdString() const { return m_idString; } + bool IsLoading() const; + bool CanGoBack() const; + bool CanGoForward() const; + const std::string& OpenedAddress() const; + const std::string& OpenedTitle() const; + const std::string& IconURL() const; + const std::string& StatusMessage() const; + const std::string& Tooltip() const; + + void SetLoadAddress(const std::string& loadAddress); + bool GetHistory(std::vector& historyWebsiteNames, bool behindCurrent); + void SearchText(const std::string& text, bool forward, bool matchCase, bool findNext); + void StopSearch(bool clearSelection); + + void SetWebAddonInvalid(); + +protected: + EVENT_RESULT OnMouseEvent(const CPoint& point, const CMouseEvent& event) override; + +private: + std::string GenerateAddress(const std::string& address); + + bool m_attemptedLoad{false}; + std::string m_idString; + std::string m_startAddress; + std::string m_loadAddress; + KODI::WEB::WebAddonControlPtr m_addonControl; + WEB_ADDON_GUI_PROPS m_props{}; + bool m_transparentBackground; + bool m_singleReload; + + // Full screen switch storage + bool m_isFullScreen; + float m_windowedXPos; + float m_windowedYPos; + float m_windowedWidth; + float m_windowedHeight; + float m_windowedAddonXPos; + float m_windowedAddonYPos; + float m_windowedAddonWidth; + float m_windowedAddonHeight; + float m_windowedSkinXPos; + float m_windowedSkinYPos; + float m_windowedSkinWidth; + float m_windowedSkinHeight; +}; + +} /* namespace GUILIB */ +} /* namespace KODI */ diff --git a/xbmc/guilib/GUIWindow.h b/xbmc/guilib/GUIWindow.h index fa40d29605268..298222e31b7df 100644 --- a/xbmc/guilib/GUIWindow.h +++ b/xbmc/guilib/GUIWindow.h @@ -126,6 +126,7 @@ class CGUIWindow : public CGUIControlGroup, protected CCriticalSection virtual bool IsModalDialog() const { return false; } virtual bool IsMediaWindow() const { return false; } virtual bool HasListItems() const { return false; } + virtual bool HasWebControl() const { return false; } virtual bool IsSoundEnabled() const { return true; } virtual CFileItemPtr GetCurrentListItem(int offset = 0) { return CFileItemPtr(); } virtual int GetViewContainerID() const { return 0; } diff --git a/xbmc/guilib/GUIWindowManager.cpp b/xbmc/guilib/GUIWindowManager.cpp index 712709144a40c..c49e990c0f36d 100644 --- a/xbmc/guilib/GUIWindowManager.cpp +++ b/xbmc/guilib/GUIWindowManager.cpp @@ -18,11 +18,13 @@ #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 "addons/interface/gui/GUIDialogCrashReporter.h" #include "events/windows/GUIWindowEventLog.h" #include "favourites/GUIDialogFavourites.h" #include "input/Key.h" #include "messaging/ApplicationMessenger.h" +#include "messaging/helpers/DialogCrashReporter.h" #include "messaging/helpers/DialogHelper.h" #include "music/dialogs/GUIDialogInfoProviderSettings.h" #include "music/dialogs/GUIDialogMusicInfo.h" @@ -128,14 +130,18 @@ #include "pvr/windows/GUIWindowPVRTimerRules.h" #include "pvr/windows/GUIWindowPVRTimers.h" -#include "video/dialogs/GUIDialogTeletext.h" -#include "dialogs/GUIDialogSlider.h" -#include "dialogs/GUIDialogPlayEject.h" +/* Web related include Files */ #include "dialogs/GUIDialogMediaFilter.h" -#include "video/dialogs/GUIDialogSubtitles.h" - -#include "peripherals/dialogs/GUIDialogPeripherals.h" +#include "dialogs/GUIDialogPlayEject.h" +#include "dialogs/GUIDialogSlider.h" #include "peripherals/dialogs/GUIDialogPeripheralSettings.h" +#include "peripherals/dialogs/GUIDialogPeripherals.h" +#include "video/dialogs/GUIDialogSubtitles.h" +#include "video/dialogs/GUIDialogTeletext.h" +#include "web/WebManager.h" +#include "web/dialogs/GUIDialogFavourites.h" +#include "web/windows/GUIWindowWebBrowser.h" +#include "web/windows/GUIWindowWebBrowserFullScreen.h" /* Game related include files */ #include "cores/RetroPlayer/guiwindows/GameWindowFullScreen.h" @@ -232,6 +238,7 @@ void CGUIWindowManager::CreateWindows() Add(new CGUIDialogPictureInfo); Add(new CGUIDialogAddonInfo); Add(new CGUIDialogAddonSettings); + Add(new KODI::ADDONS::INTERFACE::CGUIDialogCrashReporter); Add(new CGUIDialogLockSettings); @@ -280,6 +287,11 @@ void CGUIWindowManager::CreateWindows() Add(new CGUIDialogPVRClientPriorities); Add(new CGUIDialogPVRGuideControls); + /* Load web related Windows and Dialogs */ + Add(new WEB::CGUIWindowWebBrowser); + Add(new WEB::CGUIWindowWebBrowserFullScreen); + Add(new WEB::CGUIDialogWebFavourites); + Add(new CGUIDialogSelect); Add(new CGUIDialogColorPicker); Add(new CGUIDialogMusicInfo); @@ -359,6 +371,7 @@ bool CGUIWindowManager::DestroyWindows() DestroyWindow(WINDOW_DIALOG_SMART_PLAYLIST_RULE); DestroyWindow(WINDOW_DIALOG_BUSY); DestroyWindow(WINDOW_DIALOG_BUSY_NOCANCEL); + DestroyWindow(WINDOW_DIALOG_ADDON_CRASH_REPORTER); DestroyWindow(WINDOW_DIALOG_PICTURE_INFO); DestroyWindow(WINDOW_DIALOG_ADDON_INFO); DestroyWindow(WINDOW_DIALOG_ADDON_SETTINGS); @@ -396,6 +409,11 @@ bool CGUIWindowManager::DestroyWindows() DestroyWindow(WINDOW_DIALOG_PVR_CLIENT_PRIORITIES); DestroyWindow(WINDOW_DIALOG_PVR_GUIDE_CONTROLS); + /* Delete web relatated windows and dialogs */ + DestroyWindow(WINDOW_WEB_BROWSER); + DestroyWindow(WINDOW_WEB_BROWSER_FULLSCREEN); + DestroyWindow(WINDOW_DIALOG_WEB_FAVOURITES); + DestroyWindow(WINDOW_DIALOG_TEXT_VIEWER); DestroyWindow(WINDOW_DIALOG_PLAY_EJECT); DestroyWindow(WINDOW_STARTUP_ANIM); @@ -1005,7 +1023,8 @@ 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; @@ -1096,6 +1115,22 @@ void CGUIWindowManager::OnApplicationMessage(ThreadMessage* pMsg) pMsg->SetResult(static_cast(dialogOK->IsConfirmed())); } break; + + case TMSG_GUI_DIALOG_ADDON_CRASH_REPORT: + { + + if (!pMsg->lpVoid) + return; + + using namespace KODI::ADDONS::INTERFACE; + + auto dialogCrashReport = static_cast(GetWindow(WINDOW_DIALOG_ADDON_CRASH_REPORTER)); + if (!dialogCrashReport) + return; + + dialogCrashReport->ReportCrash(static_cast(pMsg->lpVoid)); + } + break; } } diff --git a/xbmc/guilib/Shader.cpp b/xbmc/guilib/Shader.cpp index 37aedcfaebc50..327edd45901ce 100644 --- a/xbmc/guilib/Shader.cpp +++ b/xbmc/guilib/Shader.cpp @@ -250,6 +250,23 @@ CGLSLShaderProgram::CGLSLShaderProgram(const std::string& vert, m_pVP->LoadSource(vert); } +bool CGLSLShaderProgram::LoadShaderFiles(const std::string& vert, const std::string& frag) +{ + if (!m_pVP->LoadSource(vert)) + { + CLog::Log(LOGERROR, "{}: Failed to load '{}'", __func__, vert.c_str()); + return false; + } + + if (!m_pFP->LoadSource(frag)) + { + CLog::Log(LOGERROR, "{}: Failed to load '{}'", __func__, frag.c_str()); + return false; + } + + return true; +} + CGLSLShaderProgram::~CGLSLShaderProgram() { Free(); diff --git a/xbmc/guilib/Shader.h b/xbmc/guilib/Shader.h index d86ca2b79b494..b5c82cd66deda 100644 --- a/xbmc/guilib/Shader.h +++ b/xbmc/guilib/Shader.h @@ -153,6 +153,8 @@ namespace Shaders { , const std::string& frag); ~CGLSLShaderProgram() override; + bool LoadShaderFiles(const std::string& vert, const std::string& frag); + // enable the shader bool Enable() override; diff --git a/xbmc/guilib/WindowIDs.dox b/xbmc/guilib/WindowIDs.dox index cdf36788d6822..82cc4e5df3ab5 100644 --- a/xbmc/guilib/WindowIDs.dox +++ b/xbmc/guilib/WindowIDs.dox @@ -78,6 +78,7 @@ This page shows the window names, the window definition, the window ID and the s | InfoproviderSettings | WINDOW_DIALOG_INFOPROVIDER_SETTINGS | 10158 | DialogSettings.xml | | OSDSubtitleSettings | WINDOW_DIALOG_SUBTITLE_OSD_SETTINGS | 10159 | DialogSettings.xml | | BusyDialogNoCancel | WINDOW_DIALOG_BUSY_NOCANCEL | 10160 | DialogBusy.xml | +| AddonCrashReport | WINDOW_DIALOG_ADDON_CRASH_REPORTER | 10161 | DialogConfirm.xml | | MusicPlaylist | WINDOW_MUSIC_PLAYLIST | 10500 | MyPlaylist.xml | | Music | WINDOW_MUSIC_NAV | 10502 | MyMusicNav.xml | | MusicPlaylistEditor | WINDOW_MUSIC_PLAYLIST_EDITOR | 10503 | MyMusicPlaylistEditor.xml | diff --git a/xbmc/guilib/WindowIDs.h b/xbmc/guilib/WindowIDs.h index 5de7b9cf6e41d..7c72ec25138ca 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 @@ -153,6 +154,11 @@ #define WINDOW_DIALOG_IN_GAME_SAVES 10829 #define WINDOW_DIALOG_GAME_SAVES 10830 +// Web Browser related Window and Dialog ID's +#define WINDOW_WEB_BROWSER 10900 +#define WINDOW_WEB_BROWSER_FULLSCREEN 10901 +#define WINDOW_DIALOG_WEB_FAVOURITES 10902 + //#define WINDOW_VIRTUAL_KEYBOARD 11000 // WINDOW_ID's from 11100 to 11199 reserved for Skins diff --git a/xbmc/guilib/guiinfo/CMakeLists.txt b/xbmc/guilib/guiinfo/CMakeLists.txt index 9203511774502..666b036f689ff 100644 --- a/xbmc/guilib/guiinfo/CMakeLists.txt +++ b/xbmc/guilib/guiinfo/CMakeLists.txt @@ -15,7 +15,8 @@ set(SOURCES GUIInfo.cpp SystemGUIInfo.cpp VideoGUIInfo.cpp VisualisationGUIInfo.cpp - WeatherGUIInfo.cpp) + WeatherGUIInfo.cpp + WebGUIInfo.cpp) set(HEADERS GUIInfo.h GUIInfoHelper.h @@ -37,6 +38,7 @@ set(HEADERS GUIInfo.h SystemGUIInfo.h VideoGUIInfo.h VisualisationGUIInfo.h - WeatherGUIInfo.h) + WeatherGUIInfo.h + WebGUIInfo.h) core_add_library(guilib_guiinfo) diff --git a/xbmc/guilib/guiinfo/GUIInfoHelper.cpp b/xbmc/guilib/guiinfo/GUIInfoHelper.cpp index 55f82997f1cf6..fce62361dac4c 100644 --- a/xbmc/guilib/guiinfo/GUIInfoHelper.cpp +++ b/xbmc/guilib/guiinfo/GUIInfoHelper.cpp @@ -18,6 +18,7 @@ #include "playlists/PlayList.h" #include "utils/StringUtils.h" #include "utils/URIUtils.h" +#include "web/windows/GUIWindowWebBrowser.h" #include "windows/GUIMediaWindow.h" namespace KODI @@ -30,6 +31,7 @@ namespace GUIINFO // conditions for window retrieval static const int WINDOW_CONDITION_HAS_LIST_ITEMS = 1; static const int WINDOW_CONDITION_IS_MEDIA_WINDOW = 2; +static const int WINDOW_CONDITION_HAS_WEB_CONTROL = 4; std::string GetPlaylistLabel(int item, int playlistid /* = PLAYLIST_NONE */) { @@ -85,6 +87,9 @@ bool CheckWindowCondition(CGUIWindow *window, int condition) return false; if ((condition & WINDOW_CONDITION_IS_MEDIA_WINDOW) && !window->IsMediaWindow()) return false; + if ((condition & WINDOW_CONDITION_HAS_WEB_CONTROL) && !window->HasWebControl()) + return false; + return true; } @@ -134,6 +139,15 @@ CGUIMediaWindow* GetMediaWindow(int contextWindow) return nullptr; } +KODI::WEB::CGUIWindowWebBrowser* GetWebBrowserWindow(int contextWindow) +{ + CGUIWindow* window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_HAS_WEB_CONTROL); + if (window) + return dynamic_cast(window); + + return nullptr; +} + CGUIControl* GetActiveContainer(int containerId, int contextWindow) { CGUIWindow *window = GetWindow(contextWindow); diff --git a/xbmc/guilib/guiinfo/GUIInfoHelper.h b/xbmc/guilib/guiinfo/GUIInfoHelper.h index 0526fb12a7b2b..01a0d20d52be9 100644 --- a/xbmc/guilib/guiinfo/GUIInfoHelper.h +++ b/xbmc/guilib/guiinfo/GUIInfoHelper.h @@ -24,6 +24,12 @@ class CGUIWindow; namespace KODI { + +namespace WEB +{ +class CGUIWindowWebBrowser; +} + namespace GUILIB { namespace GUIINFO @@ -34,6 +40,7 @@ std::string GetPlaylistLabel(int item, int playlistid = PLAYLIST_NONE); CGUIWindow* GetWindow(int contextWindow); CGUIControl* GetActiveContainer(int containerId, int contextWindow); CGUIMediaWindow* GetMediaWindow(int contextWindow); +WEB::CGUIWindowWebBrowser* GetWebBrowserWindow(int contextWindow); CGUIListItemPtr GetCurrentListItem(int contextWindow, int containerId = 0, int itemOffset = 0, unsigned int itemFlags = 0); std::string GetFileInfoLabelValueFromPath(int info, const std::string& filenameAndPath); diff --git a/xbmc/guilib/guiinfo/GUIInfoLabels.h b/xbmc/guilib/guiinfo/GUIInfoLabels.h index 3e2b163fdc74f..6f056bdd6d4ac 100644 --- a/xbmc/guilib/guiinfo/GUIInfoLabels.h +++ b/xbmc/guilib/guiinfo/GUIInfoLabels.h @@ -148,6 +148,7 @@ #define SYSTEM_INTERNET_STATE 159 #define SYSTEM_HAS_INPUT_HIDDEN 160 #define SYSTEM_HAS_PVR_ADDON 161 +#define SYSTEM_ISNOSANDBOX 179 #define SYSTEM_ALARM_LESS_OR_EQUAL 180 #define SYSTEM_PROFILECOUNT 181 #define SYSTEM_ISFULLSCREEN 182 @@ -565,6 +566,22 @@ #define SYSTEM_BUILD_VERSION_CODE 1007 #define SYSTEM_BUILD_VERSION_GIT 1008 +#define WEB_CONDITIONS_START 1050 +#define WEB_HAS_ADDONS (WEB_CONDITIONS_START) +#define WEB_HAS_BROWSER (WEB_CONDITIONS_START + 1) +#define WEB_CONDITIONS_END WEB_HAS_BROWSER + +#define WEB_CONTROL_START 1070 +#define WEB_CONTROL_OPENED_ADDRESS (WEB_CONTROL_START) +#define WEB_CONTROL_OPENED_TITLE (WEB_CONTROL_START + 1) +#define WEB_CONTROL_ICONURL (WEB_CONTROL_START + 2) +#define WEB_CONTROL_IS_LOADING (WEB_CONTROL_START + 3) +#define WEB_CONTROL_CAN_GO_BACK (WEB_CONTROL_START + 4) +#define WEB_CONTROL_CAN_GO_FORWARD (WEB_CONTROL_START + 5) +#define WEB_CONTROL_TOOLTIP (WEB_CONTROL_START + 6) +#define WEB_CONTROL_STATUS_MESSAGE (WEB_CONTROL_START + 7) +#define WEB_CONTROL_END WEB_CONTROL_STATUS_MESSAGE + #define PVR_CONDITIONS_START 1100 #define PVR_IS_RECORDING (PVR_CONDITIONS_START) #define PVR_HAS_TIMER (PVR_CONDITIONS_START + 1) diff --git a/xbmc/guilib/guiinfo/GUIInfoProviders.cpp b/xbmc/guilib/guiinfo/GUIInfoProviders.cpp index 274318e220420..0d5bf9d16e22b 100644 --- a/xbmc/guilib/guiinfo/GUIInfoProviders.cpp +++ b/xbmc/guilib/guiinfo/GUIInfoProviders.cpp @@ -30,10 +30,12 @@ CGUIInfoProviders::CGUIInfoProviders() RegisterProvider(&m_systemGUIInfo); RegisterProvider(&m_visualisationGUIInfo); RegisterProvider(&m_skinGUIInfo); + RegisterProvider(&m_webGUIInfo); } CGUIInfoProviders::~CGUIInfoProviders() { + UnregisterProvider(&m_webGUIInfo); UnregisterProvider(&m_skinGUIInfo); UnregisterProvider(&m_visualisationGUIInfo); UnregisterProvider(&m_systemGUIInfo); diff --git a/xbmc/guilib/guiinfo/GUIInfoProviders.h b/xbmc/guilib/guiinfo/GUIInfoProviders.h index 1aed710d7107c..2c96248c58963 100644 --- a/xbmc/guilib/guiinfo/GUIInfoProviders.h +++ b/xbmc/guilib/guiinfo/GUIInfoProviders.h @@ -20,6 +20,7 @@ #include "guilib/guiinfo/VideoGUIInfo.h" #include "guilib/guiinfo/VisualisationGUIInfo.h" #include "guilib/guiinfo/WeatherGUIInfo.h" +#include "guilib/guiinfo/WebGUIInfo.h" #include #include @@ -150,6 +151,7 @@ class CGUIInfoProviders CVideoGUIInfo m_videoGUIInfo; CVisualisationGUIInfo m_visualisationGUIInfo; CWeatherGUIInfo m_weatherGUIInfo; + CWebGUIInfo m_webGUIInfo; }; } // namespace GUIINFO diff --git a/xbmc/guilib/guiinfo/SystemGUIInfo.cpp b/xbmc/guilib/guiinfo/SystemGUIInfo.cpp index 8e03172aceec1..4ad826a914453 100644 --- a/xbmc/guilib/guiinfo/SystemGUIInfo.cpp +++ b/xbmc/guilib/guiinfo/SystemGUIInfo.cpp @@ -600,6 +600,9 @@ bool CSystemGUIInfo::GetBool(bool& value, const CGUIListItem *gitem, int context case SYSTEM_ISSTANDALONE: value = CServiceBroker::GetAppParams()->IsStandAlone(); return true; + case SYSTEM_ISNOSANDBOX: + value = CServiceBroker::GetAppParams()->IsNoSandbox(); + return true; case SYSTEM_IDLE_SHUTDOWN_INHIBITED: value = g_application.IsIdleShutdownInhibited(); return true; diff --git a/xbmc/guilib/guiinfo/WebGUIInfo.cpp b/xbmc/guilib/guiinfo/WebGUIInfo.cpp new file mode 100644 index 0000000000000..1399d3e127a9a --- /dev/null +++ b/xbmc/guilib/guiinfo/WebGUIInfo.cpp @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2012-2019 Team Kodi + * 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 "guilib/guiinfo/WebGUIInfo.h" + +#include "FileItem.h" +#include "ServiceBroker.h" +#include "guilib/guiinfo/GUIInfo.h" +#include "guilib/guiinfo/GUIInfoHelper.h" +#include "guilib/guiinfo/GUIInfoLabels.h" +#include "web/WebManager.h" +#include "web/windows/GUIWindowWebBrowser.h" + +using namespace KODI::GUILIB::GUIINFO; + +bool CWebGUIInfo::InitCurrentItem(CFileItem* item) +{ + return false; +} + +bool CWebGUIInfo::GetLabel(std::string& value, + const CFileItem* item, + int contextWindow, + const CGUIInfo& info, + std::string* fallback) const +{ + if (info.m_info >= WEB_CONTROL_START && info.m_info <= WEB_CONTROL_END) + { + WEB::CGUIWindowWebBrowser* window = GetWebBrowserWindow(contextWindow); + if (window) + { + switch (info.m_info) + { + case WEB_CONTROL_OPENED_ADDRESS: + value = window->OpenedAddress(); + return true; + case WEB_CONTROL_OPENED_TITLE: + value = window->OpenedTitle(); + return true; + case WEB_CONTROL_TOOLTIP: + value = window->Tooltip(); + return true; + case WEB_CONTROL_STATUS_MESSAGE: + value = window->StatusMessage(); + return true; + } + } + } + + return false; +} + +bool CWebGUIInfo::GetInt(int& value, + const CGUIListItem* item, + int contextWindow, + const CGUIInfo& info) const +{ + return false; +} + +bool CWebGUIInfo::GetBool(bool& value, + const CGUIListItem* item, + int contextWindow, + const CGUIInfo& info) const +{ + if (info.m_info >= WEB_CONTROL_START && info.m_info <= WEB_CONTROL_END) + { + WEB::CGUIWindowWebBrowser* window = + GetWebBrowserWindow(contextWindow); // true for has web control + if (window) + { + switch (info.m_info) + { + case WEB_CONTROL_IS_LOADING: + value = window->IsLoading(); + return true; + case WEB_CONTROL_CAN_GO_BACK: + value = window->CanGoBack(); + return true; + case WEB_CONTROL_CAN_GO_FORWARD: + value = window->CanGoForward(); + return true; + } + } + } + + switch (info.m_info) + { + case WEB_HAS_ADDONS: + value = CServiceBroker::GetWEBManager().HasCreatedAddons(); + return true; + case WEB_HAS_BROWSER: + value = CServiceBroker::GetWEBManager().HasBrowser(); + return true; + } + + return false; +} diff --git a/xbmc/guilib/guiinfo/WebGUIInfo.h b/xbmc/guilib/guiinfo/WebGUIInfo.h new file mode 100644 index 0000000000000..455440496fd56 --- /dev/null +++ b/xbmc/guilib/guiinfo/WebGUIInfo.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2012-2019 Team Kodi + * 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 "guilib/guiinfo/GUIInfoProvider.h" + +namespace KODI +{ +namespace GUILIB +{ +namespace GUIINFO +{ + +class CGUIInfo; + +class CWebGUIInfo : public CGUIInfoProvider +{ +public: + CWebGUIInfo() = default; + ~CWebGUIInfo() override = default; + + // KODI::GUILIB::GUIINFO::IGUIInfoProvider implementation + bool InitCurrentItem(CFileItem* item) override; + bool GetLabel(std::string& value, + const CFileItem* item, + int contextWindow, + const CGUIInfo& info, + std::string* fallback) const override; + bool GetInt(int& value, + const CGUIListItem* item, + int contextWindow, + const CGUIInfo& info) const override; + bool GetBool(bool& value, + const CGUIListItem* item, + int contextWindow, + const CGUIInfo& info) const override; + +private: +}; + +} // namespace GUIINFO +} // namespace GUILIB +} // namespace KODI diff --git a/xbmc/input/WindowTranslator.cpp b/xbmc/input/WindowTranslator.cpp index 0adb74a242a7b..ddda097307fdd 100644 --- a/xbmc/input/WindowTranslator.cpp +++ b/xbmc/input/WindowTranslator.cpp @@ -55,6 +55,8 @@ const CWindowTranslator::WindowMapByName CWindowTranslator::WindowMappingByName {"pvrchannelguide", WINDOW_DIALOG_PVR_CHANNEL_GUIDE}, {"pvrosdguide", WINDOW_DIALOG_PVR_CHANNEL_GUIDE}, // backward compatibility to v17 {"pvrosdteletext", WINDOW_DIALOG_OSD_TELETEXT}, + {"webbrowser", WINDOW_WEB_BROWSER}, + {"webbrowserfullscreen", WINDOW_WEB_BROWSER_FULLSCREEN}, {"systeminfo", WINDOW_SYSTEM_INFORMATION}, {"screencalibration", WINDOW_SCREEN_CALIBRATION}, {"systemsettings", WINDOW_SETTINGS_SYSTEM}, @@ -120,6 +122,7 @@ const CWindowTranslator::WindowMapByName CWindowTranslator::WindowMappingByName {"textviewer", WINDOW_DIALOG_TEXT_VIEWER}, {"fullscreenvideo", WINDOW_FULLSCREEN_VIDEO}, {"dialogcolorpicker", WINDOW_DIALOG_COLOR_PICKER}, + {"addoncrashreport", WINDOW_DIALOG_ADDON_CRASH_REPORTER}, // Virtual window for fullscreen radio, uses WINDOW_FULLSCREEN_VIDEO as // fallback diff --git a/xbmc/interfaces/builtins/Builtins.cpp b/xbmc/interfaces/builtins/Builtins.cpp index 856bc7042cafc..272c7234b5ffc 100644 --- a/xbmc/interfaces/builtins/Builtins.cpp +++ b/xbmc/interfaces/builtins/Builtins.cpp @@ -11,26 +11,26 @@ #include "ApplicationBuiltins.h" #include "CECBuiltins.h" #include "GUIBuiltins.h" -#include "GUIControlBuiltins.h" #include "GUIContainerBuiltins.h" +#include "GUIControlBuiltins.h" #include "LibraryBuiltins.h" #include "OpticalBuiltins.h" +#include "PVRBuiltins.h" #include "PictureBuiltins.h" #include "PlayerBuiltins.h" #include "ProfileBuiltins.h" -#include "PVRBuiltins.h" +#include "ServiceBroker.h" #include "SkinBuiltins.h" #include "SystemBuiltins.h" +#include "Util.h" #include "WeatherBuiltins.h" - -#include "ServiceBroker.h" +#include "WebBuiltins.h" #include "input/InputManager.h" #include "powermanagement/PowerTypes.h" #include "settings/Settings.h" #include "settings/SettingsComponent.h" -#include "Util.h" -#include "utils/log.h" #include "utils/StringUtils.h" +#include "utils/log.h" #if defined(TARGET_ANDROID) #include "AndroidBuiltins.h" @@ -56,6 +56,7 @@ CBuiltins::CBuiltins() RegisterCommands(); RegisterCommands(); RegisterCommands(); + RegisterCommands(); #if defined(HAVE_LIBCEC) RegisterCommands(); diff --git a/xbmc/interfaces/builtins/CMakeLists.txt b/xbmc/interfaces/builtins/CMakeLists.txt index 27785afebcc9c..aa46a1ff7756c 100644 --- a/xbmc/interfaces/builtins/CMakeLists.txt +++ b/xbmc/interfaces/builtins/CMakeLists.txt @@ -13,7 +13,8 @@ set(SOURCES AddonBuiltins.cpp PVRBuiltins.cpp SkinBuiltins.cpp SystemBuiltins.cpp - WeatherBuiltins.cpp) + WeatherBuiltins.cpp + WebBuiltins.cpp) set(HEADERS AddonBuiltins.h AndroidBuiltins.h @@ -31,7 +32,8 @@ set(HEADERS AddonBuiltins.h PVRBuiltins.h SkinBuiltins.h SystemBuiltins.h - WeatherBuiltins.h) + WeatherBuiltins.h + WebBuiltins.h) if(CORE_SYSTEM_NAME STREQUAL android) list(APPEND SOURCES AndroidBuiltins.cpp) diff --git a/xbmc/interfaces/builtins/WebBuiltins.cpp b/xbmc/interfaces/builtins/WebBuiltins.cpp new file mode 100644 index 0000000000000..0c4ef9317536b --- /dev/null +++ b/xbmc/interfaces/builtins/WebBuiltins.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2005-2019 Team Kodi + * 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 "WebBuiltins.h" + +#include "GUIUserMessages.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIWindowManager.h" +#include "input/WindowTranslator.h" +#include "utils/StringUtils.h" +#include "web/dialogs/GUIDialogFavourites.h" +#include "web/windows/GUIWindowWebBrowser.h" + +/*! \brief Send a message to a web control. + * \param params The parameters + * \details params[0] = ID of control. + * params[1] = Action name. + * params[2] = ID of window with control (optional). + */ +static int WebControlMessage(const std::vector& params) +{ + std::string paramlow(params[1]); + StringUtils::ToLower(paramlow); + int controlID = atoi(params[0].c_str()); + int windowID = (params.size() == 3) + ? CWindowTranslator::TranslateWindow(params[2]) + : CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow(); + if (paramlow == "back") + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(GUI_MSG_WEB_CONTROL_GO_BACK, windowID, + controlID); + else if (paramlow == "fwd") + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(GUI_MSG_WEB_CONTROL_GO_FWD, windowID, + controlID); + else if (paramlow == "load") + { + KODI::WEB::CGUIWindowWebBrowser* window = dynamic_cast( + CServiceBroker::GetGUI()->GetWindowManager().GetWindow(windowID)); + if (!window) + return 0; + CGUIMessage msg(GUI_MSG_WEB_CONTROL_LOAD, windowID, controlID); + msg.SetLabel(window->SelectedAddress()); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); + } + else if (paramlow == "reload") + { + CGUIMessage msg(GUI_MSG_WEB_CONTROL_LOAD, windowID, controlID); + KODI::WEB::CGUIWindowWebBrowser* window = dynamic_cast( + CServiceBroker::GetGUI()->GetWindowManager().GetWindow(windowID)); + if (window) + msg.SetLabel(window->SelectedAddress()); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); + } + else if (paramlow == "favourites") + { + std::string url = KODI::WEB::CGUIDialogWebFavourites::ShowAndGetURL(); + if (!url.empty()) + { + CGUIMessage msg(GUI_MSG_WEB_CONTROL_LOAD, windowID, controlID); + msg.SetLabel(url); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); + } + } + else if (paramlow == "addtofavourites") + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(GUI_MSG_WEB_CONTROL_ADD_TO_FAVOURITES, + windowID, controlID); + else if (paramlow == "home") + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(GUI_MSG_WEB_CONTROL_HOME, windowID, + controlID); + else if (paramlow == "settings") + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(GUI_MSG_WEB_CONTROL_SETTINGS, windowID, + controlID); + + return 0; +} + +CBuiltins::CommandMap CWebBuiltins::GetOperations() const +{ + return {{"webcontrolcmd.message", + {"Send a given message to a control within a given web control", 1, WebControlMessage}}}; +} diff --git a/xbmc/interfaces/builtins/WebBuiltins.h b/xbmc/interfaces/builtins/WebBuiltins.h new file mode 100644 index 0000000000000..d4477b70a253e --- /dev/null +++ b/xbmc/interfaces/builtins/WebBuiltins.h @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2005-2019 Team Kodi + * 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 "Builtins.h" + +//! \brief Class providing player related built-in commands. +class CWebBuiltins +{ +public: + //! \brief Returns the map of operations. + CBuiltins::CommandMap GetOperations() const; +}; diff --git a/xbmc/listproviders/DirectoryProvider.cpp b/xbmc/listproviders/DirectoryProvider.cpp index 6ee7f3ce51797..87d1e7a8eedaf 100644 --- a/xbmc/listproviders/DirectoryProvider.cpp +++ b/xbmc/listproviders/DirectoryProvider.cpp @@ -34,6 +34,7 @@ #include "video/VideoThumbLoader.h" #include "video/dialogs/GUIDialogVideoInfo.h" #include "video/windows/GUIWindowVideoBase.h" +#include "web/WebManager.h" #include #include @@ -339,6 +340,18 @@ void CDirectoryProvider::OnPVRManagerEvent(const PVR::PVREvent& event) } } +void CDirectoryProvider::OnWebManagerEvent(const KODI::WEB::WebEvent& event) +{ + std::unique_lock lock(m_section); + if (URIUtils::IsProtocol(m_currentUrl, "web")) + { + if (event == KODI::WEB::ManagerStarted || event == KODI::WEB::ManagerStopped || + event == KODI::WEB::ManagerError || event == KODI::WEB::ManagerInterrupted || + event == KODI::WEB::ManagerChanged) + m_updateState = INVALIDATED; + } +} + void CDirectoryProvider::OnFavouritesEvent(const CFavouritesService::FavouritesUpdated& event) { std::unique_lock lock(m_section); @@ -497,6 +510,8 @@ bool CDirectoryProvider::UpdateURL() CServiceBroker::GetRepositoryUpdater().Events().Subscribe(this, &CDirectoryProvider::OnAddonRepositoryEvent); CServiceBroker::GetPVRManager().Events().Subscribe(this, &CDirectoryProvider::OnPVRManagerEvent); CServiceBroker::GetFavouritesService().Events().Subscribe(this, &CDirectoryProvider::OnFavouritesEvent); + CServiceBroker::GetWEBManager().Events().Subscribe(this, + &CDirectoryProvider::OnWebManagerEvent); } return true; } diff --git a/xbmc/listproviders/DirectoryProvider.h b/xbmc/listproviders/DirectoryProvider.h index 6906bd498637f..83f09733be9f8 100644 --- a/xbmc/listproviders/DirectoryProvider.h +++ b/xbmc/listproviders/DirectoryProvider.h @@ -16,6 +16,7 @@ #include "interfaces/IAnnouncer.h" #include "threads/CriticalSection.h" #include "utils/Job.h" +#include "web/WebEvent.h" #include #include @@ -94,6 +95,7 @@ class CDirectoryProvider : void OnAddonEvent(const ADDON::AddonEvent& event); void OnAddonRepositoryEvent(const ADDON::CRepositoryUpdater::RepositoryUpdated& event); void OnPVRManagerEvent(const PVR::PVREvent& event); + void OnWebManagerEvent(const KODI::WEB::WebEvent& event); void OnFavouritesEvent(const CFavouritesService::FavouritesUpdated& event); std::string GetTarget(const CFileItem& item) const; }; diff --git a/xbmc/messaging/ApplicationMessenger.h b/xbmc/messaging/ApplicationMessenger.h index 803a8eab0fc45..a30ceb7f551fb 100644 --- a/xbmc/messaging/ApplicationMessenger.h +++ b/xbmc/messaging/ApplicationMessenger.h @@ -121,6 +121,7 @@ */ #define TMSG_GUI_DIALOG_YESNO TMSG_MASK_WINDOWMANAGER + 8 #define TMSG_GUI_DIALOG_OK TMSG_MASK_WINDOWMANAGER + 9 +#define TMSG_GUI_DIALOG_ADDON_CRASH_REPORT TMSG_MASK_WINDOWMANAGER + 10 /*! \def TMSG_GUI_PREVIOUS_WINDOW @@ -129,7 +130,7 @@ This is an alternative to TMSG_GUI_ACTIVATE_WINDOW, but it keeps all configured parameters, like startup directory. */ -#define TMSG_GUI_PREVIOUS_WINDOW TMSG_MASK_WINDOWMANAGER + 10 +#define TMSG_GUI_PREVIOUS_WINDOW TMSG_MASK_WINDOWMANAGER + 11 #define TMSG_CALLBACK 800 diff --git a/xbmc/messaging/helpers/CMakeLists.txt b/xbmc/messaging/helpers/CMakeLists.txt index 288ba7cc3e00e..dc118dbb44bd3 100644 --- a/xbmc/messaging/helpers/CMakeLists.txt +++ b/xbmc/messaging/helpers/CMakeLists.txt @@ -1,7 +1,9 @@ -set(SOURCES DialogHelper.cpp +set(SOURCES DialogCrashReporter.cpp + DialogHelper.cpp DialogOKHelper.cpp) -set(HEADERS DialogHelper.h +set(HEADERS DialogCrashReporter.h + DialogHelper.h DialogOKHelper.h) core_add_library(messagingHelpers) diff --git a/xbmc/messaging/helpers/DialogCrashReporter.cpp b/xbmc/messaging/helpers/DialogCrashReporter.cpp new file mode 100644 index 0000000000000..450ae25693c84 --- /dev/null +++ b/xbmc/messaging/helpers/DialogCrashReporter.cpp @@ -0,0 +1,35 @@ +/* + * 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 "DialogCrashReporter.h" + +#include "ServiceBroker.h" +#include "messaging/ApplicationMessenger.h" + +namespace KODI +{ +namespace MESSAGING +{ +namespace HELPERS +{ + +void ShowReportCrashDialog(std::string addon, + std::string uuid, + std::string stacktrace) +{ + DialogCrashReportMessage* options = new DialogCrashReportMessage; + options->addon = std::move(addon); + options->uuid = std::move(uuid); + options->stacktrace = std::move(stacktrace); + + CServiceBroker::GetAppMessenger()->PostMsg(TMSG_GUI_DIALOG_ADDON_CRASH_REPORT, -1, -1, static_cast(options)); +} + +} // namespace HELPERS +} // namespace MESSAGING +} // namespace KODI diff --git a/xbmc/messaging/helpers/DialogCrashReporter.h b/xbmc/messaging/helpers/DialogCrashReporter.h new file mode 100644 index 0000000000000..945bbb02cd830 --- /dev/null +++ b/xbmc/messaging/helpers/DialogCrashReporter.h @@ -0,0 +1,37 @@ +/* + * 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 "utils/Variant.h" + +#include +#include + +namespace KODI +{ +namespace MESSAGING +{ +namespace HELPERS +{ + +struct DialogCrashReportMessage +{ + std::string addon; + std::string uuid; + std::string stacktrace; +}; + +void ShowReportCrashDialog(std::string addon, + std::string uuid, + std::string stacktrace); + +} // namespace HELPERS +} // namespace MESSAGING +} // namespace KODI + diff --git a/xbmc/network/GUIDialogNetworkSetup.cpp b/xbmc/network/GUIDialogNetworkSetup.cpp index c908cd9300501..63f5f80a8691e 100644 --- a/xbmc/network/GUIDialogNetworkSetup.cpp +++ b/xbmc/network/GUIDialogNetworkSetup.cpp @@ -439,7 +439,7 @@ void CGUIDialogNetworkSetup::UpdateAvailableProtocols() m_protocols.emplace_back(Protocol{true, true, true, false, true, 0, "smb", 20171, ""}); #endif // protocols from vfs addon next - if (CServiceBroker::IsBinaryAddonCacheUp()) + if (CServiceBroker::IsAddonInterfaceUp()) { for (const auto& addon : CServiceBroker::GetVFSAddonCache().GetAddonInstances()) { diff --git a/xbmc/peripherals/addons/PeripheralAddon.cpp b/xbmc/peripherals/addons/PeripheralAddon.cpp index a49415bb75aae..6fee234926957 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" @@ -49,7 +50,7 @@ using namespace XFILE; #endif CPeripheralAddon::CPeripheralAddon(const ADDON::AddonInfoPtr& addonInfo, CPeripherals& manager) - : IAddonInstanceHandler(ADDON_INSTANCE_PERIPHERAL, addonInfo), + : IInstanceHandler(this, ADDON_INSTANCE_PERIPHERAL, addonInfo), m_manager(manager), m_bSupportsJoystickRumble(false), m_bSupportsJoystickPowerOff(false) @@ -58,57 +59,21 @@ 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_ifc.peripheral = new AddonInstance_Peripheral; - m_ifc.peripheral->props = new AddonProps_Peripheral(); - m_ifc.peripheral->toAddon = new KodiToAddonFuncTable_Peripheral(); - m_ifc.peripheral->toKodi = new AddonToKodiFuncTable_Peripheral(); - - ResetProperties(); } CPeripheralAddon::~CPeripheralAddon(void) { DestroyAddon(); - - if (m_ifc.peripheral) - { - delete m_ifc.peripheral->toAddon; - delete m_ifc.peripheral->toKodi; - delete m_ifc.peripheral->props; - } - delete m_ifc.peripheral; -} - -void CPeripheralAddon::ResetProperties(void) -{ - // Initialise members - m_strUserPath = CSpecialProtocol::TranslatePath(Profile()); - m_strClientPath = CSpecialProtocol::TranslatePath(Path()); - - m_ifc.peripheral->props->user_path = m_strUserPath.c_str(); - m_ifc.peripheral->props->addon_path = m_strClientPath.c_str(); - - m_ifc.peripheral->toKodi->kodiInstance = this; - m_ifc.peripheral->toKodi->feature_count = cb_feature_count; - m_ifc.peripheral->toKodi->feature_type = cb_feature_type; - m_ifc.peripheral->toKodi->refresh_button_maps = cb_refresh_button_maps; - m_ifc.peripheral->toKodi->trigger_scan = cb_trigger_scan; - - memset(m_ifc.peripheral->toAddon, 0, sizeof(KodiToAddonFuncTable_Peripheral)); } bool CPeripheralAddon::CreateAddon(void) { std::unique_lock 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__, @@ -151,7 +116,8 @@ bool CPeripheralAddon::GetAddonProperties(void) PERIPHERAL_CAPABILITIES addonCapabilities = {}; // Get the capabilities - m_ifc.peripheral->toAddon->get_capabilities(m_ifc.peripheral, &addonCapabilities); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_get_capabilities_v1( + m_instance, &addonCapabilities); // Verify capabilities against addon.xml if (m_bProvidesJoysticks != addonCapabilities.provides_joysticks) @@ -359,22 +325,20 @@ 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; std::shared_lock lock(m_dllSection); - if (!m_ifc.peripheral->toAddon->perform_device_scan) - return false; - - LogError(retVal = m_ifc.peripheral->toAddon->perform_device_scan(m_ifc.peripheral, - &peripheralCount, &pScanResults), + LogError(retVal = + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_perform_device_scan_v1( + m_instance, &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); @@ -399,7 +363,8 @@ bool CPeripheralAddon::PerformDeviceScan(PeripheralScanResults& results) results.m_results.push_back(result); } - m_ifc.peripheral->toAddon->free_scan_results(m_ifc.peripheral, peripheralCount, pScanResults); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_free_scan_results_v1( + m_instance, pScanResults, peripheralCount); return true; } @@ -414,19 +379,17 @@ bool CPeripheralAddon::ProcessEvents(void) std::shared_lock lock(m_dllSection); - if (!m_ifc.peripheral->toAddon->get_events) - return false; - PERIPHERAL_ERROR retVal; - unsigned int eventCount = 0; + size_t eventCount = 0; PERIPHERAL_EVENT* pEvents = nullptr; - LogError(retVal = m_ifc.peripheral->toAddon->get_events(m_ifc.peripheral, &eventCount, &pEvents), + LogError(retVal = m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_get_events_v1( + m_instance, &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()); @@ -476,7 +439,8 @@ bool CPeripheralAddon::ProcessEvents(void) std::static_pointer_cast(it.second)->OnInputFrame(); } - m_ifc.peripheral->toAddon->free_events(m_ifc.peripheral, eventCount, pEvents); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_free_events_v1( + m_instance, pEvents, eventCount); return true; } @@ -493,9 +457,6 @@ bool CPeripheralAddon::SendRumbleEvent(unsigned int peripheralIndex, std::shared_lock lock(m_dllSection); - if (!m_ifc.peripheral->toAddon->send_event) - return false; - PERIPHERAL_EVENT eventStruct = {}; eventStruct.peripheral_index = peripheralIndex; @@ -503,7 +464,8 @@ bool CPeripheralAddon::SendRumbleEvent(unsigned int peripheralIndex, eventStruct.driver_index = driverIndex; eventStruct.motor_state = magnitude; - return m_ifc.peripheral->toAddon->send_event(m_ifc.peripheral, &eventStruct); + return m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_send_event_v1(m_instance, + &eventStruct); } bool CPeripheralAddon::GetJoystickProperties(unsigned int index, CPeripheralJoystick& joystick) @@ -513,22 +475,21 @@ bool CPeripheralAddon::GetJoystickProperties(unsigned int index, CPeripheralJoys std::shared_lock lock(m_dllSection); - if (!m_ifc.peripheral->toAddon->get_joystick_info) - return false; - PERIPHERAL_ERROR retVal; JOYSTICK_INFO joystickStruct; - LogError(retVal = m_ifc.peripheral->toAddon->get_joystick_info(m_ifc.peripheral, index, - &joystickStruct), + LogError(retVal = + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_get_joystick_info_v1( + m_instance, index, &joystickStruct), "GetJoystickInfo()"); if (retVal == PERIPHERAL_NO_ERROR) { kodi::addon::Joystick addonJoystick(joystickStruct); SetJoystickInfo(joystick, addonJoystick); - m_ifc.peripheral->toAddon->free_joystick_info(m_ifc.peripheral, &joystickStruct); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_free_joystick_info_v1( + m_instance, &joystickStruct); return true; } @@ -545,9 +506,6 @@ bool CPeripheralAddon::GetFeatures(const CPeripheral* device, std::shared_lock lock(m_dllSection); - if (!m_ifc.peripheral->toAddon->get_features) - return false; - PERIPHERAL_ERROR retVal; kodi::addon::Joystick joystickInfo; @@ -556,26 +514,26 @@ 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_ifc.peripheral->toAddon->get_features(m_ifc.peripheral, &joystickStruct, - strControllerId.c_str(), &featureCount, - &pFeatures), + LogError(retVal = m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_get_features_v1( + m_instance, &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_ifc.peripheral->toAddon->free_features(m_ifc.peripheral, featureCount, pFeatures); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_free_features_v1( + m_instance, pFeatures, featureCount); return true; } @@ -592,9 +550,6 @@ bool CPeripheralAddon::MapFeature(const CPeripheral* device, std::shared_lock lock(m_dllSection); - if (!m_ifc.peripheral->toAddon->map_features) - return false; - PERIPHERAL_ERROR retVal; kodi::addon::Joystick joystickInfo; @@ -606,8 +561,8 @@ bool CPeripheralAddon::MapFeature(const CPeripheral* device, JOYSTICK_FEATURE addonFeature; feature.ToStruct(addonFeature); - LogError(retVal = m_ifc.peripheral->toAddon->map_features( - m_ifc.peripheral, &joystickStruct, strControllerId.c_str(), 1, &addonFeature), + LogError(retVal = m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_map_features_v1( + m_instance, &joystickStruct, strControllerId.c_str(), &addonFeature, 1), "MapFeatures()"); kodi::addon::Joystick::FreeStruct(joystickStruct); @@ -623,9 +578,6 @@ bool CPeripheralAddon::GetIgnoredPrimitives(const CPeripheral* device, Primitive std::shared_lock lock(m_dllSection); - if (!m_ifc.peripheral->toAddon->get_ignored_primitives) - return false; - PERIPHERAL_ERROR retVal; kodi::addon::Joystick joystickInfo; @@ -634,21 +586,24 @@ 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_ifc.peripheral->toAddon->get_ignored_primitives( - m_ifc.peripheral, &joystickStruct, &primitiveCount, &pPrimitives), - "GetIgnoredPrimitives()"); + LogError( + retVal = + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_get_ignored_primitives_v1( + m_instance, &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_ifc.peripheral->toAddon->free_primitives(m_ifc.peripheral, primitiveCount, pPrimitives); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_free_primitives_v1( + m_instance, pPrimitives, primitiveCount); return true; } @@ -664,9 +619,6 @@ bool CPeripheralAddon::SetIgnoredPrimitives(const CPeripheral* device, std::shared_lock lock(m_dllSection); - if (!m_ifc.peripheral->toAddon->set_ignored_primitives) - return false; - PERIPHERAL_ERROR retVal; kodi::addon::Joystick joystickInfo; @@ -677,14 +629,16 @@ 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_ifc.peripheral->toAddon->set_ignored_primitives( - m_ifc.peripheral, &joystickStruct, primitiveCount, addonPrimitives), - "SetIgnoredPrimitives()"); + LogError( + retVal = + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_set_ignored_primitives_v1( + m_instance, &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; } @@ -696,16 +650,14 @@ void CPeripheralAddon::SaveButtonMap(const CPeripheral* device) std::shared_lock lock(m_dllSection); - if (!m_ifc.peripheral->toAddon->save_button_map) - return; - kodi::addon::Joystick joystickInfo; GetJoystickInfo(device, joystickInfo); JOYSTICK_INFO joystickStruct; joystickInfo.ToStruct(joystickStruct); - m_ifc.peripheral->toAddon->save_button_map(m_ifc.peripheral, &joystickStruct); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_save_button_map_v1(m_instance, + &joystickStruct); kodi::addon::Joystick::FreeStruct(joystickStruct); @@ -720,16 +672,14 @@ void CPeripheralAddon::RevertButtonMap(const CPeripheral* device) std::shared_lock lock(m_dllSection); - if (!m_ifc.peripheral->toAddon->revert_button_map) - return; - kodi::addon::Joystick joystickInfo; GetJoystickInfo(device, joystickInfo); JOYSTICK_INFO joystickStruct; joystickInfo.ToStruct(joystickStruct); - m_ifc.peripheral->toAddon->revert_button_map(m_ifc.peripheral, &joystickStruct); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_revert_button_map_v1( + m_instance, &joystickStruct); kodi::addon::Joystick::FreeStruct(joystickStruct); } @@ -745,8 +695,8 @@ void CPeripheralAddon::ResetButtonMap(const CPeripheral* device, const std::stri JOYSTICK_INFO joystickStruct; joystickInfo.ToStruct(joystickStruct); - m_ifc.peripheral->toAddon->reset_button_map(m_ifc.peripheral, &joystickStruct, - strControllerId.c_str()); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_reset_button_map_v1( + m_instance, &joystickStruct, strControllerId.c_str()); kodi::addon::Joystick::FreeStruct(joystickStruct); @@ -764,10 +714,8 @@ void CPeripheralAddon::PowerOffJoystick(unsigned int index) std::shared_lock lock(m_dllSection); - if (!m_ifc.peripheral->toAddon->power_off_joystick) - return; - - m_ifc.peripheral->toAddon->power_off_joystick(m_ifc.peripheral, index); + m_ifc->kodi_addoninstance_peripheral_h->kodi_addon_peripheral_power_off_joystick_v1(m_instance, + index); } void CPeripheralAddon::RegisterButtonMap(CPeripheral* device, IButtonMap* buttonMap) @@ -804,7 +752,8 @@ 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) { std::unique_lock lock(m_buttonMapMutex); @@ -933,41 +882,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 ef8ed65d96e46..f10bd5fcc19e2 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::IInstanceHandler { 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; diff --git a/xbmc/pictures/PictureInfoTag.cpp b/xbmc/pictures/PictureInfoTag.cpp index 7f2ad563d8521..bda50ec1da716 100644 --- a/xbmc/pictures/PictureInfoTag.cpp +++ b/xbmc/pictures/PictureInfoTag.cpp @@ -132,7 +132,7 @@ bool CPictureInfoTag::Load(const std::string &path) // Get file extensions to find addon related to it. std::string strExtension = URIUtils::GetExtension(path); StringUtils::ToLower(strExtension); - if (!strExtension.empty() && CServiceBroker::IsBinaryAddonCacheUp()) + if (!strExtension.empty() && CServiceBroker::IsAddonInterfaceUp()) { // Load via available image decoder addons auto addonInfos = CServiceBroker::GetExtsMimeSupportList().GetExtensionSupportedAddonInfos( diff --git a/xbmc/pvr/addons/PVRClient.cpp b/xbmc/pvr/addons/PVRClient.cpp index 31328c06935b1..5109e0861664b 100644 --- a/xbmc/pvr/addons/PVRClient.cpp +++ b/xbmc/pvr/addons/PVRClient.cpp @@ -54,6 +54,7 @@ extern "C" } using namespace ADDON; +using namespace KODI::ADDONS::INTERFACE; namespace PVR { @@ -63,29 +64,14 @@ namespace PVR CPVRClient::CPVRClient(const ADDON::AddonInfoPtr& addonInfo, ADDON::AddonInstanceId instanceId, int clientId) - : IAddonInstanceHandler(ADDON_INSTANCE_PVR, addonInfo, instanceId), m_iClientId(clientId) + : IInstanceHandler(this, ADDON_INSTANCE_PVR, addonInfo, instanceId), m_iClientId(clientId) { - // Create all interface parts independent to make API changes easier if - // something is added - m_ifc.pvr = new AddonInstance_PVR; - m_ifc.pvr->props = new AddonProperties_PVR(); - m_ifc.pvr->toKodi = new AddonToKodiFuncTable_PVR(); - m_ifc.pvr->toAddon = new KodiToAddonFuncTable_PVR(); - ResetProperties(); } CPVRClient::~CPVRClient() { Destroy(); - - if (m_ifc.pvr) - { - delete m_ifc.pvr->props; - delete m_ifc.pvr->toKodi; - delete m_ifc.pvr->toAddon; - } - delete m_ifc.pvr; } void CPVRClient::StopRunningInstance() @@ -130,38 +116,6 @@ void CPVRClient::ResetProperties() m_menuhooks.reset(); m_timertypes.clear(); m_clientCapabilities.clear(); - - m_ifc.pvr->props->strUserPath = m_strUserPath.c_str(); - m_ifc.pvr->props->strClientPath = m_strClientPath.c_str(); - m_ifc.pvr->props->iEpgMaxPastDays = - CServiceBroker::GetPVRManager().EpgContainer().GetPastDaysToDisplay(); - m_ifc.pvr->props->iEpgMaxFutureDays = - CServiceBroker::GetPVRManager().EpgContainer().GetFutureDaysToDisplay(); - - m_ifc.pvr->toKodi->kodiInstance = this; - m_ifc.pvr->toKodi->TransferEpgEntry = cb_transfer_epg_entry; - m_ifc.pvr->toKodi->TransferChannelEntry = cb_transfer_channel_entry; - m_ifc.pvr->toKodi->TransferProviderEntry = cb_transfer_provider_entry; - m_ifc.pvr->toKodi->TransferTimerEntry = cb_transfer_timer_entry; - m_ifc.pvr->toKodi->TransferRecordingEntry = cb_transfer_recording_entry; - m_ifc.pvr->toKodi->AddMenuHook = cb_add_menu_hook; - m_ifc.pvr->toKodi->RecordingNotification = cb_recording_notification; - m_ifc.pvr->toKodi->TriggerChannelUpdate = cb_trigger_channel_update; - m_ifc.pvr->toKodi->TriggerProvidersUpdate = cb_trigger_provider_update; - m_ifc.pvr->toKodi->TriggerChannelGroupsUpdate = cb_trigger_channel_groups_update; - m_ifc.pvr->toKodi->TriggerTimerUpdate = cb_trigger_timer_update; - m_ifc.pvr->toKodi->TriggerRecordingUpdate = cb_trigger_recording_update; - m_ifc.pvr->toKodi->TriggerEpgUpdate = cb_trigger_epg_update; - m_ifc.pvr->toKodi->FreeDemuxPacket = cb_free_demux_packet; - m_ifc.pvr->toKodi->AllocateDemuxPacket = cb_allocate_demux_packet; - m_ifc.pvr->toKodi->TransferChannelGroup = cb_transfer_channel_group; - m_ifc.pvr->toKodi->TransferChannelGroupMember = cb_transfer_channel_group_member; - m_ifc.pvr->toKodi->ConnectionStateChange = cb_connection_state_change; - m_ifc.pvr->toKodi->EpgEventStateChange = cb_epg_event_state_change; - m_ifc.pvr->toKodi->GetCodecByName = cb_get_codec_by_name; - - // Clear function addresses to have NULL if not set by addon - memset(m_ifc.pvr->toAddon, 0, sizeof(KodiToAddonFuncTable_PVR)); } ADDON_STATUS CPVRClient::Create() @@ -445,8 +399,10 @@ 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); @@ -456,8 +412,10 @@ 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); @@ -467,9 +425,10 @@ bool CPVRClient::GetAddonProperties() /* get the connection string */ retVal = DoAddonCall( __func__, - [&strConnectionString](const AddonInstance* addon) { - return addon->toAddon->GetConnectionString(addon, strConnectionString, - sizeof(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); @@ -484,9 +443,10 @@ bool CPVRClient::GetAddonProperties() /* backend version number */ retVal = DoAddonCall( __func__, - [&strBackendVersion](const AddonInstance* addon) { - return addon->toAddon->GetBackendVersion(addon, strBackendVersion, - sizeof(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); @@ -496,9 +456,10 @@ bool CPVRClient::GetAddonProperties() /* backend hostname */ retVal = DoAddonCall( __func__, - [&strBackendHostname](const AddonInstance* addon) { - return addon->toAddon->GetBackendHostname(addon, strBackendHostname, - sizeof(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); @@ -508,12 +469,14 @@ 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) { @@ -573,7 +536,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) { @@ -635,24 +598,30 @@ PVR_ERROR CPVRClient::GetDriveSpace(uint64_t& iTotal, uint64_t& iUsed) iTotal = 0; iUsed = 0; - return DoAddonCall(__func__, [&iTotal, &iUsed](const AddonInstance* addon) { - uint64_t iTotalSpace = 0; - uint64_t iUsedSpace = 0; - PVR_ERROR error = addon->toAddon->GetDriveSpace(addon, &iTotalSpace, &iUsedSpace); - if (error == PVR_ERROR_NO_ERROR) - { - iTotal = iTotalSpace; - iUsed = iUsedSpace; - } - return error; - }); + return DoAddonCall(__func__, + [this, &iTotal, &iUsed](KODI_ADDON_PVR_HDL addon) + { + uint64_t iTotalSpace = 0; + uint64_t iUsedSpace = 0; + 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; + iUsed = iUsedSpace; + } + return error; + }); } 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()); } @@ -660,10 +629,12 @@ 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()); } @@ -672,10 +643,12 @@ 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()); } @@ -684,10 +657,12 @@ 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()); } @@ -696,12 +671,14 @@ 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()); } @@ -710,17 +687,14 @@ PVR_ERROR CPVRClient::GetEPGForChannel(int iChannelUid, CPVREpg* epg, time_t sta { return DoAddonCall( __func__, - [this, iChannelUid, epg, start, end](const AddonInstance* addon) { - PVR_HANDLE_STRUCT handle = {}; - handle.callerAddress = this; - handle.dataAddress = epg; - + [this, iChannelUid, epg, start, end](KODI_ADDON_PVR_HDL addon) + { int iPVRTimeCorrection = CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_iPVRTimeCorrection; - return addon->toAddon->GetEPGForChannel(addon, &handle, iChannelUid, - start ? start - iPVRTimeCorrection : 0, - end ? end - iPVRTimeCorrection : 0); + 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); }, m_clientCapabilities.SupportsEPG()); } @@ -729,8 +703,10 @@ 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()); } @@ -739,8 +715,10 @@ 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()); } @@ -831,9 +809,11 @@ 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()); } @@ -843,9 +823,11 @@ 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()); } @@ -863,20 +845,24 @@ 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) { - CAddonEpgTag addonTag(tag); + return DoAddonCall( + __func__, + [this, &tag, &props](KODI_ADDON_PVR_HDL addon) + { + CAddonEpgTag addonTag(tag); - unsigned int iPropertyCount = STREAM_MAX_PROPERTY_COUNT; - std::unique_ptr properties(new PVR_NAMED_VALUE[iPropertyCount]); - memset(properties.get(), 0, iPropertyCount * sizeof(PVR_NAMED_VALUE)); + 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(), - &iPropertyCount); - if (error == PVR_ERROR_NO_ERROR) - WriteStreamProperties(properties.get(), iPropertyCount, props); + 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); - return error; - }); + return error; + }); } PVR_ERROR CPVRClient::GetEpgTagEdl(const std::shared_ptr& epgTag, @@ -885,16 +871,18 @@ 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; @@ -907,79 +895,86 @@ 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()); } PVR_ERROR CPVRClient::GetChannelGroups(CPVRChannelGroups* groups) { - return DoAddonCall(__func__, - [this, groups](const AddonInstance* addon) { - PVR_HANDLE_STRUCT handle = {}; - handle.callerAddress = this; - handle.dataAddress = groups; - return addon->toAddon->GetChannelGroups(addon, &handle, groups->IsRadio()); - }, - m_clientCapabilities.SupportsChannelGroups()); + return DoAddonCall( + __func__, + [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()); } PVR_ERROR CPVRClient::GetChannelGroupMembers( CPVRChannelGroup* group, std::vector>& groupMembers) { - return DoAddonCall(__func__, - [this, group, &groupMembers](const AddonInstance* addon) { - PVR_HANDLE_STRUCT handle = {}; - handle.callerAddress = this; - handle.dataAddress = &groupMembers; - - PVR_CHANNEL_GROUP tag; - WriteClientGroupInfo(*group, tag); - return addon->toAddon->GetChannelGroupMembers(addon, &handle, &tag); - }, - m_clientCapabilities.SupportsChannelGroups()); + return DoAddonCall( + __func__, + [this, group, &groupMembers](KODI_ADDON_PVR_HDL addon) + { + PVR_CHANNEL_GROUP tag; + WriteClientGroupInfo(*group, tag); + return m_ifc->kodi_addoninstance_pvr_h->kodi_addon_pvr_get_channel_group_members_v1( + addon, group, &tag); + }, + m_clientCapabilities.SupportsChannelGroups()); } 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) { - PVR_HANDLE_STRUCT handle = {}; - handle.callerAddress = this; - handle.dataAddress = &providers; - return addon->toAddon->GetProviders(addon, &handle); - }, - m_clientCapabilities.SupportsProviders()); + 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()); } 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); + }); } PVR_ERROR CPVRClient::GetChannels(bool radio, std::vector>& channels) { - return DoAddonCall(__func__, - [this, radio, &channels](const AddonInstance* addon) { - PVR_HANDLE_STRUCT handle = {}; - handle.callerAddress = this; - handle.dataAddress = &channels; - return addon->toAddon->GetChannels(addon, &handle, radio); - }, - (radio && m_clientCapabilities.SupportsRadio()) || - (!radio && m_clientCapabilities.SupportsTV())); + return DoAddonCall( + __func__, + [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())); } PVR_ERROR CPVRClient::GetRecordingsAmount(bool deleted, int& iRecordings) @@ -987,8 +982,10 @@ 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())); @@ -996,25 +993,26 @@ PVR_ERROR CPVRClient::GetRecordingsAmount(bool deleted, int& iRecordings) PVR_ERROR CPVRClient::GetRecordings(CPVRRecordings* results, bool deleted) { - return DoAddonCall(__func__, - [this, results, deleted](const AddonInstance* addon) { - PVR_HANDLE_STRUCT handle = {}; - handle.callerAddress = this; - handle.dataAddress = results; - return addon->toAddon->GetRecordings(addon, &handle, deleted); - }, - m_clientCapabilities.SupportsRecordings() && - (!deleted || m_clientCapabilities.SupportsRecordingsUndelete())); + return DoAddonCall( + __func__, + [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())); } 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()); } @@ -1023,10 +1021,11 @@ 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()); } @@ -1035,8 +1034,10 @@ 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()); } @@ -1045,10 +1046,11 @@ 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()); } @@ -1057,10 +1059,12 @@ 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()); } @@ -1069,10 +1073,12 @@ 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()); } @@ -1082,10 +1088,12 @@ 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()); } @@ -1095,10 +1103,12 @@ 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()); } @@ -1109,17 +1119,19 @@ 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; @@ -1131,10 +1143,12 @@ 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()); } @@ -1144,32 +1158,31 @@ 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()); } PVR_ERROR CPVRClient::GetTimers(CPVRTimersContainer* results) { - return DoAddonCall(__func__, - [this, results](const AddonInstance* addon) { - PVR_HANDLE_STRUCT handle = {}; - handle.callerAddress = this; - handle.dataAddress = results; - return addon->toAddon->GetTimers(addon, &handle); - }, - m_clientCapabilities.SupportsTimers()); + return DoAddonCall( + __func__, + [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()); } 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()); } @@ -1178,10 +1191,11 @@ 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()); } @@ -1190,10 +1204,11 @@ 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()); } @@ -1205,93 +1220,24 @@ 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); + }); } PVR_ERROR CPVRClient::GetDescrambleInfo(int channelUid, PVR_DESCRAMBLE_INFO& descrambleinfo) const { 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()); } @@ -1299,98 +1245,55 @@ 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) { - if (!CanPlayChannel(channel)) - return PVR_ERROR_NO_ERROR; // no error, but no need to obtain the values from the 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); + PVR_CHANNEL tag = {}; + WriteClientChannelInfo(channel, tag); - unsigned int iPropertyCount = STREAM_MAX_PROPERTY_COUNT; - std::unique_ptr properties(new PVR_NAMED_VALUE[iPropertyCount]); - memset(properties.get(), 0, iPropertyCount * sizeof(PVR_NAMED_VALUE)); + 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); - if (error == PVR_ERROR_NO_ERROR) - WriteStreamProperties(properties.get(), iPropertyCount, props); + PVR_ERROR error = + 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); - return error; - }); + return error; + }); } PVR_ERROR CPVRClient::GetRecordingStreamProperties(const std::shared_ptr& recording, CPVRStreamProperties& props) -{ - return DoAddonCall(__func__, [this, &recording, &props](const AddonInstance* 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; - 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(), - &iPropertyCount); - if (error == PVR_ERROR_NO_ERROR) - WriteStreamProperties(properties.get(), iPropertyCount, props); - - return error; - }); -} - -PVR_ERROR CPVRClient::GetStreamProperties(PVR_STREAM_PROPERTIES* props) -{ - return DoAddonCall(__func__, [&props](const AddonInstance* addon) { - return addon->toAddon->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()); -} + [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_ERROR CPVRClient::DemuxAbort() -{ - return DoAddonCall( - __func__, - [](const AddonInstance* addon) { - addon->toAddon->DemuxAbort(addon); - return PVR_ERROR_NO_ERROR; - }, - m_clientCapabilities.HandlesDemuxing()); -} + PVR_RECORDING tag = {}; + WriteClientRecordingInfo(*recording, tag); -PVR_ERROR CPVRClient::DemuxFlush() -{ - return DoAddonCall( - __func__, - [](const AddonInstance* addon) { - addon->toAddon->DemuxFlush(addon); - return PVR_ERROR_NO_ERROR; - }, - m_clientCapabilities.HandlesDemuxing()); -} + 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 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()); + 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); + + return error; + }); } const char* CPVRClient::ToString(const PVR_ERROR error) @@ -1421,10 +1324,11 @@ const char* CPVRClient::ToString(const PVR_ERROR error) } } -PVR_ERROR CPVRClient::DoAddonCall(const char* strFunctionName, - const std::function& function, - bool bIsImplemented /* = true */, - bool bCheckReadyToUse /* = true */) const +PVR_ERROR CPVRClient::DoAddonCall( + const char* strFunctionName, + const std::function& function, + bool bIsImplemented /* = true */, + bool bCheckReadyToUse /* = true */) const { // Check preconditions. if (!bIsImplemented) @@ -1454,7 +1358,7 @@ PVR_ERROR CPVRClient::DoAddonCall(const char* strFunctionName, m_allAddonCallsFinished.Reset(); m_iAddonCalls++; - const PVR_ERROR error = function(m_ifc.pvr); + const PVR_ERROR error = function(m_instance); m_iAddonCalls--; if (m_iAddonCalls == 0) @@ -1474,148 +1378,37 @@ 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 '{}'", ID(), - 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); + }); } std::shared_ptr CPVRClient::GetMenuHooks() @@ -1629,77 +1422,96 @@ 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) { - CAddonEpgTag addonTag(tag); + return DoAddonCall(__func__, + [this, &hook, &tag](KODI_ADDON_PVR_HDL addon) + { + CAddonEpgTag addonTag(tag); - PVR_MENUHOOK menuHook; - menuHook.category = PVR_MENUHOOK_EPG; - menuHook.iHookId = hook.GetId(); - menuHook.iLocalizedStringId = hook.GetLabelId(); + PVR_MENUHOOK menuHook; + menuHook.category = PVR_MENUHOOK_EPG; + 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) { - PVR_CHANNEL tag; - WriteClientChannelInfo(channel, tag); + return DoAddonCall( + __func__, + [this, &hook, &channel](KODI_ADDON_PVR_HDL addon) + { + PVR_CHANNEL tag; + WriteClientChannelInfo(channel, tag); - PVR_MENUHOOK menuHook; - menuHook.category = PVR_MENUHOOK_CHANNEL; - menuHook.iHookId = hook.GetId(); - menuHook.iLocalizedStringId = hook.GetLabelId(); + PVR_MENUHOOK menuHook; + menuHook.category = PVR_MENUHOOK_CHANNEL; + 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); + }); } PVR_ERROR CPVRClient::CallRecordingMenuHook(const CPVRClientMenuHook& hook, const std::shared_ptr& recording, bool bDeleted) { - return DoAddonCall(__func__, [&hook, &recording, &bDeleted](const AddonInstance* addon) { - PVR_RECORDING tag; - WriteClientRecordingInfo(*recording, tag); + return DoAddonCall( + __func__, + [this, &hook, &recording, &bDeleted](KODI_ADDON_PVR_HDL addon) + { + PVR_RECORDING tag; + WriteClientRecordingInfo(*recording, tag); - PVR_MENUHOOK menuHook; - menuHook.category = bDeleted ? PVR_MENUHOOK_DELETED_RECORDING : PVR_MENUHOOK_RECORDING; - menuHook.iHookId = hook.GetId(); - menuHook.iLocalizedStringId = hook.GetLabelId(); + PVR_MENUHOOK menuHook; + menuHook.category = bDeleted ? PVR_MENUHOOK_DELETED_RECORDING : PVR_MENUHOOK_RECORDING; + 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) { - PVR_TIMER tag; - WriteClientTimerInfo(*timer, tag); + return DoAddonCall( + __func__, + [this, &hook, &timer](KODI_ADDON_PVR_HDL addon) + { + PVR_TIMER tag; + WriteClientTimerInfo(*timer, tag); - PVR_MENUHOOK menuHook; - menuHook.category = PVR_MENUHOOK_TIMER; - menuHook.iHookId = hook.GetId(); - menuHook.iLocalizedStringId = hook.GetLabelId(); + PVR_MENUHOOK menuHook; + menuHook.category = PVR_MENUHOOK_TIMER; + 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) { - PVR_MENUHOOK menuHook; - menuHook.category = PVR_MENUHOOK_SETTING; - menuHook.iHookId = hook.GetId(); - menuHook.iLocalizedStringId = hook.GetLabelId(); + 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); + }); } void CPVRClient::SetPriority(int iPriority) @@ -1728,419 +1540,364 @@ 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::Log(LOGERROR, "{}: No instance pointer given!", strFunctionName); - return; - } - - if (!bForceCall && client->m_bBlockAddonCalls && client->m_iAddonCalls == 0) + if (!bForceCall && m_bBlockAddonCalls && m_iAddonCalls == 0) { CLog::Log(LOGWARNING, LOGPVR, "{}: Ignoring callback from PVR client '{}'", strFunctionName, - client->ID()); + ID()); return; } // Call. - function(client); + function(); } -void CPVRClient::cb_transfer_channel_group(void* kodiInstance, - const PVR_HANDLE handle, - const PVR_CHANNEL_GROUP* group) +int CPVRClient::cb_get_epg_max_future_days() { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { - if (!handle || !group) - { - CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); - return; - } - - if (strlen(group->strGroupName) == 0) - { - CLog::LogF(LOGERROR, "Empty group name"); - return; - } + int result = -1; + HandleAddonCallback(__func__, + [&]() + { + // update channels in the next iteration of the pvrmanager's main loop + result = + CServiceBroker::GetPVRManager().EpgContainer().GetFutureDaysToDisplay(); + }); + return result; +} - // transfer this entry to the groups container - CPVRChannelGroups* kodiGroups = static_cast(handle->dataAddress); - const auto transferGroup = - std::make_shared(*group, kodiGroups->GetGroupAll()); - kodiGroups->UpdateFromClient(transferGroup); - }); +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_member(void* kodiInstance, - const PVR_HANDLE handle, +void CPVRClient::cb_transfer_channel_group(const KODI_ADDON_PVR_TRANSFER_HDL handle, + const PVR_CHANNEL_GROUP* group) +{ + HandleAddonCallback(__func__, + [&]() + { + if (!handle || !group) + { + CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); + return; + } + + if (strlen(group->strGroupName) == 0) + { + CLog::LogF(LOGERROR, "Empty group name"); + return; + } + + // transfer this entry to the groups container + CPVRChannelGroups* kodiGroups = static_cast(handle); + const auto transferGroup = + std::make_shared(*group, kodiGroups->GetGroupAll()); + kodiGroups->UpdateFromClient(transferGroup); + }); +} + +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) { - if (!handle || !member) - { - CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); - return; - } + HandleAddonCallback( + __func__, + [&]() + { + if (!handle || !member) + { + CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); + return; + } - const std::shared_ptr channel = - CServiceBroker::GetPVRManager().ChannelGroups()->GetByUniqueID(member->iChannelUniqueId, - client->GetID()); - if (!channel) - { - CLog::LogF(LOGERROR, "Cannot find group '{}' or channel '{}'", member->strGroupName, - member->iChannelUniqueId); - } - else - { - auto* groupMembers = - static_cast>*>(handle->dataAddress); - groupMembers->emplace_back( - std::make_shared(-1, // real id will be added later - member->strGroupName, channel)); - } - }); + const std::shared_ptr channel = + CServiceBroker::GetPVRManager().ChannelGroups()->GetByUniqueID(member->iChannelUniqueId, + GetID()); + if (!channel) + { + CLog::LogF(LOGERROR, "Cannot find group '{}' or channel '{}'", member->strGroupName, + member->iChannelUniqueId); + } + else + { + auto* groupMembers = + static_cast>*>(handle); + groupMembers->emplace_back( + std::make_shared(-1, // real id will be added later + member->strGroupName, channel)); + } + }); } -void CPVRClient::cb_transfer_epg_entry(void* kodiInstance, - const PVR_HANDLE handle, +void CPVRClient::cb_transfer_epg_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle, const EPG_TAG* epgentry) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { - if (!handle || !epgentry) - { - CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); - return; - } + HandleAddonCallback(__func__, + [&]() + { + if (!handle || !epgentry) + { + CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); + return; + } - // transfer this entry to the epg - CPVREpg* epg = static_cast(handle->dataAddress); - epg->UpdateEntry(epgentry, client->GetID()); - }); + // transfer this entry to the epg + CPVREpg* epg = static_cast(handle); + epg->UpdateEntry(epgentry, GetID()); + }); } -void CPVRClient::cb_transfer_provider_entry(void* kodiInstance, - const PVR_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; - } - - /* transfer this entry to the internal channels group */ - std::shared_ptr transferProvider( - std::make_shared(*provider, client->GetID())); - kodiProviders->UpdateFromClient(transferProvider); -} - -void CPVRClient::cb_transfer_channel_entry(void* kodiInstance, - const PVR_HANDLE handle, + 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, GetID())); + CPVRProvidersContainer* kodiProviders = + static_cast(handle); + kodiProviders->UpdateFromClient(transferProvider); + }); +} + +void CPVRClient::cb_transfer_channel_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle, const PVR_CHANNEL* channel) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { - if (!handle || !channel) - { - CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); - return; - } + 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 PVR_HANDLE handle, +void CPVRClient::cb_transfer_recording_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle, const PVR_RECORDING* recording) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { - if (!handle || !recording) - { - CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); - return; - } + HandleAddonCallback(__func__, + [&]() + { + if (!handle || !recording) + { + CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); + return; + } - // 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); - }); + // transfer this entry to the recordings container + const std::shared_ptr transferRecording = + std::make_shared(*recording, GetID()); + CPVRRecordings* recordings = static_cast(handle); + recordings->UpdateFromClient(transferRecording, *this); + }); } -void CPVRClient::cb_transfer_timer_entry(void* kodiInstance, - const PVR_HANDLE handle, +void CPVRClient::cb_transfer_timer_entry(const KODI_ADDON_PVR_TRANSFER_HDL handle, const PVR_TIMER* timer) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { - if (!handle || !timer) - { - CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); - return; - } - - // Note: channel can be nullptr here, for instance for epg-based timer rules - // ("record on any channel" condition) - const std::shared_ptr channel = - CServiceBroker::GetPVRManager().ChannelGroups()->GetByUniqueID(timer->iClientChannelUid, - client->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); - timers->UpdateFromClient(transferTimer); - }); -} - -void CPVRClient::cb_add_menu_hook(void* kodiInstance, const PVR_MENUHOOK* hook) -{ - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { - if (!hook) - { - CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); - return; - } - - client->GetMenuHooks()->AddHook(*hook); - }); -} - -void CPVRClient::cb_recording_notification(void* kodiInstance, - const char* strName, + HandleAddonCallback(__func__, + [&]() + { + if (!handle || !timer) + { + CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); + return; + } + + // Note: channel can be nullptr here, for instance for epg-based timer rules + // ("record on any channel" condition) + const std::shared_ptr channel = + CServiceBroker::GetPVRManager().ChannelGroups()->GetByUniqueID( + timer->iClientChannelUid, GetID()); + + // transfer this entry to the timers container + const std::shared_ptr transferTimer = + std::make_shared(*timer, channel, GetID()); + CPVRTimersContainer* timers = static_cast(handle); + timers->UpdateFromClient(transferTimer); + }); +} + +void CPVRClient::cb_add_menu_hook(const PVR_MENUHOOK* hook) +{ + HandleAddonCallback(__func__, + [&]() + { + if (!hook) + { + CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); + return; + } + + GetMenuHooks()->AddHook(*hook); + }); +} + +void CPVRClient::cb_recording_notification(const char* strName, const char* strFileName, bool bOnOff) { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { - if (!strFileName) - { - CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); - return; - } + HandleAddonCallback( + __func__, + [&]() + { + if (!strFileName) + { + CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); + return; + } - const std::string strLine1 = - StringUtils::Format(g_localizeStrings.Get(bOnOff ? 19197 : 19198), client->Name()); - std::string strLine2; - if (strName) - strLine2 = strName; - else - strLine2 = strFileName; + const std::string strLine1 = + StringUtils::Format(g_localizeStrings.Get(bOnOff ? 19197 : 19198), Name()); + std::string strLine2; + if (strName) + strLine2 = strName; + else if (strFileName) + strLine2 = strFileName; - // display a notification for 5 seconds - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, strLine1, strLine2, 5000, - false); - auto eventLog = CServiceBroker::GetEventLog(); - if (eventLog) - eventLog->Add( - EventPtr(new CNotificationEvent(client->Name(), strLine1, client->Icon(), strLine2))); + // display a notification for 5 seconds + CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, strLine1, strLine2, 5000, + false); + auto eventLog = CServiceBroker::GetEventLog(); + if (eventLog) + eventLog->Add(EventPtr(new CNotificationEvent(Name(), strLine1, Icon(), strLine2))); - CLog::LogFC(LOGDEBUG, LOGPVR, "Recording {} on client '{}'. name='{}' filename='{}'", - bOnOff ? "started" : "finished", client->ID(), strName, strFileName); - }); + CLog::LogFC(LOGDEBUG, LOGPVR, "Recording {} on client '{}'. name='{}' filename='{}'", + bOnOff ? "started" : "finished", ID(), strName, strFileName); + }); } -void CPVRClient::cb_trigger_channel_update(void* kodiInstance) +void CPVRClient::cb_trigger_channel_update() { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { - // update channels in the next iteration of the pvrmanager's main loop - CServiceBroker::GetPVRManager().TriggerChannelsUpdate(client->GetID()); - }); + HandleAddonCallback(__func__, + [&]() + { + // update channels in the next iteration of the pvrmanager's main loop + CServiceBroker::GetPVRManager().TriggerChannelsUpdate(GetID()); + }); } -void CPVRClient::cb_trigger_provider_update(void* kodiInstance) +void CPVRClient::cb_trigger_provider_update() { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { - /* update the providers table in the next iteration of the pvrmanager's main loop */ - CServiceBroker::GetPVRManager().TriggerProvidersUpdate(client->GetID()); - }); + HandleAddonCallback(__func__, + [&]() + { + /* update the providers table in the next iteration of the pvrmanager's main loop */ + CServiceBroker::GetPVRManager().TriggerProvidersUpdate(GetID()); + }); } -void CPVRClient::cb_trigger_timer_update(void* kodiInstance) +void CPVRClient::cb_trigger_timer_update() { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { - // update timers in the next iteration of the pvrmanager's main loop - CServiceBroker::GetPVRManager().TriggerTimersUpdate(client->GetID()); - }); + HandleAddonCallback(__func__, + [&]() + { + // update timers in the next iteration of the pvrmanager's main loop + CServiceBroker::GetPVRManager().TriggerTimersUpdate(GetID()); + }); } -void CPVRClient::cb_trigger_recording_update(void* kodiInstance) +void CPVRClient::cb_trigger_recording_update() { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { - // update recordings in the next iteration of the pvrmanager's main loop - CServiceBroker::GetPVRManager().TriggerRecordingsUpdate(client->GetID()); - }); + HandleAddonCallback(__func__, + [&]() + { + // update recordings in the next iteration of the pvrmanager's main loop + CServiceBroker::GetPVRManager().TriggerRecordingsUpdate(GetID()); + }); } -void CPVRClient::cb_trigger_channel_groups_update(void* kodiInstance) +void CPVRClient::cb_trigger_channel_groups_update() { - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { - // update all channel groups in the next iteration of the pvrmanager's main loop - CServiceBroker::GetPVRManager().TriggerChannelGroupsUpdate(client->GetID()); - }); + HandleAddonCallback(__func__, + [&]() + { + // update all channel groups in the next iteration of the pvrmanager's main loop + CServiceBroker::GetPVRManager().TriggerChannelGroupsUpdate(GetID()); + }); } -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); - }); -} - -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; + __func__, [&]() + { CServiceBroker::GetPVRManager().EpgContainer().UpdateRequest(GetID(), iChannelUid); }); } -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) { - if (!strConnectionString) - { - CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); - return; - } - - const PVR_CONNECTION_STATE prevState(client->GetConnectionState()); - if (prevState == newState) - return; - - CLog::LogFC(LOGDEBUG, LOGPVR, - "State for connection '{}' on client '{}' changed from '{}' to '{}'", - strConnectionString, client->ID(), prevState, newState); - - client->SetConnectionState(newState); - - std::string msg; - if (strMessage) - msg = strMessage; - - CServiceBroker::GetPVRManager().ConnectionStateChange(client, std::string(strConnectionString), - newState, msg); - }); -} - -void CPVRClient::cb_epg_event_state_change(void* kodiInstance, - EPG_TAG* tag, - EPG_EVENT_STATE newState) -{ - HandleAddonCallback(__func__, kodiInstance, [&](CPVRClient* client) { - if (!tag) - { - CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); - return; - } - - // 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); - 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; + HandleAddonCallback(__func__, + [&]() + { + if (!strConnectionString) + { + CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); + return; + } + + const PVR_CONNECTION_STATE prevState(GetConnectionState()); + if (prevState == newState) + return; + + CLog::LogFC( + LOGDEBUG, LOGPVR, + "State for connection '{}' on client '{}' changed from '{}' to '{}'", + strConnectionString, ID(), prevState, newState); + + SetConnectionState(newState); + + std::string msg; + if (strMessage) + msg = strMessage; + + CServiceBroker::GetPVRManager().ConnectionStateChange( + this, std::string(strConnectionString), newState, msg); + }); +} + +void CPVRClient::cb_epg_event_state_change(EPG_TAG* tag, EPG_EVENT_STATE newState) +{ + HandleAddonCallback(__func__, + [&]() + { + if (!tag) + { + CLog::LogF(LOGERROR, "Invalid callback parameter(s)"); + return; + } + + // 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, GetID(), nullptr, -1); + CServiceBroker::GetPVRManager().EpgContainer().UpdateFromClient(epgTag, + newState); + }); } } // namespace PVR diff --git a/xbmc/pvr/addons/PVRClient.h b/xbmc/pvr/addons/PVRClient.h index ef411657e7fd5..8fcc8dcc355de 100644 --- a/xbmc/pvr/addons/PVRClient.h +++ b/xbmc/pvr/addons/PVRClient.h @@ -8,8 +8,8 @@ #pragma once -#include "addons/binary-addons/AddonInstanceHandler.h" -#include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/pvr.h" +#include "addons/interface/InstanceHandler.h" +#include "addons/interface/api/addon-instance/pvr.h" #include "pvr/addons/PVRClientCapabilities.h" #include "threads/Event.h" @@ -26,6 +26,7 @@ namespace PVR { class CPVRChannel; class CPVRChannelGroup; +class CPVRChannelGroupMember; class CPVRChannelGroups; class CPVRProvider; class CPVRProvidersContainer; @@ -47,7 +48,7 @@ class CPVRTimersContainer; * * Also translates Kodi's C++ structures to the add-on's C structures. */ -class CPVRClient : public ADDON::IAddonInstanceHandler +class CPVRClient : public KODI::ADDONS::INTERFACE::IInstanceHandler { public: CPVRClient(const ADDON::AddonInfoPtr& addonInfo, ADDON::AddonInstanceId instanceId, int clientId); @@ -342,6 +343,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 */ //@{ @@ -496,67 +513,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 length 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. @@ -566,88 +522,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 length 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. @@ -658,49 +536,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. @@ -781,117 +617,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_ifc.pvr; } - -private: - /*! - * @brief Resets all class members to their defaults, accept the client id. - */ - void ResetProperties(); - - /*! - * @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 PVR_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. @@ -899,9 +644,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 PVR_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 @@ -909,9 +654,8 @@ 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 PVR_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 @@ -919,9 +663,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 PVR_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 @@ -929,9 +673,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 PVR_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 @@ -939,9 +683,8 @@ 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 PVR_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 @@ -949,16 +692,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 PVR_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 @@ -967,62 +711,51 @@ 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 @@ -1032,10 +765,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 @@ -1045,13 +778,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, accept the client id. */ - static PVR_CODEC cb_get_codec_by_name(const void* kodiInstance, const char* strCodecName); - //@} + void ResetProperties(); + + /*! + * @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); const int m_iClientId; /*!< unique ID of the client */ std::atomic diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp index 3e1cc7e607fbb..b9c58ef28435b 100644 --- a/xbmc/settings/AdvancedSettings.cpp +++ b/xbmc/settings/AdvancedSettings.cpp @@ -417,6 +417,8 @@ void CAdvancedSettings::Initialize() m_addonPackageFolderSize = 200; + m_addonsSimulateBinaryLibAsExe = true; + m_jsonOutputCompact = true; m_jsonTcpPort = 9090; @@ -947,6 +949,12 @@ void CAdvancedSettings::ParseSettingsFile(const std::string &file) XMLUtils::GetBoolean(pRootElement,"virtualshares", m_bVirtualShares); XMLUtils::GetUInt(pRootElement, "packagefoldersize", m_addonPackageFolderSize); + pElement = pRootElement->FirstChildElement("addons"); + if (pElement) + { + XMLUtils::GetBoolean(pElement, "simulatebinarylibasexe", m_addonsSimulateBinaryLibAsExe); + } + // EPG pElement = pRootElement->FirstChildElement("epg"); if (pElement) @@ -1231,6 +1239,23 @@ void CAdvancedSettings::ParseSettingsFile(const std::string &file) XMLUtils::GetBoolean(pDatabase, "compression", m_databaseEpg.compression); } + pDatabase = pRootElement->FirstChildElement("webdatabase"); + if (pDatabase) + { + XMLUtils::GetString(pDatabase, "type", m_databaseWeb.type); + XMLUtils::GetString(pDatabase, "host", m_databaseWeb.host); + XMLUtils::GetString(pDatabase, "port", m_databaseWeb.port); + XMLUtils::GetString(pDatabase, "user", m_databaseWeb.user); + XMLUtils::GetString(pDatabase, "pass", m_databaseWeb.pass); + XMLUtils::GetString(pDatabase, "name", m_databaseWeb.name); + XMLUtils::GetString(pDatabase, "key", m_databaseWeb.key); + XMLUtils::GetString(pDatabase, "cert", m_databaseWeb.cert); + XMLUtils::GetString(pDatabase, "ca", m_databaseWeb.ca); + XMLUtils::GetString(pDatabase, "capath", m_databaseWeb.capath); + XMLUtils::GetString(pDatabase, "ciphers", m_databaseWeb.ciphers); + XMLUtils::GetBoolean(pDatabase, "compression", m_databaseWeb.compression); + } + pElement = pRootElement->FirstChildElement("enablemultimediakeys"); if (pElement) { diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h index 7857c69004e03..bc319348d91f0 100644 --- a/xbmc/settings/AdvancedSettings.h +++ b/xbmc/settings/AdvancedSettings.h @@ -334,6 +334,7 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler DatabaseSettings m_databaseVideo; // advanced video database setup DatabaseSettings m_databaseTV; // advanced tv database setup DatabaseSettings m_databaseEpg; /*!< advanced EPG database setup */ + DatabaseSettings m_databaseWeb; /*!< advanced web database setup */ bool m_useLocaleCollation; @@ -342,6 +343,8 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler bool m_guiSmartRedraw; unsigned int m_addonPackageFolderSize; + bool m_addonsSimulateBinaryLibAsExe; + unsigned int m_cacheMemSize; unsigned int m_cacheBufferMode; unsigned int m_cacheChunkSize; diff --git a/xbmc/storage/MediaManager.cpp b/xbmc/storage/MediaManager.cpp index 6be40c587db14..1dcf515298fb6 100644 --- a/xbmc/storage/MediaManager.cpp +++ b/xbmc/storage/MediaManager.cpp @@ -201,7 +201,7 @@ void CMediaManager::GetNetworkLocations(VECSOURCES &locations, bool autolocation locations.push_back(share); #endif - if (CServiceBroker::IsBinaryAddonCacheUp()) + if (CServiceBroker::IsAddonInterfaceUp()) { for (const auto& addon : CServiceBroker::GetVFSAddonCache().GetAddonInstances()) { diff --git a/xbmc/utils/FileExtensionProvider.cpp b/xbmc/utils/FileExtensionProvider.cpp index b5c1c88614900..d13b358414f12 100644 --- a/xbmc/utils/FileExtensionProvider.cpp +++ b/xbmc/utils/FileExtensionProvider.cpp @@ -106,7 +106,7 @@ bool CFileExtensionProvider::CanOperateExtension(const std::string& path) const // Get file extensions to find addon related to it. std::string strExtension = URIUtils::GetExtension(path); StringUtils::ToLower(strExtension); - if (!strExtension.empty() && CServiceBroker::IsBinaryAddonCacheUp()) + if (!strExtension.empty() && CServiceBroker::IsAddonInterfaceUp()) { std::vector> supportList; diff --git a/xbmc/utils/URIUtils.cpp b/xbmc/utils/URIUtils.cpp index ad4ebc8040c22..6d53320de3777 100644 --- a/xbmc/utils/URIUtils.cpp +++ b/xbmc/utils/URIUtils.cpp @@ -7,6 +7,7 @@ */ #include "network/Network.h" +#include "CompileInfo.h" #include "URIUtils.h" #include "FileItem.h" #include "filesystem/MultiPathDirectory.h" @@ -29,6 +30,7 @@ #include #include #include +#include using namespace PVR; using namespace XFILE; @@ -277,7 +279,7 @@ bool URIUtils::HasParentInHostname(const CURL& url) { return url.IsProtocol("zip") || url.IsProtocol("apk") || url.IsProtocol("bluray") || url.IsProtocol("udf") || url.IsProtocol("iso9660") || url.IsProtocol("xbt") || - (CServiceBroker::IsBinaryAddonCacheUp() && + (CServiceBroker::IsAddonInterfaceUp() && CServiceBroker::GetFileExtensionProvider().EncodedHostName(url.GetProtocol())); } @@ -1476,3 +1478,26 @@ bool URIUtils::UpdateUrlEncoding(std::string &strFilename) strFilename = newFilename; return true; } + +bool URIUtils::IsWeb(const std::string& strFile) +{ + return IsProtocol(strFile, "web"); +} + +bool URIUtils::IsSharedLibrarySuffix(const std::string& strFile) +{ + 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(strFile, libRegex)) + return true; + } + catch (const std::regex_error& e) + { + CLog::Log(LOGERROR, "URIUtils::{}: Regex error caught: {}", __func__, e.what()); + } + + return false; +} diff --git a/xbmc/utils/URIUtils.h b/xbmc/utils/URIUtils.h index 195c32e29d977..5e0fc2834cdc5 100644 --- a/xbmc/utils/URIUtils.h +++ b/xbmc/utils/URIUtils.h @@ -167,6 +167,8 @@ class URIUtils static bool IsPVRChannel(const std::string& strFile); static bool IsPVRChannelGroup(const std::string& strFile); static bool IsPVRGuideItem(const std::string& strFile); + static bool IsWeb(const std::string& strFile); + static bool IsSharedLibrarySuffix(const std::string& strFile); static std::string AppendSlash(std::string strFolder); static void AddSlashAtEnd(std::string& strFolder); diff --git a/xbmc/web/CMakeLists.txt b/xbmc/web/CMakeLists.txt new file mode 100644 index 0000000000000..8ce337a0924e5 --- /dev/null +++ b/xbmc/web/CMakeLists.txt @@ -0,0 +1,15 @@ +set(SOURCES Favourites.cpp + WebAddon.cpp + WebAddonControl.cpp + WebAddonTranslator.cpp + WebDatabase.cpp + WebManager.cpp) + +set(HEADERS Favourites.h + WebAddon.h + WebAddonControl.h + WebAddonTranslator.h + WebDatabase.h + WebManager.h) + +core_add_library(webaddons) diff --git a/xbmc/web/Favourites.cpp b/xbmc/web/Favourites.cpp new file mode 100644 index 0000000000000..157f766e2e7b5 --- /dev/null +++ b/xbmc/web/Favourites.cpp @@ -0,0 +1,45 @@ +/* + * 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 "Favourites.h" + +#include "WebDatabase.h" +#include "XBDateTime.h" +#include "utils/log.h" + +namespace KODI +{ +namespace WEB +{ + +CFavouriteEntry::CFavouriteEntry(const std::string& name, + const std::string& url, + const std::string& icon, + const CDateTime& dateTimeAdded) + : m_name(name), m_url(url), m_icon(icon), m_dateTimeAdded(dateTimeAdded) +{ +} + +void CWebFavourites::AddToFavourites(const std::string& name, + const std::string& url, + const std::string& icon) +{ + CWebDatabase database; + if (!database.Open()) + { + CLog::Log(LOGERROR, "CWebFavourites::{}: Failed to opened web database", __func__); + return; + } + + FavouriteEntryPtr entry = + std::make_shared(name, url, icon, CDateTime::GetCurrentDateTime()); + database.AddFavourite(entry); +} + +} /* namespace WEB */ +} /* namespace KODI */ diff --git a/xbmc/web/Favourites.h b/xbmc/web/Favourites.h new file mode 100644 index 0000000000000..265d5768e8a0f --- /dev/null +++ b/xbmc/web/Favourites.h @@ -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. + */ + +#pragma once + +#include "XBDateTime.h" + +#include + +namespace KODI +{ +namespace WEB +{ + +class CFavouriteEntry; +typedef std::shared_ptr FavouriteEntryPtr; + +class CFavouriteEntry +{ +public: + CFavouriteEntry(const std::string& name, + const std::string& url, + const std::string& icon, + const CDateTime& dateTimeAdded); + + const std::string& GetName() { return m_name; } + const std::string& GetURL() { return m_url; } + const std::string& GetIcon() { return m_icon; } + const CDateTime& GetDateTimeAdded() { return m_dateTimeAdded; } + +private: + std::string m_name; + std::string m_url; + std::string m_icon; + CDateTime m_dateTimeAdded; +}; + +class CWebFavourites +{ +public: + static void AddToFavourites(const std::string& name, + const std::string& url, + const std::string& icon); +}; + +} /* namespace WEB */ +} /* namespace KODI */ diff --git a/xbmc/web/WebAddon.cpp b/xbmc/web/WebAddon.cpp new file mode 100644 index 0000000000000..d8f8141d31c47 --- /dev/null +++ b/xbmc/web/WebAddon.cpp @@ -0,0 +1,427 @@ +/* + * 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 "WebAddon.h" + +#include "Application.h" +#include "ServiceBroker.h" +#include "WebManager.h" +#include "application/ApplicationVolumeHandling.h" +#include "commons/Exception.h" +#include "filesystem/Directory.h" +#include "filesystem/SpecialProtocol.h" +#include "guilib/GUIWebAddonControl.h" +#include "messaging/ApplicationMessenger.h" +#include "settings/AdvancedSettings.h" +#include "settings/Settings.h" +#include "utils/URIUtils.h" +#include "utils/log.h" + +using namespace ADDON; +using namespace KODI::ADDONS::INTERFACE; +using namespace KODI::MESSAGING; +using namespace KODI::WEB; + +CWebAddon::CWebAddon(const AddonInfoPtr& addonInfo) + : IInstanceHandler(this, ADDON_INSTANCE_WEB, addonInfo) +{ +} + +CWebAddon::~CWebAddon() +{ + Destroy(); +} + +void CWebAddon::ResetProperties(int addonId /* = -1 */) +{ + m_readyToUse = false; + m_addonId = addonId; +} + +ADDON_STATUS CWebAddon::Create(int addonId) +{ + /* ensure that a previous instance is destroyed */ + Destroy(); + + /* reset all properties to defaults */ + ResetProperties(addonId); + + /* initialise the add-on */ + CLog::Log(LOGDEBUG, "CWebAddon::{}: - creating add-on instance '{}'", __func__, Name()); + + ADDON_STATUS status = CreateInstance(); + if (status != ADDON_STATUS_OK) + return status; + + const auto ifc = m_ifc->kodi_addoninstance_web_h; + WEB_ADDON_ERROR webstatus = ifc->kodi_addon_web_start_instance_v1(m_instance); + if (webstatus != WEB_ADDON_ERROR_NO_ERROR) + return ADDON_STATUS_PERMANENT_FAILURE; + + m_readyToUse = true; + + return ADDON_STATUS_OK; +} + +void CWebAddon::Destroy() +{ + /* reset 'ready to use' to false */ + if (!m_readyToUse) + return; + m_readyToUse = false; + + CLog::Log(LOGDEBUG, "CWebAddon::{}: - destroying add-on '{}'", __func__, ID()); + + /* destroy the add-on */ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + ifc->kodi_addon_web_stop_instance_v1(m_instance); + DestroyInstance(); + + /* reset all properties to defaults */ + ResetProperties(); +} + +void CWebAddon::ReCreate() +{ + int iAddonID(m_addonId); + Destroy(); + + /* recreate the instance */ + Create(iAddonID); +} + +bool CWebAddon::MainInitialize() +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + m_readyToProcess = ifc->kodi_addon_web_main_initialize_v1(m_instance); + m_initCalled = true; + return m_readyToProcess; +} + +void CWebAddon::MainLoop() +{ + // Init addon on this to confirm addon is loaded after Kodi's start + if (!m_initCalled) + MainInitialize(); + + // Web browser main loop calls if init was OK + const auto ifc = m_ifc->kodi_addoninstance_web_h; + if (m_readyToProcess) + ifc->kodi_addon_web_main_loop_v1(m_instance); +} + +void CWebAddon::MainShutdown() +{ + // Shutdown the web browser addon + const auto ifc = m_ifc->kodi_addoninstance_web_h; + if (m_readyToProcess) + ifc->kodi_addon_web_main_shutdown_v1(m_instance); + m_readyToProcess = false; +} + +bool CWebAddon::ReadyToUse() const +{ + return m_readyToUse; +} + +int CWebAddon::GetID() const +{ + return m_addonId; +} + +WEB_ADDON_ERROR CWebAddon::ControlCreate(const WEB_ADDON_GUI_PROPS& props, + const std::string& startURL, + WEB_KODI_CONTROL& handle) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + WEB_ADDON_ERROR err = ifc->kodi_addon_web_create_control_v1(m_instance, &props, startURL.c_str(), &handle); + return err; +} + +bool CWebAddon::DestroyControl(const WEB_KODI_CONTROL handle, bool complete) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + return ifc->kodi_addon_web_destroy_control_v1(m_instance, handle, complete); +} + +void CWebAddon::RenderInit(KODI::ADDONS::INTERFACE::IOffscreenRenderProcess* offscreen, + const WEB_KODI_CONTROL handle) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + ifc->kodi_addon_web_control_render_init_v1(offscreen, m_instance, handle); +} + +void CWebAddon::RenderDeinit(KODI::ADDONS::INTERFACE::IOffscreenRenderProcess* offscreen, + const WEB_KODI_CONTROL handle) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + ifc->kodi_addon_web_control_render_deinit_v1(offscreen, m_instance, handle); +} + +void CWebAddon::Render(KODI::ADDONS::INTERFACE::IOffscreenRenderProcess* offscreen, + const WEB_KODI_CONTROL handle) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + ifc->kodi_addon_web_control_render_v1(offscreen, m_instance, handle); +} + +bool CWebAddon::OpenWebsite(const WEB_KODI_CONTROL handle, const std::string& url) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + return ifc->kodi_addon_web_control_open_website_v1(m_instance, handle, url.c_str()); +} + +void CWebAddon::Reload(const WEB_KODI_CONTROL handle) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + ifc->kodi_addon_web_control_web_cmd_reload_v1(m_instance, handle); +} + +void CWebAddon::StopLoad(const WEB_KODI_CONTROL handle) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + ifc->kodi_addon_web_control_web_cmd_stop_load_v1(m_instance, handle); +} + +void CWebAddon::GoBack(const WEB_KODI_CONTROL handle) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + ifc->kodi_addon_web_control_web_cmd_nav_back_v1(m_instance, handle); +} + +void CWebAddon::GoForward(const WEB_KODI_CONTROL handle) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + ifc->kodi_addon_web_control_web_cmd_nav_forward_v1(m_instance, handle); +} + +void CWebAddon::OpenOwnContextMenu(const WEB_KODI_CONTROL handle) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + ifc->kodi_addon_web_control_web_open_own_context_menu_v1(m_instance, handle); +} + +bool CWebAddon::Dirty(const WEB_KODI_CONTROL handle) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + return ifc->kodi_addon_web_control_dirty_v1(m_instance, handle); +} + +bool CWebAddon::OnInit(const WEB_KODI_CONTROL handle) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + return ifc->kodi_addon_web_control_on_init_v1(m_instance, handle); +} + +bool CWebAddon::OnAction(const WEB_KODI_CONTROL handle, + const KODI_ADDON_ACTION_DATA* action, + int& nextItem) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + return ifc->kodi_addon_web_control_on_action_v1(m_instance, handle, action, &nextItem); +} + +bool CWebAddon::OnMouseEvent(const WEB_KODI_CONTROL handle, + int id, + double x, + double y, + double offsetX, + double offsetY, + int state) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + return ifc->kodi_addon_web_control_on_mouse_event_v1(m_instance, handle, id, x, y, offsetX, + offsetY, state); +} + +bool CWebAddon::ControlGetHistory(const WEB_KODI_CONTROL handle, + std::vector& historyWebsiteNames, + bool behindCurrent) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + + char** historyList = nullptr; + size_t listSize = 0; + bool ret = ifc->kodi_addon_web_control_get_history_v1(m_instance, handle, &historyList, &listSize, + behindCurrent); + if (ret && historyList) + { + for (size_t i = 0; i < listSize; ++i) + { + if (historyList[i]) + { + historyWebsiteNames.emplace_back(historyList[i]); + free(historyList[i]); + } + } + free(historyList); + } + return ret; +} + +void CWebAddon::ControlSearchText(const WEB_KODI_CONTROL handle, + const std::string& text, + bool forward, + bool matchCase, + bool findNext) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + ifc->kodi_addon_web_control_search_text_v1(m_instance, handle, text.c_str(), forward, matchCase, + findNext); +} + +void CWebAddon::ControlStopSearch(const WEB_KODI_CONTROL handle, bool clearSelection) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + ifc->kodi_addon_web_control_stop_search_v1(m_instance, handle, clearSelection); +} + +void CWebAddon::ControlScreenSizeChange( + const WEB_KODI_CONTROL handle, float x, float y, float width, float height, bool fullscreen) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + ifc->kodi_addon_web_control_screen_size_change_v1(m_instance, handle, x, y, width, height, + fullscreen); +} + +void CWebAddon::SetMute(bool mute) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + ifc->kodi_addon_web_set_mute_v1(m_instance, mute); +} + +void CWebAddon::SetLanguage(const std::string& language) +{ + const auto ifc = m_ifc->kodi_addoninstance_web_h; + ifc->kodi_addon_web_set_language_v1(m_instance, language.c_str()); +} + +bool CWebAddon::LogError(const WEB_ADDON_ERROR error, const char* strMethod) const +{ + if (error != WEB_ADDON_ERROR_NO_ERROR) + { + CLog::Log(LOGERROR, "CWebAddon::{} - addon '{}' returned an error: {}", __func__, strMethod, + ID(), ToString(error)); + return false; + } + return true; +} + +const char* CWebAddon::ToString(const WEB_ADDON_ERROR error) +{ + switch (error) + { + case WEB_ADDON_ERROR_NO_ERROR: + return "no error"; + case WEB_ADDON_ERROR_NOT_IMPLEMENTED: + return "not implemented"; + case WEB_ADDON_ERROR_REJECTED: + return "rejected by the addon"; + case WEB_ADDON_ERROR_INVALID_PARAMETERS: + return "invalid parameters for this method"; + case WEB_ADDON_ERROR_FAILED: + return "the command failed"; + case WEB_ADDON_ERROR_UNKNOWN: + default: + return "unknown error"; + } +} + +/*! + * @brief Callback functions from addon to kodi + */ +//@{ + +void CWebAddon::cb_inhibit_shutdown(bool inhibit) +{ + CServiceBroker::GetAppMessenger()->PostMsg(TMSG_INHIBITIDLESHUTDOWN, inhibit); +} + +void CWebAddon::cb_inhibit_screensaver(bool inhibit) +{ + CServiceBroker::GetAppMessenger()->PostMsg(TMSG_INHIBITSCREENSAVER, inhibit); +} + +bool CWebAddon::cb_is_muted() +{ + return (g_application.IsMuted() || g_application.GetVolumeRatio() <= CApplicationVolumeHandling::VOLUME_MINIMUM); +} + +void CWebAddon::cb_control_set_control_ready(WEB_KODI_CONTROL handle, bool ready) +{ + CWebAddonControl* control = static_cast(handle); + assert(control); + control->SetControlReady(ready); +} + +void CWebAddon::cb_control_set_opened_address(WEB_KODI_CONTROL handle, const char* address) +{ + CWebAddonControl* control = static_cast(handle); + assert(control); + assert(address); + control->SetOpenedAddress(address); +} + +void CWebAddon::cb_control_set_opened_title(WEB_KODI_CONTROL handle, const char* title) +{ + CWebAddonControl* control = static_cast(handle); + assert(control); + assert(title); + control->SetOpenedTitle(title); +} + +void CWebAddon::cb_control_set_icon_url(WEB_KODI_CONTROL handle, const char* icon) +{ + CWebAddonControl* control = static_cast(handle); + assert(control); + assert(icon); + control->SetIconURL(icon); +} + +void CWebAddon::cb_control_set_fullscreen(WEB_KODI_CONTROL handle, bool fullscreen) +{ + CWebAddonControl* control = static_cast(handle); + assert(control); + + ///TODO!!!! +} + +void CWebAddon::cb_control_set_loading_state(WEB_KODI_CONTROL handle, + bool isLoading, + bool canGoBack, + bool canGoForward) +{ + CWebAddonControl* control = static_cast(handle); + assert(control); + control->SetLoadingState(isLoading, canGoBack, canGoForward); +} + +void CWebAddon::cb_control_set_tooltip(WEB_KODI_CONTROL handle, const char* tooltip) +{ + CWebAddonControl* control = static_cast(handle); + assert(control); + assert(tooltip); + control->SetTooltip(tooltip); +} + +void CWebAddon::cb_control_set_status_message(WEB_KODI_CONTROL handle, const char* status) +{ + CWebAddonControl* control = static_cast(handle); + assert(control); + assert(status); + control->SetStatusMessage(status); +} + +void CWebAddon::cb_control_request_open_site_in_new_tab(WEB_KODI_CONTROL handle, const char* url) +{ + CWebAddonControl* control = static_cast(handle); + assert(control); + assert(url); + control->RequestOpenSiteInNewTab(url); +} +//@} diff --git a/xbmc/web/WebAddon.h b/xbmc/web/WebAddon.h new file mode 100644 index 0000000000000..2655b4b2137e5 --- /dev/null +++ b/xbmc/web/WebAddon.h @@ -0,0 +1,187 @@ +/* + * 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/interface/InstanceHandler.h" +#include "addons/interface/api/addon-instance/web.h" + +namespace KODI +{ +namespace WEB +{ + +class CWebAddon; +typedef std::shared_ptr CWebAddonPtr; +#define INVALID_WEB_ADDON_ID -1 + +/*! + * Interface from Kodi to a Web add-on. + * + * Also translates Kodi's C++ structures to the addon's C structures. + */ +class CWebAddon : public KODI::ADDONS::INTERFACE::IInstanceHandler +{ +public: + CWebAddon(const ADDON::AddonInfoPtr& addonInfo); + ~CWebAddon() override; + + /** @name web add-on methods */ + //@{ + + /*! + * @brief Initialise the instance of this add-on. + * @param iClientId The ID of this add-on. + */ + ADDON_STATUS Create(int addonId); + + /*! + * @brief Destroy the instance of this add-on. + */ + void Destroy(); + + /*! + * @brief Destroy and recreate this add-on. + */ + void ReCreate(); + + /*! + * @return True if this instance is initialised, false otherwise. + */ + bool ReadyToUse() const; + + /*! + * @return The ID of this instance. + */ + int GetID() const; + + /*! + * @brief From application main thread started Initialize call + * + * @return true if successfull initialized + */ + bool MainInitialize(); + + /*! + * @brief From application main thread called main loop + */ + void MainLoop(); + + /*! + * @brief From application main started shutdown call + */ + void MainShutdown(); + + /*! + * @brief To inform addon about selected audio mute of Kodi + */ + void SetMute(bool mute); + + /*! + * @brief To inform addon about selected language of Kodi + */ + void SetLanguage(const std::string& language); + //@} + + /*! + * GUI control related functions + */ + //@{ + WEB_ADDON_ERROR ControlCreate(const WEB_ADDON_GUI_PROPS& props, + const std::string& startURL, + WEB_KODI_CONTROL& handle); + bool DestroyControl(const WEB_KODI_CONTROL handle, bool complete); + void RenderInit(KODI::ADDONS::INTERFACE::IOffscreenRenderProcess* offscreen, + const WEB_KODI_CONTROL handle); + void RenderDeinit(KODI::ADDONS::INTERFACE::IOffscreenRenderProcess* offscreen, + const WEB_KODI_CONTROL handle); + void Render(KODI::ADDONS::INTERFACE::IOffscreenRenderProcess* offscreen, + const WEB_KODI_CONTROL handle); + bool Dirty(const WEB_KODI_CONTROL handle); + bool OnInit(const WEB_KODI_CONTROL handle); + bool OnAction(const WEB_KODI_CONTROL handle, const KODI_ADDON_ACTION_DATA* action, int& nextItem); + bool OnMouseEvent(const WEB_KODI_CONTROL handle, + int id, + double x, + double y, + double offsetX, + double offsetY, + int state); + bool ControlGetHistory(const WEB_KODI_CONTROL handle, + std::vector& historyWebsiteNames, + bool behindCurrent); + void ControlSearchText(const WEB_KODI_CONTROL handle, + const std::string& text, + bool forward, + bool matchCase, + bool findNext); + void ControlStopSearch(const WEB_KODI_CONTROL handle, bool clearSelection); + void ControlScreenSizeChange( + const WEB_KODI_CONTROL handle, float x, float y, float width, float height, bool fullscreen); + //@} + + /*! + * Internet browser related functions + */ + //@{ + bool OpenWebsite(const WEB_KODI_CONTROL handle, const std::string& url); + void Reload(const WEB_KODI_CONTROL handle); + void StopLoad(const WEB_KODI_CONTROL handle); + void GoBack(const WEB_KODI_CONTROL handle); + void GoForward(const WEB_KODI_CONTROL handle); + void OpenOwnContextMenu(const WEB_KODI_CONTROL handle); + //@} + + /*! + * @brief Callback functions from addon to kodi + */ + //@{ + void cb_inhibit_shutdown(bool inhibit); + /*---AUTO_GEN_PARSE---*/ + void cb_inhibit_screensaver(bool inhibit); + /*---AUTO_GEN_PARSE---*/ + bool cb_is_muted(); + /*---AUTO_GEN_PARSE---*/ + void cb_control_set_control_ready(WEB_KODI_CONTROL handle, bool ready); + /*---AUTO_GEN_PARSE---*/ + void cb_control_set_opened_address(WEB_KODI_CONTROL handle, const char* address); + /*---AUTO_GEN_PARSE---*/ + void cb_control_set_opened_title(WEB_KODI_CONTROL handle, const char* title); + /*---AUTO_GEN_PARSE---*/ + void cb_control_set_icon_url(WEB_KODI_CONTROL handle, const char* icon); + /*---AUTO_GEN_PARSE---*/ + void cb_control_set_fullscreen(WEB_KODI_CONTROL handle, bool fullscreen); + /*---AUTO_GEN_PARSE---*/ + void cb_control_set_loading_state(WEB_KODI_CONTROL handle, + bool isLoading, + bool canGoBack, + bool canGoForward); + /*---AUTO_GEN_PARSE---*/ + void cb_control_set_tooltip(WEB_KODI_CONTROL handle, const char* tooltip); + /*---AUTO_GEN_PARSE---*/ + void cb_control_set_status_message(WEB_KODI_CONTROL handle, const char* status); + /*---AUTO_GEN_PARSE---*/ + void cb_control_request_open_site_in_new_tab(WEB_KODI_CONTROL handle, const char* url); + /*---AUTO_GEN_PARSE---*/ + //@} + +private: + static const char* ToString(const WEB_ADDON_ERROR error); + bool LogError(const WEB_ADDON_ERROR error, const char* strMethod) const; + void ResetProperties(int addonId = -1); + + bool m_readyToUse{false}; /*!< true if this add-on is connected to the backend, false otherwise */ + bool m_readyToProcess{false}; + bool m_initCalled{false}; + int m_addonId{-1}; /*!< database ID of the add-on */ + + CCriticalSection m_critSection; /*!< */ +}; + +} /* namespace WEB */ +} /* namespace KODI */ diff --git a/xbmc/web/WebAddonControl.cpp b/xbmc/web/WebAddonControl.cpp new file mode 100644 index 0000000000000..b85bfae546b9b --- /dev/null +++ b/xbmc/web/WebAddonControl.cpp @@ -0,0 +1,306 @@ +/* + * 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 "WebAddonControl.h" + +#include "ServiceBroker.h" +#include "WebManager.h" +#include "guilib/GUIWebAddonControl.h" +#include "utils/log.h" + +using namespace KODI::GUILIB; +using namespace KODI::WEB; + +CWebAddonControl::CWebAddonControl(const std::string& id, const CWebAddonPtr& addon) + : m_id(id), m_addon(addon) +{ + fprintf(stderr, "-------------------->CWebAddonControl::CWebAddonControl\n"); +} + +CWebAddonControl::~CWebAddonControl() +{ + fprintf(stderr, "-------------------->CWebAddonControl::~~~~CWebAddonControl\n"); + m_addon->RenderDeinit(this, m_handle); + m_addon->DestroyControl(m_handle, true); + CServiceBroker::GetWEBManager().m_addonControl.UnregisterControl(m_id); +} + +bool CWebAddonControl::RegisterGUIControl(CGUIWebAddonControl* control) +{ + std::unique_lock lock(m_controlMutex); + + const auto& entry = m_guiControls.find(control); + if (entry != m_guiControls.end()) + { + CLog::Log(LOGERROR, + "CWebAddonControl::{}: Requested web control to register already present, for '{}'", + __func__, m_id); + return false; + } + + m_guiControls.insert(control); + return true; +} + +void CWebAddonControl::UnregisterGUIControl(CGUIWebAddonControl* control) +{ + std::unique_lock lock(m_controlMutex); + + const auto& entry = m_guiControls.find(control); + if (entry != m_guiControls.end()) + m_guiControls.erase(entry); +} + +bool CWebAddonControl::CreateWebControl(CGUIWebAddonControl* control, const std::string& startURL) +{ + std::unique_lock lock(m_controlMutex); + + const auto& entry = m_guiControls.find(control); + if (entry == m_guiControls.end()) + { + CLog::Log(LOGERROR, "CWebAddonControl::{}: Web control not present, for '{}'", __func__, m_id); + return false; + } + + if (m_activeGUIControl != nullptr) + { + m_inactiveGUIControls.push_front(m_activeGUIControl); + DestroyWebControl(m_activeGUIControl); + } + + m_controlAddress = startURL; + WEB_ADDON_ERROR err = m_addon->ControlCreate(control->GetProps(), startURL, m_handle); + if (err != WEB_ADDON_ERROR_NO_ERROR && err != WEB_ADDON_ERROR_NO_ERROR_REOPEN) + { + CLog::Log(LOGERROR, "CWebAddonControl::{} - Web addon control creation for '{}' failed", + __func__, m_id); + return false; + } + + m_activeGUIControl = control; + if (err != WEB_ADDON_ERROR_NO_ERROR_REOPEN) + m_addon->RenderInit(this, m_handle); + m_activeGUIControl->UpdateOpenedAddress(m_controlAddress); + if (m_firstGUIControl == nullptr) + m_firstGUIControl = control; + + CLog::Log(LOGDEBUG, "CWebAddonControl::{} - Web addon control successfully created, for '{}'", + __func__, m_id); + return true; +} + +void CWebAddonControl::DestroyWebControl(CGUIWebAddonControl* control) +{ + std::unique_lock lock(m_controlMutex); + + if (m_activeGUIControl == nullptr) + return; + + const auto& entry = m_guiControls.find(control); + if (entry == m_guiControls.end()) + return; + + if (m_activeGUIControl != control) + { + if (m_inactiveGUIControls.empty()) + { + CLog::Log(LOGERROR, + "CWebAddonControl::{} - Destroy called from for '{}' from another control", + __func__, m_id); + return; + } + else + { + for (unsigned int i = 0; i < m_inactiveGUIControls.size(); ++i) + { + if (m_inactiveGUIControls[i] == control) + { + m_inactiveGUIControls.erase(m_inactiveGUIControls.begin() + i); + break; + } + } + return; + } + } + + if (m_firstGUIControl == m_activeGUIControl) + { + if (!m_inactiveGUIControls.empty()) + m_firstGUIControl = m_inactiveGUIControls.front(); + } + + m_addon->DestroyControl(m_handle, false); + + m_activeGUIControl = nullptr; + if (!m_inactiveGUIControls.empty()) + { + CGUIWebAddonControl* activeGUIControl = m_inactiveGUIControls.front(); + m_inactiveGUIControls.pop_front(); + CreateWebControl(activeGUIControl, ""); + } +} + +CGUIWebAddonControl* CWebAddonControl::GetFirstControl() const +{ + std::unique_lock lock(m_controlMutex); + + return m_firstGUIControl; +} + +// ----------------------------------------------------------------------------- + +bool CWebAddonControl::GetOffscreenRenderInfos(int& x, int& y, int& width, int& height, ADDON_HARDWARE_CONTEXT& context) +{ + assert(m_activeGUIControl); + + const WEB_ADDON_GUI_PROPS& props = m_activeGUIControl->GetProps(); + x = static_cast(props.fXPos); + y = static_cast(props.fYPos); + width = static_cast(props.fWidth); + height = static_cast(props.fHeight); + context = props.pDevice; + return true; +} + +void CWebAddonControl::Render() +{ + m_addon->Render(this, m_handle); +} + +bool CWebAddonControl::Dirty() +{ + return m_addon->Dirty(m_handle); +} + +bool CWebAddonControl::OnInit() +{ + return m_addon->OnInit(m_handle); +} + +bool CWebAddonControl::OnAction(const KODI_ADDON_ACTION_DATA* action, int& nextItem) +{ + return m_addon->OnAction(m_handle, action, nextItem); +} + +bool CWebAddonControl::OnMouseEvent( + int id, double x, double y, double offsetX, double offsetY, int state) +{ + return m_addon->OnMouseEvent(m_handle, id, x, y, offsetX, offsetY, state); +} + +bool CWebAddonControl::GetHistory(std::vector& historyWebsiteNames, bool behindCurrent) +{ + return m_addon->ControlGetHistory(m_handle, historyWebsiteNames, behindCurrent); +} + +void CWebAddonControl::SearchText(const std::string& text, + bool forward, + bool matchCase, + bool findNext) +{ + m_addon->ControlSearchText(m_handle, text, forward, matchCase, findNext); +} + +void CWebAddonControl::StopSearch(bool clearSelection) +{ + m_addon->ControlStopSearch(m_handle, clearSelection); +} + +void CWebAddonControl::ScreenSizeChange( + float x, float y, float width, float height, bool fullscreen) +{ + m_addon->ControlScreenSizeChange(m_handle, x, y, width, height, fullscreen); +} + +bool CWebAddonControl::OpenWebsite(const std::string& url) +{ + m_controlAddress = url; + return m_addon->OpenWebsite(m_handle, url); +} + +void CWebAddonControl::Reload() +{ + m_addon->Reload(m_handle); +} + +void CWebAddonControl::StopLoad() +{ + m_addon->StopLoad(m_handle); +} + +void CWebAddonControl::GoBack() +{ + m_addon->GoBack(m_handle); +} + +void CWebAddonControl::GoForward() +{ + m_addon->GoForward(m_handle); +} + +void CWebAddonControl::OpenOwnContextMenu() +{ + m_addon->OpenOwnContextMenu(m_handle); +} + +// ----------------------------------------------------------------------------- + +void CWebAddonControl::SetControlReady(bool ready) +{ + OpenWebsite(m_controlAddress); // if empty use addon his default home url + + if (m_activeGUIControl) + m_activeGUIControl->UpdateOpenedAddress(m_controlAddress); +} + +void CWebAddonControl::SetOpenedAddress(const std::string& address) +{ + m_controlAddress = address; + + if (m_activeGUIControl) + m_activeGUIControl->UpdateOpenedAddress(address); +} + +void CWebAddonControl::SetOpenedTitle(const std::string& title) +{ + m_controlTitle = title; + + if (m_activeGUIControl) + m_activeGUIControl->UpdateOpenedTitle(title); +} + +void CWebAddonControl::SetIconURL(const std::string& icon) +{ + m_controlIcon = icon; + + if (m_activeGUIControl) + m_activeGUIControl->UpdateIconURL(icon); +} + +void CWebAddonControl::SetLoadingState(bool isLoading, bool canGoBack, bool canGoForward) +{ + m_isLoading = isLoading; + m_canGoBack = canGoBack; + m_canGoForward = canGoForward; +} + +void CWebAddonControl::SetTooltip(const std::string& tooltip) +{ + m_tooltyp = tooltip; +} + +void CWebAddonControl::SetStatusMessage(const std::string& statusMessage) +{ + m_statusMessage = statusMessage; +} + +void CWebAddonControl::RequestOpenSiteInNewTab(const std::string& url) +{ + if (m_activeGUIControl) + m_activeGUIControl->RequestOpenSiteInNewTab(url); +} diff --git a/xbmc/web/WebAddonControl.h b/xbmc/web/WebAddonControl.h new file mode 100644 index 0000000000000..cd472e0a813ff --- /dev/null +++ b/xbmc/web/WebAddonControl.h @@ -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. + */ + +#pragma once + +#include "addons/interface/IOffscreenRenderProcess.h" +#include "threads/CriticalSection.h" +#include "web/WebAddon.h" + +#include +#include +#include + +namespace KODI +{ + +namespace GUILIB +{ +class CGUIWebAddonControl; +} /* namespace GUILIB */ + +namespace WEB +{ + +class CWebAddonControl; +typedef std::shared_ptr WebAddonControlPtr; + +class CWebAddonControl : public std::enable_shared_from_this, + public KODI::ADDONS::INTERFACE::IOffscreenRenderProcess +{ +public: + CWebAddonControl(const std::string& id, const CWebAddonPtr& addon); + ~CWebAddonControl(); + + bool RegisterGUIControl(GUILIB::CGUIWebAddonControl* control); + void UnregisterGUIControl(GUILIB::CGUIWebAddonControl* control); + + bool CreateWebControl(GUILIB::CGUIWebAddonControl* control, const std::string& startURL); + void DestroyWebControl(GUILIB::CGUIWebAddonControl* control); + GUILIB::CGUIWebAddonControl* GetFirstControl() const; + + // ------------------------------------------------------------------------- + + void Render(); + bool Dirty(); + bool OnInit(); + bool OnAction(const KODI_ADDON_ACTION_DATA* action, int& nextItem); + bool OnMouseEvent(int id, double x, double y, double offsetX, double offsetY, int state); + bool GetHistory(std::vector& historyWebsiteNames, bool behindCurrent); + void SearchText(const std::string& text, bool forward, bool matchCase, bool findNext); + void StopSearch(bool clearSelection); + void ScreenSizeChange(float x, float y, float width, float height, bool fullscreen); + bool OpenWebsite(const std::string& url); + void Reload(); + void StopLoad(); + void GoBack(); + void GoForward(); + void OpenOwnContextMenu(); + + // ------------------------------------------------------------------------- + + void SetControlReady(bool ready); + void SetOpenedAddress(const std::string& address); + void SetOpenedTitle(const std::string& title); + void SetIconURL(const std::string& icon); + void SetLoadingState(bool isLoading, bool canGoBack, bool canGoForward); + void SetTooltip(const std::string& tooltip); + void SetStatusMessage(const std::string& statusMessage); + void RequestOpenSiteInNewTab(const std::string& url); + + // ------------------------------------------------------------------------- + + bool IsLoading() const { return m_isLoading; } + bool CanGoBack() const { return m_canGoBack; } + bool CanGoForward() const { return m_canGoForward; } + const std::string& OpenedAddress() const { return m_controlAddress; } + const std::string& OpenedTitle() const { return m_controlTitle; } + const std::string& IconURL() const { return m_controlIcon; } + const std::string& StatusMessage() const { return m_statusMessage; } + const std::string& Tooltip() const { return m_tooltyp; } + +protected: + bool GetOffscreenRenderInfos(int& x, int& y, int& width, int& height, ADDON_HARDWARE_CONTEXT& context) override; + +private: + const std::string m_id; + std::set m_guiControls; + GUILIB::CGUIWebAddonControl* m_firstGUIControl = nullptr; + GUILIB::CGUIWebAddonControl* m_activeGUIControl = nullptr; + std::deque m_inactiveGUIControls; + CWebAddonPtr m_addon; + WEB_KODI_CONTROL m_handle{nullptr}; + mutable CCriticalSection m_controlMutex; + + bool m_isLoading; /*!< Current browser work flag to inform web site load is active */ + bool m_canGoBack; /*!< Flag where the message from add-on which allow go back becomes set */ + bool m_canGoForward; /*!< Flag where the message from add-on which allow go forward becomes set */ + std::string m_controlAddress; /*!< String with currently used address (URL) */ + std::string m_controlTitle; /*!< The title of active web site */ + std::string m_statusMessage; /*!< status message (e.g. selected URL) */ + std::string m_controlIcon; /*!< Path to file in cache with web site icon */ + std::string m_tooltyp; /*!< Tool tip of currently selected item web site */ +}; + +} /* namespace WEB */ +} /* namespace KODI */ diff --git a/xbmc/web/WebAddonTranslator.cpp b/xbmc/web/WebAddonTranslator.cpp new file mode 100644 index 0000000000000..e12f44202331b --- /dev/null +++ b/xbmc/web/WebAddonTranslator.cpp @@ -0,0 +1,63 @@ +/* + * 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 "WebAddonTranslator.h" + +using namespace KODI::WEB; + +const char* CWebAddonTranslator::ToString(WEB_ADDON_ERROR error) +{ + switch (error) + { + case WEB_ADDON_ERROR_NO_ERROR: + return "no error"; + case WEB_ADDON_ERROR_NO_ERROR_REOPEN: + return "no error reopen needed"; + case WEB_ADDON_ERROR_UNKNOWN: + return "unknown error"; + case WEB_ADDON_ERROR_NOT_IMPLEMENTED: + return "not implemented"; + case WEB_ADDON_ERROR_REJECTED: + return "rejected by the client"; + case WEB_ADDON_ERROR_INVALID_PARAMETERS: + return "invalid parameters for this method"; + case WEB_ADDON_ERROR_FAILED: + return "the command failed"; + default: + break; + } + return "unknown error"; +} + +WEB_KEY_MOD CWebAddonTranslator::GetModifiers(KEYBOARD::Modifier modifier) +{ + using namespace KEYBOARD; + + unsigned int mods = WEB_KEY_MOD_NONE; + + if (modifier & Modifier::MODIFIER_CTRL) + mods |= WEB_KEY_MOD_CTRL; + if (modifier & Modifier::MODIFIER_SHIFT) + mods |= WEB_KEY_MOD_SHIFT; + if (modifier & Modifier::MODIFIER_ALT) + mods |= WEB_KEY_MOD_ALT; + if (modifier & Modifier::MODIFIER_RALT) + mods |= WEB_KEY_MOD_ALT; + if (modifier & Modifier::MODIFIER_META) + mods |= WEB_KEY_MOD_META; + if (modifier & Modifier::MODIFIER_SUPER) + mods |= WEB_KEY_MOD_SUPER; + if (modifier & Modifier::MODIFIER_NUMLOCK) + mods |= WEB_KEY_MOD_NUMLOCK; + if (modifier & Modifier::MODIFIER_CAPSLOCK) + mods |= WEB_KEY_MOD_CAPSLOCK; + if (modifier & Modifier::MODIFIER_SCROLLLOCK) + mods |= WEB_KEY_MOD_SCROLLOCK; + + return static_cast(mods); +} diff --git a/xbmc/web/WebAddonTranslator.h b/xbmc/web/WebAddonTranslator.h new file mode 100644 index 0000000000000..64ab4413a0544 --- /dev/null +++ b/xbmc/web/WebAddonTranslator.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2016-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/c-api/addon-instance/web.h" +#include "input/keyboard/KeyboardTypes.h" + +namespace KODI +{ +namespace WEB +{ + +/*! + * \ingroup games + * \brief Translates data types from web API to the corresponding format in Kodi. + * + * This class is stateless. + */ +class CWebAddonTranslator +{ + CWebAddonTranslator() = delete; + +public: + /*! + * \brief Translates web errors to string representation (e.g. for logging). + * \param error The error to translate. + * \return Translated error. + */ + static const char* ToString(WEB_ADDON_ERROR error); + + /*! + * \brief Translate key modifiers (Kodi to web API). + * \param modifiers The key modifiers to translate (e.g. Shift, Ctrl). + * \return Translated key modifiers. + */ + static WEB_KEY_MOD GetModifiers(KEYBOARD::Modifier modifier); +}; + +} /* namespace WEB */ +} /* namespace KODI */ diff --git a/xbmc/web/WebDatabase.cpp b/xbmc/web/WebDatabase.cpp new file mode 100644 index 0000000000000..d23d333a6d76a --- /dev/null +++ b/xbmc/web/WebDatabase.cpp @@ -0,0 +1,119 @@ +/* + * 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 "WebDatabase.h" + +#include "ServiceBroker.h" +#include "dbwrappers/dataset.h" +#include "settings/AdvancedSettings.h" +#include "settings/Settings.h" +#include "settings/SettingsComponent.h" +#include "utils/StringUtils.h" +#include "utils/log.h" + +using namespace KODI::WEB; + +CWebDatabase::CWebDatabase(void) = default; + +CWebDatabase::~CWebDatabase(void) = default; + +bool CWebDatabase::Open() +{ + return CDatabase::Open( + CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_databaseWeb); +} + +void CWebDatabase::CreateTables() +{ + CLog::Log(LOGINFO, "CWebDatabase::{}: create favourites table", __func__); + m_pDS->exec("CREATE TABLE favourites (" + "id integer primary key," + "name text," + "url text," + "icon text," + "dateAdded text)"); +} + +void CWebDatabase::CreateAnalytics() +{ + CLog::Log(LOGINFO, "CWebDatabase::{}: creating indices", __func__); + m_pDS->exec("CREATE INDEX idxFavourites ON favourites(name)"); +} + +void CWebDatabase::UpdateTables(int version) +{ +} + +bool CWebDatabase::AddFavourite(FavouriteEntryPtr entry) +{ + try + { + if (nullptr == m_pDB.get()) + return false; + if (nullptr == m_pDS.get()) + return false; + + std::string sql = PrepareSQL("SELECT id FROM favourites WHERE name='%s' AND url='%s'", + entry->GetName().c_str(), entry->GetURL().c_str()); + m_pDS->query(sql); + if (m_pDS->num_rows() == 0) + { + m_pDS->close(); + sql = PrepareSQL("INSERT INTO favourites(name, url, icon, dateAdded) " + "values('%s', '%s', '%s', '%s')", + entry->GetName().c_str(), entry->GetURL().c_str(), entry->GetIcon().c_str(), + entry->GetDateTimeAdded().GetAsDBDateTime().c_str()); + return ExecuteQuery(sql); + } + } + catch (...) + { + CLog::Log(LOGERROR, "CWebDatabase::{} failed", __func__); + } + return false; +} + +bool CWebDatabase::RemoveFavourite(const std::string& name, const std::string& url) +{ + std::string sql = + PrepareSQL("DELETE FROM favourites where name='%s' AND url='%s'", name.c_str(), url.c_str()); + return ExecuteQuery(sql); +} + +bool CWebDatabase::GetFavourites(std::vector& entries) +{ + try + { + if (nullptr == m_pDB.get()) + return false; + if (nullptr == m_pDS.get()) + return false; + + m_pDS->query(PrepareSQL("SELECT * FROM favourites")); + while (!m_pDS->eof()) + { + FavouriteEntryPtr entry = std::make_shared( + m_pDS->fv(1).get_asString(), m_pDS->fv(2).get_asString(), m_pDS->fv(3).get_asString(), + CDateTime::FromDBDateTime(m_pDS->fv(4).get_asString())); + entries.emplace_back(entry); + m_pDS->next(); + } + m_pDS->close(); + } + catch (...) + { + CLog::Log(LOGERROR, "CWebDatabase::{} failed", __func__); + } + return true; +} + +bool CWebDatabase::ClearFavourites() +{ + std::string sql = PrepareSQL("delete from favourites"); + return ExecuteQuery(sql); +} diff --git a/xbmc/web/WebDatabase.h b/xbmc/web/WebDatabase.h new file mode 100644 index 0000000000000..f8aa05d0d12b5 --- /dev/null +++ b/xbmc/web/WebDatabase.h @@ -0,0 +1,44 @@ +/* + * 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 "dbwrappers/Database.h" +#include "web/Favourites.h" + +namespace KODI +{ +namespace WEB +{ + +class CWebDatabase : public CDatabase +{ +public: + CWebDatabase(); + ~CWebDatabase() override; + bool Open() override; + + bool AddFavourite(FavouriteEntryPtr entry); + bool RemoveFavourite(const std::string& name, const std::string& url); + inline bool RemoveFavourite(FavouriteEntryPtr entry) + { + return RemoveFavourite(entry->GetName(), entry->GetURL()); + } + bool GetFavourites(std::vector& entries); + bool ClearFavourites(); + +protected: + void CreateTables() override; + void CreateAnalytics() override; + void UpdateTables(int version) override; + int GetSchemaVersion() const override { return 1; } + const char* GetBaseDBName() const override { return "WEB"; } +}; + +} /* namespace WEB */ +} /* namespace KODI */ diff --git a/xbmc/web/WebEvent.h b/xbmc/web/WebEvent.h new file mode 100644 index 0000000000000..9c65d291e3628 --- /dev/null +++ b/xbmc/web/WebEvent.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. + */ + +#pragma once + +namespace KODI +{ +namespace WEB +{ + +enum WebEvent +{ + // Web Manager states + ManagerError = 0, + ManagerStopped, + ManagerStarting, + ManagerStopping, + ManagerInterrupted, + ManagerStarted, + ManagerChanged +}; + +} /* namespace WEB */ +} /* namespace KODI */ diff --git a/xbmc/web/WebManager.cpp b/xbmc/web/WebManager.cpp new file mode 100644 index 0000000000000..e8109d95dc3e3 --- /dev/null +++ b/xbmc/web/WebManager.cpp @@ -0,0 +1,498 @@ +/* + * 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 "WebManager.h" + +#include "GUIUserMessages.h" +#include "ServiceBroker.h" +#include "addons/AddonManager.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIWebAddonControl.h" +#include "guilib/GUIWindowManager.h" +#include "utils/log.h" +#include "web/WebDatabase.h" +#include "windows/GUIWindowWebBrowser.h" + +using namespace ADDON; +using namespace KODI::GUILIB; +using namespace KODI::WEB; + +CWebManager::CWebManager(void) : m_addonControl(this) +{ +} + +CWebManager::~CWebManager(void) +{ + Deinit(); +} + +void CWebManager::Init() +{ + // initial check for enabled addons + // if at least one pvr addon is enabled, PVRManager start up + CServiceBroker::GetJobManager()->Submit([this] { + SetState(ManagerState::Starting); + + CServiceBroker::GetAddonMgr().Events().Subscribe(this, &CWebManager::OnEvent); + Deinit(); + UpdateAddons(); + + SetState(ManagerState::Started); + }); +} + +void CWebManager::Deinit() +{ + if (m_managerState == ManagerState::Stopped) + return; + + // Before system becomes deinitialized and GUI, audio manager ... destroyed + // make sure there comes no stream from addon + SetMute(true); + + SetState(ManagerState::Stopping); + + MainShutdown(); + Clear(); + + SetState(ManagerState::Stopped); + + CServiceBroker::GetAddonMgr().Events().Unsubscribe(this); +} + +bool CWebManager::MainInitialize() +{ + std::unique_lock lock(m_critSection); + + if (!m_activeWebbrowser) + return false; + return m_activeWebbrowser->MainInitialize(); +} + +void CWebManager::MainLoop() +{ + std::unique_lock lock(m_critSection); + + if (m_activeWebbrowser) + m_activeWebbrowser->MainLoop(); +} + +void CWebManager::MainShutdown() +{ + std::unique_lock lock(m_critSection); + + CGUIWindowWebBrowser* runningWindow = + CServiceBroker::GetGUI()->GetWindowManager().GetWindow( + WINDOW_WEB_BROWSER); + if (runningWindow) + { + runningWindow->ControlDestroyAll(); + } + + m_addonControl.Clear(); + + if (m_activeWebbrowser) + m_activeWebbrowser->MainShutdown(); +} + +bool CWebManager::HasCreatedAddons() const +{ + std::unique_lock lock(m_critSection); + + for (auto& addon : m_addonMap) + { + if (addon.second->ReadyToUse()) + { + return true; + } + } + + return false; +} + +bool CWebManager::HasBrowser() const +{ + std::unique_lock lock(m_critSection); + + return m_activeWebbrowser != nullptr; +} + +bool CWebManager::IsWebWindowActive() const +{ + return IsWebWindow(CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow()); +} + +bool CWebManager::IsWebWindow(int windowId) const +{ + return (windowId == WINDOW_WEB_BROWSER || windowId == WINDOW_WEB_BROWSER_FULLSCREEN); +} + +bool CWebManager::GetFavourites(const std::string& path, CFileItemList& items) +{ + CWebDatabase database; + if (!database.Open()) + return false; + + std::vector entries; + if (!database.GetFavourites(entries)) + return false; + + for (const auto& entry : entries) + { + CFileItemPtr pFileItem(new CFileItem()); + pFileItem->SetLabel(entry->GetName()); + pFileItem->SetLabel2(entry->GetURL()); + pFileItem->SetProperty("dateadded", + CVariant{entry->GetDateTimeAdded().GetAsLocalizedDateTime(true, false)}); + pFileItem->SetArt("icon", entry->GetIcon()); + pFileItem->SetPath("web://sites/favourites/" + entry->GetURL()); + items.Add(pFileItem); + } + + return true; +} + +bool CWebManager::GetRunningWebsites(const std::string& path, CFileItemList& items) +{ + for (const auto& control : m_runningGUIControls) + { + CFileItemPtr pFileItem(new CFileItem()); + pFileItem->SetLabel(control->OpenedTitle()); + pFileItem->SetLabel2(control->OpenedAddress()); + pFileItem->SetArt("icon", control->IconURL()); + pFileItem->SetProperty("browseridstring", CVariant{control->WebControlIdString()}); + pFileItem->SetProperty("width", CVariant{control->GetWidth()}); + pFileItem->SetProperty("height", CVariant{control->GetHeight()}); + pFileItem->SetPath("web://sites/running/" + control->WebControlIdString()); + items.Add(pFileItem); + } + + return true; +} + +void CWebManager::SetLanguage(const std::string& language) +{ + std::unique_lock lock(m_critSection); + + for (const auto& addon : m_addonMap) + addon.second->SetLanguage(language); +} + +void CWebManager::SetMute(bool muted) +{ + std::unique_lock lock(m_critSection); + + if (m_activeWebbrowser) + m_activeWebbrowser->SetMute(muted); +} + +void CWebManager::ExecuteItem(CFileItem& item) +{ + std::string url = item.GetPath(); + if (StringUtils::StartsWith(url, "web://sites/favourites/")) + { + StringUtils::Replace(url, "web://sites/favourites/", ""); + + CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(WINDOW_WEB_BROWSER); + CGUIMessage msg(GUI_MSG_WEB_NEW_TAB, 0, WINDOW_WEB_BROWSER); + msg.SetLabel(url); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); + } + else if (StringUtils::StartsWith(url, "web://sites/running/")) + { + StringUtils::Replace(url, "web://sites/running/", ""); + + CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(WINDOW_WEB_BROWSER); + CGUIMessage msg(GUI_MSG_WEB_OPEN_TAB, 0, WINDOW_WEB_BROWSER); + msg.SetLabel(url); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); + } +} + +void CWebManager::PublishEvent(WebEvent event) +{ + m_events.Publish(event); +} + +void CWebManager::RegisterRunningWebGUIControl(CGUIWebAddonControl* control, int tabId) +{ + m_runningGUIControls.insert(m_runningGUIControls.begin() + tabId, control); + m_events.Publish(WEB::ManagerChanged); +} + +void CWebManager::UnregisterRunningWebGUIControl(CGUIWebAddonControl* control) +{ + for (auto it = m_runningGUIControls.begin(); it != m_runningGUIControls.end(); ++it) + { + if (*it == control) + { + m_runningGUIControls.erase(it); + break; + } + } + m_events.Publish(WEB::ManagerChanged); +} + +void CWebManager::OnEvent(const AddonEvent& event) +{ +} + +// bool CWebManager::IsInUse(const std::string& id) +// { +// std::unique_lock lock(m_critSection); +// +// const auto& itAddon = std::find_if( +// m_addonMap.begin(), m_addonMap.end(), +// [&id](const std::pair& addon) { return addon.second->ID() == id; }); +// if (itAddon != m_addonMap.end() && (*itAddon).second.use_count() > 1) +// return true; +// return false; +// } + +//------------------------------------------------------------------------------ +// private: + +CWebManager::ManagerState CWebManager::GetState(void) const +{ + std::unique_lock lock(m_managerStateMutex); + + return m_managerState; +} + +void CWebManager::SetState(CWebManager::ManagerState state) +{ + ObservableMessage observableMsg(ObservableMessageNone); + + { + std::unique_lock lock(m_managerStateMutex); + if (m_managerState == state) + return; + + m_managerState = state; + + WebEvent event; + switch (state) + { + case ManagerState::Error: + event = WEB::ManagerError; + break; + case ManagerState::Stopped: + event = WEB::ManagerStopped; + break; + case ManagerState::Starting: + event = WEB::ManagerStarting; + break; + case ManagerState::Stopping: + event = WEB::ManagerStopped; + break; + case ManagerState::Interrupted: + event = WEB::ManagerInterrupted; + break; + case ManagerState::Started: + event = WEB::ManagerStarted; + break; + default: + return; + } + m_events.Publish(event); + } + + if (observableMsg != ObservableMessageNone) + { + SetChanged(); + NotifyObservers(observableMsg); + } +} + +void CWebManager::UpdateAddons() +{ + std::vector addonInfos; + CServiceBroker::GetAddonMgr().GetAddonInfos(addonInfos, false, ADDON_WEB_MANAGER); + if (addonInfos.empty()) + return; + + for (auto& addon : addonInfos) + { + bool enabled = !CServiceBroker::GetAddonMgr().IsAddonDisabled(addon->ID()); + UpdateAddon(addon, enabled); + } +} + +void CWebManager::UpdateAddon(const AddonInfoPtr& addonInfo, bool enabled) +{ + if (enabled && (!IsKnown(addonInfo) || !IsCreatedAddon(addonInfo))) + { + std::hash hasher; + int iAddonId = static_cast(hasher(addonInfo->ID())); + if (iAddonId < 0) + iAddonId = -iAddonId; + + CWebAddonPtr webAddon; + ADDON_STATUS status = ADDON_STATUS_UNKNOWN; + if (IsKnown(addonInfo)) + { + GetAddon(iAddonId, webAddon); + status = webAddon->Create(iAddonId); + } + else + { + webAddon = std::make_shared(addonInfo); + if (!webAddon) + { + CLog::Log(LOGERROR, "CWebManager::{} - severe error, incorrect add-on type", __func__); + return; + } + + status = webAddon.get()->Create(iAddonId); + + // register the add-on + if (m_addonMap.find(iAddonId) == m_addonMap.end()) + { + m_addonMap.insert(std::make_pair(iAddonId, webAddon)); + m_addonNameIds.insert(make_pair(addonInfo->ID(), iAddonId)); + } + } + + if (status != ADDON_STATUS_OK) + { + CLog::Log(LOGERROR, "CWebManager::{} - failed to create add-on {}, status = {}", __func__, + addonInfo->Name(), status); + if (status == ADDON_STATUS_PERMANENT_FAILURE) + { + CServiceBroker::GetAddonMgr().DisableAddon(addonInfo->ID(), + AddonDisabledReason::PERMANENT_FAILURE); + } + } + else if (webAddon) + { + if (m_activeWebbrowser == nullptr) + m_activeWebbrowser = webAddon; + } + } + else if (IsCreatedAddon(addonInfo)) + { + // stop add-on if it's no longer enabled, restart add-on if it's still enabled + StopAddon(addonInfo, enabled); + } +} + +bool CWebManager::GetAddon(int addonId, CWebAddonPtr& addon) const +{ + bool bReturn(false); + if (addonId <= INVALID_WEB_ADDON_ID) + return bReturn; + + std::unique_lock lock(m_critSection); + + const auto& entry = m_addonMap.find(addonId); + if (entry != m_addonMap.end()) + { + addon = entry->second; + bReturn = true; + } + + return bReturn; +} + +int CWebManager::GetAddonId(const AddonInfoPtr& addon) const +{ + std::unique_lock lock(m_critSection); + + for (const auto& entry : m_addonMap) + if (entry.second->ID() == addon->ID()) + return entry.first; + + return -1; +} + +bool CWebManager::IsKnown(const AddonInfoPtr& addon) const +{ + // database IDs start at 1 + return GetAddonId(addon) > 0; +} + +bool CWebManager::IsCreatedAddon(const AddonInfoPtr& addon) const +{ + std::unique_lock lock(m_critSection); + + for (const auto& entry : m_addonMap) + if (entry.second->ID() == addon->ID()) + return entry.second->ReadyToUse(); + return false; +} + +bool CWebManager::StopAddon(const AddonInfoPtr& addon, bool restart) +{ + std::unique_lock lock(m_critSection); + + int iId = GetAddonId(addon); + CWebAddonPtr mappedAddon; + if (GetAddon(iId, mappedAddon)) + { + if (restart) + mappedAddon->ReCreate(); + else + { + const auto& entry = m_addonMap.find(iId); + if (entry != m_addonMap.end()) + m_addonMap.erase(entry); + + mappedAddon->Destroy(); + } + return true; + } + + return false; +} + +void CWebManager::Clear(void) +{ + std::unique_lock lock(m_critSection); + + for (const auto& control : m_runningGUIControls) + { + control->SetWebAddonInvalid(); + } + + m_activeWebbrowser.reset(); + m_addonNameIds.clear(); + m_addonMap.clear(); +} + +//------------------------------------------------------------------------------ +// class CWebManager::CAddonControl + +void CWebManager::CAddonControl::RegisterControl(CWebAddonControl* control, const std::string id) +{ + m_runningWebAddonControls.insert(std::pair(id, control)); +} + +void CWebManager::CAddonControl::UnregisterControl(const std::string id) +{ + m_runningWebAddonControls.erase(id); +} + +WebAddonControlPtr CWebManager::CAddonControl::GetControl(const std::string id) +{ + const auto& entry = m_runningWebAddonControls.find(id); + if (entry != m_runningWebAddonControls.end()) + return entry->second->shared_from_this(); + + CWebAddonPtr addon = m_manager->GetActiveWebBrowser(); + if (!addon) + return nullptr; + + WebAddonControlPtr control = std::make_shared(id, addon); + RegisterControl(control.get(), id); + return control; +} + +void CWebManager::CAddonControl::Clear() +{ + m_runningWebAddonControls.clear(); +} diff --git a/xbmc/web/WebManager.h b/xbmc/web/WebManager.h new file mode 100644 index 0000000000000..85f5d22746bac --- /dev/null +++ b/xbmc/web/WebManager.h @@ -0,0 +1,151 @@ +/* + * 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 "FileItem.h" +#include "utils/Observer.h" +#include "web/WebAddon.h" +#include "web/WebAddonControl.h" +#include "web/WebEvent.h" +#include "utils/EventStream.h" + +#include +#include +#include + +namespace ADDON +{ +struct AddonEvent; +} + +namespace KODI +{ + +namespace GUILIB +{ +class CGUIWebAddonControl; +} /* namespace GUILIB */ + +namespace WEB +{ + +class CWebDatabase; +class CWebGUIInfo; + +class CWebManager : public Observable//, public ADDON::CAddonDllInformer +{ +public: + CWebManager(); + ~CWebManager() override; + + void Init(); + void Deinit(); + + bool MainInitialize(); + void MainLoop(); + void MainShutdown(); + + inline bool IsInitialising() const { return GetState() == ManagerState::Starting; } + + inline bool IsStarted() const { return GetState() == ManagerState::Started; } + + inline bool IsStopping() const { return GetState() == ManagerState::Stopping; } + + inline bool IsStopped() const { return GetState() == ManagerState::Stopped; } + + bool HasCreatedAddons() const; + bool HasBrowser() const; + bool IsWebWindowActive() const; + bool IsWebWindow(int windowId) const; + + void SetLanguage(const std::string& language); + void SetMute(bool muted); + + bool GetFavourites(const std::string& path, CFileItemList& items); + bool GetRunningWebsites(const std::string& path, CFileItemList& items); + const CWebAddonPtr& GetActiveWebBrowser() const { return m_activeWebbrowser; } + + void ExecuteItem(CFileItem& item); + + CEventStream& Events() { return m_events; } + void PublishEvent(WebEvent state); + + /*! + * To handle controls on addon itself + * + * Kodi's web gui control for the same part can be used on several + * places. Every of them use then the single defined on addon from + * here. + * + * A control on addon becomes identified by a string, with this + * can be the same used on different places. + */ + class CAddonControl + { + public: + CAddonControl(CWebManager* manager) : m_manager(manager) {} + + std::shared_ptr GetControl(const std::string id); + void Clear(); + + private: + std::map m_runningWebAddonControls; + CWebManager* m_manager; + + void RegisterControl(CWebAddonControl* control, const std::string id); + + /* Have UnregisterWebAddonControl(...) as friend part for CWebAddonControl */ + friend class CWebAddonControl; + void UnregisterControl(const std::string id); + } m_addonControl; + + void RegisterRunningWebGUIControl(GUILIB::CGUIWebAddonControl* control, int tabId); + void UnregisterRunningWebGUIControl(GUILIB::CGUIWebAddonControl* control); + +protected: + void OnEvent(const ADDON::AddonEvent& event); +// bool IsInUse(const std::string& id) override; + +private: + enum class ManagerState + { + Error = 0, + Stopped, + Starting, + Stopping, + Interrupted, + Started + }; + + ManagerState GetState() const; + void SetState(ManagerState state); + + void UpdateAddons(); + void UpdateAddon(const ADDON::AddonInfoPtr& addon, bool enabled); + bool GetAddon(int addonId, CWebAddonPtr& addon) const; + int GetAddonId(const ADDON::AddonInfoPtr& addon) const; + bool IsKnown(const ADDON::AddonInfoPtr& addon) const; + bool IsCreatedAddon(const ADDON::AddonInfoPtr& addon) const; + bool StopAddon(const ADDON::AddonInfoPtr& addon, bool restart); + void Clear(void); + + mutable CCriticalSection m_critSection; + + CEventSource m_events; + mutable CCriticalSection m_managerStateMutex; + ManagerState m_managerState = ManagerState::Stopped; + + std::map m_addonNameIds; + std::map m_addonMap; + std::vector m_runningGUIControls; + CWebAddonPtr m_activeWebbrowser; +}; + +} /* namespace WEB */ +} /* namespace KODI */ diff --git a/xbmc/web/dialogs/CMakeLists.txt b/xbmc/web/dialogs/CMakeLists.txt new file mode 100644 index 0000000000000..74a582fb35d9f --- /dev/null +++ b/xbmc/web/dialogs/CMakeLists.txt @@ -0,0 +1,5 @@ +set(SOURCES GUIDialogFavourites.cpp) + +set(HEADERS GUIDialogFavourites.h) + +core_add_library(webaddons_dialogs) diff --git a/xbmc/web/dialogs/GUIDialogFavourites.cpp b/xbmc/web/dialogs/GUIDialogFavourites.cpp new file mode 100644 index 0000000000000..f9a97fa061279 --- /dev/null +++ b/xbmc/web/dialogs/GUIDialogFavourites.cpp @@ -0,0 +1,262 @@ +/* + * Copyright (C) 2005-2019 Team Kodi + * 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 "GUIDialogFavourites.h" + +#include "FileItem.h" +#include "ServiceBroker.h" +#include "dialogs/GUIDialogContextMenu.h" +#include "dialogs/GUIDialogYesNo.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIWindowManager.h" +#include "guilib/LocalizeStrings.h" +#include "input/Key.h" +#include "utils/StringUtils.h" +#include "utils/Variant.h" +#include "web/WebDatabase.h" + +#define CONTROL_NUMBER_OF_ITEMS 2 +#define CONTROL_SIMPLE_LIST 3 +#define CONTROL_DETAILED_LIST 6 +#define CONTROL_EXTRA_BUTTON 5 +#define CONTROL_CANCEL_BUTTON 7 + +using namespace KODI::GUILIB; +using namespace KODI::WEB; + +CGUIDialogWebFavourites::CGUIDialogWebFavourites() + : CGUIDialogBoxBase(WINDOW_DIALOG_WEB_FAVOURITES, "DialogSelect.xml"), + m_selectedItem(-1), + m_vecList(new CFileItemList()) +{ + m_loadType = KEEP_IN_MEMORY; +} + +CGUIDialogWebFavourites::~CGUIDialogWebFavourites(void) = default; + +std::string CGUIDialogWebFavourites::ShowAndGetFavourite(CWebDatabase* database) +{ + std::vector entries; + m_database = database; + if (m_database->Open() && m_database->GetFavourites(entries)) + { + for (const auto& entry : entries) + { + CFileItemPtr item(std::make_shared(entry->GetName())); + item->SetLabel2(entry->GetURL()); + item->SetArt("icon", entry->GetIcon()); + m_vecList->Add(item); + } + m_vecList->Sort(SortByLabel, SortOrderAscending); + + Open(); + + std::string url; + if (m_selectedItem >= 0) + url = m_vecList->Get(m_selectedItem)->GetLabel2(); + + m_vecList->Clear(); + m_database = nullptr; + return url; + } + + return StringUtils::Empty; +} + +std::string CGUIDialogWebFavourites::ShowAndGetURL() +{ + CGUIDialogWebFavourites* dialog = + CServiceBroker::GetGUI()->GetWindowManager().GetWindow( + WINDOW_DIALOG_WEB_FAVOURITES); + if (dialog) + { + CWebDatabase database; + return dialog->ShowAndGetFavourite(&database); + } + return StringUtils::Empty; +} + +bool CGUIDialogWebFavourites::OnMessage(CGUIMessage& message) +{ + switch (message.GetMessage()) + { + case GUI_MSG_WINDOW_DEINIT: + { + CGUIDialogBoxBase::OnMessage(message); + return true; + } + break; + + case GUI_MSG_WINDOW_INIT: + { + m_selectedItem = -1; + SetHeading(CVariant{g_localizeStrings.Get(1036)}); + CGUIDialogBoxBase::OnMessage(message); + return true; + } + break; + + + case GUI_MSG_CLICKED: + { + int iControl = message.GetSenderId(); + if (iControl == CONTROL_CANCEL_BUTTON) + { + m_selectedItem = -1; + Close(); + } + else + { + int action = message.GetParam1(); + switch (action) + { + case ACTION_SELECT_ITEM: + case ACTION_MOUSE_LEFT_CLICK: + { + int iSelected = m_viewControl.GetSelectedItem(); + if (iSelected >= 0 && iSelected < m_vecList->Size()) + { + CFileItemPtr item(m_vecList->Get(iSelected)); + for (int i = 0; i < m_vecList->Size(); i++) + m_vecList->Get(i)->Select(false); + item->Select(true); + m_selectedItem = iSelected; + Close(); + } + break; + } + case ACTION_CONTEXT_MENU: + case ACTION_MOUSE_RIGHT_CLICK: + { + int iSelected = m_viewControl.GetSelectedItem(); + if (iSelected >= 0 && iSelected < m_vecList->Size()) + { + OnPopupMenu(iSelected); + return true; + } + break; + } + default: + break; + } + } + } + break; + case GUI_MSG_SETFOCUS: + { + if (m_viewControl.HasControl(message.GetControlId())) + { + if (m_vecList->IsEmpty()) + { + SET_CONTROL_FOCUS(CONTROL_CANCEL_BUTTON, 0); + return true; + } + if (m_viewControl.GetCurrentControl() != message.GetControlId()) + { + m_viewControl.SetFocused(); + return true; + } + } + } + break; + } + + return CGUIDialogBoxBase::OnMessage(message); +} + +bool CGUIDialogWebFavourites::OnBack(int actionID) +{ + m_selectedItem = -1; + return CGUIDialogBoxBase::OnBack(actionID); +} + +CGUIControl* CGUIDialogWebFavourites::GetFirstFocusableControl(int id) +{ + if (m_viewControl.HasControl(id)) + id = m_viewControl.GetCurrentControl(); + return CGUIDialogBoxBase::GetFirstFocusableControl(id); +} + +void CGUIDialogWebFavourites::OnWindowLoaded() +{ + CGUIDialogBoxBase::OnWindowLoaded(); + m_viewControl.Reset(); + m_viewControl.SetParentWindow(GetID()); + m_viewControl.AddView(GetControl(CONTROL_SIMPLE_LIST)); + m_viewControl.AddView(GetControl(CONTROL_DETAILED_LIST)); +} + +void CGUIDialogWebFavourites::OnInitWindow() +{ + m_viewControl.SetItems(*m_vecList); + m_selectedItem = m_vecList->Size() >= 0 ? 0 : -1; + m_viewControl.SetCurrentView(CONTROL_DETAILED_LIST); + + SET_CONTROL_LABEL( + CONTROL_NUMBER_OF_ITEMS, + StringUtils::Format("%i %s", m_vecList->Size(), g_localizeStrings.Get(127).c_str())); + SET_CONTROL_HIDDEN(CONTROL_EXTRA_BUTTON); + SET_CONTROL_LABEL(CONTROL_CANCEL_BUTTON, g_localizeStrings.Get(15067)); + + CGUIDialogBoxBase::OnInitWindow(); + + // if nothing is selected, select first item + m_viewControl.SetSelectedItem(0); +} + +void CGUIDialogWebFavourites::OnDeinitWindow(int nextWindowID) +{ + m_viewControl.Clear(); + CGUIDialogBoxBase::OnDeinitWindow(nextWindowID); +} + +void CGUIDialogWebFavourites::OnWindowUnload() +{ + CGUIDialogBoxBase::OnWindowUnload(); + m_viewControl.Reset(); +} + +void CGUIDialogWebFavourites::OnPopupMenu(int item) +{ + if (item < 0 || item >= m_vecList->Size()) + return; + + CContextButtons choices; + choices.Add(1, 14072); // Open favourite + choices.Add(2, 14077); // Remove from favourites + choices.Add(3, 14073); // Remove all favourites + int button = CGUIDialogContextMenu::ShowAndGetChoice(choices); + if (button == 1) + { + m_selectedItem = item; + Close(); + return; + } + else if (button == 2) + { + // prompt user to be sure + if (!CGUIDialogYesNo::ShowAndGetInput(CVariant{14077}, CVariant{750})) + return; + + if (m_database->RemoveFavourite(m_vecList->Get(item)->GetLabel(), + m_vecList->Get(item)->GetLabel2())) + { + m_vecList->Remove(item); + m_viewControl.SetItems(*m_vecList); + } + } + else if (button == 3) + { + // prompt user to be sure + if (!CGUIDialogYesNo::ShowAndGetInput(CVariant{14073}, CVariant{750})) + return; + + m_database->ClearFavourites(); + Close(); + } +} diff --git a/xbmc/web/dialogs/GUIDialogFavourites.h b/xbmc/web/dialogs/GUIDialogFavourites.h new file mode 100644 index 0000000000000..796a21336ec6d --- /dev/null +++ b/xbmc/web/dialogs/GUIDialogFavourites.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2005-2019 Team Kodi + * 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 "dialogs/GUIDialogBoxBase.h" +#include "view/GUIViewControl.h" +#include "web/Favourites.h" + +#include +#include + +class CFileItem; +class CFileItemList; + +namespace KODI +{ +namespace WEB +{ + +class CWebDatabase; + +class CGUIDialogWebFavourites : public CGUIDialogBoxBase +{ +public: + CGUIDialogWebFavourites(); + ~CGUIDialogWebFavourites(void) override; + + static std::string ShowAndGetURL(); + +protected: + bool OnMessage(CGUIMessage& message) override; + bool OnBack(int actionID) override; + CGUIControl* GetFirstFocusableControl(int id) override; + void OnWindowLoaded() override; + void OnInitWindow() override; + void OnDeinitWindow(int nextWindowID) override; + void OnWindowUnload() override; + +private: + std::string ShowAndGetFavourite(CWebDatabase* database); + void OnPopupMenu(int item); + + int m_selectedItem; + std::unique_ptr m_vecList; + CGUIViewControl m_viewControl; + CWebDatabase* m_database; +}; + +} // namespace WEB +} // namespace KODI + diff --git a/xbmc/web/windows/CMakeLists.txt b/xbmc/web/windows/CMakeLists.txt new file mode 100644 index 0000000000000..5b4c82ee04d2a --- /dev/null +++ b/xbmc/web/windows/CMakeLists.txt @@ -0,0 +1,7 @@ +set(SOURCES GUIWindowWebBrowser.cpp + GUIWindowWebBrowserFullScreen.cpp) + +set(HEADERS GUIWindowWebBrowser.h + GUIWindowWebBrowserFullScreen.h) + +core_add_library(webaddons_windows) diff --git a/xbmc/web/windows/GUIWindowWebBrowser.cpp b/xbmc/web/windows/GUIWindowWebBrowser.cpp new file mode 100644 index 0000000000000..1ee2f40ce93b9 --- /dev/null +++ b/xbmc/web/windows/GUIWindowWebBrowser.cpp @@ -0,0 +1,610 @@ +/* + * 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 "GUIWindowWebBrowser.h" + +#include "Application.h" +#include "GUIUserMessages.h" +#include "ServiceBroker.h" +#include "dialogs/GUIDialogKaiToast.h" +#include "dialogs/GUIDialogNumeric.h" +#include "dialogs/GUIDialogOK.h" +#include "dialogs/GUIDialogSelect.h" +#include "dialogs/GUIDialogYesNo.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIMessage.h" +#include "guilib/GUIWebAddonControl.h" +#include "guilib/GUIWindowManager.h" +#include "guilib/LocalizeStrings.h" +#include "input/Key.h" +#include "messaging/ApplicationMessenger.h" +#include "settings/MediaSettings.h" +#include "settings/Settings.h" +#include "threads/SingleLock.h" +#include "utils/Observer.h" +#include "utils/StringUtils.h" +#include "utils/log.h" +#include "web/WebManager.h" + +using namespace KODI::GUILIB; +using namespace KODI::WEB; + +#define CONTROL_DEFAULT_WEBADDON 2 +#define CONTROL_EDIT_URL 110 + +#define CONTROL_LIST_ACTIVE_WEBSITE_TABS 9000 +#define CONTROL_BUTTON_GO_BACK 9001 +#define CONTROL_BUTTON_GO_FWD 9002 +#define CONTROL_BUTTON_SEARCH 9020 +#define CONTROL_EDIT_SEARCH 9021 + +CGUIWindowWebBrowser::CGUIWindowWebBrowser() + : CGUIWindow(WINDOW_WEB_BROWSER, "MyWebBrowser.xml"), + m_vecItems(std::make_unique()) +{ + m_loadType = KEEP_IN_MEMORY; +} + +CGUIWindowWebBrowser::~CGUIWindowWebBrowser() +{ +} + +bool CGUIWindowWebBrowser::OnBack(int actionID) +{ + return CGUIWindow::OnBack(actionID); +} + +void CGUIWindowWebBrowser::OnInitWindow() +{ + CGUIWindow::OnInitWindow(); + + m_viewControl.SetCurrentView(CONTROL_LIST_ACTIVE_WEBSITE_TABS); + m_viewControl.SetFocused(); + SET_CONTROL_VISIBLE(CONTROL_LIST_ACTIVE_WEBSITE_TABS); +} + +void CGUIWindowWebBrowser::OnDeinitWindow(int nextWindowID) +{ + CGUIWindow::OnDeinitWindow(nextWindowID); +} + +void CGUIWindowWebBrowser::OnWindowLoaded() +{ + std::unique_lock lock(m_mutex); + + CGUIWindow::OnWindowLoaded(); + + m_originalWebControl = dynamic_cast(GetControl(CONTROL_DEFAULT_WEBADDON)); + if (!m_originalWebControl) + { + CLog::Log(LOGERROR, "CGUIWindowWebBrowser::{}: Needed web control not defined on skin", __func__); + return; + } + m_originalWebControl->SetVisible(false); + + m_viewControl.Reset(); + m_viewControl.SetParentWindow(GetID()); + m_viewControl.AddView(GetControl(CONTROL_LIST_ACTIVE_WEBSITE_TABS)); + + m_selectedItem = 0; + m_nextBrowserId = 0; + + // Add the item to add a new site + CFileItemPtr itemSiteAdd(new CFileItem()); + itemSiteAdd->SetProperty("type", "add"); + itemSiteAdd->SetProperty("browserid", -1); + itemSiteAdd->SetProperty("webcontrolid", ""); + m_vecItems->Add(itemSiteAdd); + + // Add the start website in selection list + if (!ControlCreate()) + { + CLog::Log(LOGERROR, "CGUIWindowWebBrowser::{}: Failed to create start website control", __func__); + return; + } + + if (!m_controls.empty()) + m_activeWebControl = m_controls[0]; +} + +void CGUIWindowWebBrowser::OnWindowUnload() +{ + std::unique_lock lock(m_mutex); + + m_originalWebControl = nullptr; + m_activeWebControl = nullptr; + for (const auto& entry : m_controls) + { + CGUIWebAddonControl* control = entry.second; + CServiceBroker::GetWEBManager().UnregisterRunningWebGUIControl(control); + + RemoveControl(control); + delete control; + } + m_controls.clear(); + m_vecItems->Clear(); + m_viewControl.Reset(); + + CGUIWindow::OnWindowUnload(); +} + +bool CGUIWindowWebBrowser::OnMessage(CGUIMessage& message) +{ + std::unique_lock lock(m_mutex); + + switch (message.GetMessage()) + { + case GUI_MSG_WEB_UPDATE_ADDRESS: + { + if (m_selectedItem >= 0 && m_selectedItem < m_vecItems->Size() - 1) + m_vecItems->Get(m_selectedItem)->SetLabel2(message.GetLabel()); + SET_CONTROL_LABEL2(CONTROL_EDIT_URL, message.GetLabel()); + break; + } + case GUI_MSG_WEB_UPDATE_NAME: + { + if (m_selectedItem >= 0 && m_selectedItem < m_vecItems->Size() - 1) + m_vecItems->Get(m_selectedItem)->SetLabel(message.GetLabel()); + break; + } + case GUI_MSG_WEB_UPDATE_ICON: + { + if (m_selectedItem >= 0 && m_selectedItem < m_vecItems->Size() - 1) + m_vecItems->Get(m_selectedItem)->SetArt("icon", message.GetLabel()); + break; + } + case GUI_MSG_WEB_NEW_TAB: + { + for (int i = 0; i < m_vecItems->Size(); ++i) + { + if (m_vecItems->Get(i)->GetLabel2() == message.GetLabel()) + return SelectTab(i); + } + + if (m_controls.size() == 1 && m_controls[0]->OpenedAddress().empty()) + m_controls[0]->SetLoadAddress(message.GetLabel()); + else + ControlCreate(message.GetLabel()); + break; + } + case GUI_MSG_WEB_OPEN_TAB: + { + for (int i = 0; i < m_vecItems->Size(); ++i) + { + if (m_vecItems->Get(i)->GetProperty("webcontrolid").asString() == message.GetLabel()) + return SelectTab(i); + } + break; + } + default: + break; + } + + return CGUIWindow::OnMessage(message); +} + +bool CGUIWindowWebBrowser::SelectTab(int tab) +{ + CFileItemPtr itemToChangeTo(m_vecItems->Get(tab)); + int browserId = itemToChangeTo->GetProperty("browserid").asInteger(); + const auto& control = m_controls.find(browserId); + if (control == m_controls.end()) + { + CLog::Log(LOGERROR, "CGUIWindowWebBrowser::{}: Requested website control (id: '{}') not found", + __func__, browserId); + return false; + } + + m_selectedItem = tab; + + if (m_activeWebControl) + m_activeWebControl->SetVisible(false); + m_activeWebControl = control->second; + m_activeWebControl->SetVisible(true); + + SET_CONTROL_LABEL2(CONTROL_EDIT_URL, m_activeWebControl->OpenedAddress()); + + m_viewControl.SetItems(*m_vecItems); + m_viewControl.SetSelectedItem(m_selectedItem); + return true; +} + +#define TABS_CONTEXT_DELETE_TAB 0 +#define TABS_CONTEXT_DELETE_OTHER_TABS 1 +#define TABS_CONTEXT_ADD_TO_FAVORITES 2 +bool CGUIWindowWebBrowser::OnAction(const CAction& action) +{ + std::unique_lock lock(m_mutex); + + int focusedControl = GetFocusedControlID(); + int id = action.GetID(); + switch (id) + { + case ACTION_CONTEXT_MENU: + case ACTION_MOUSE_RIGHT_CLICK: + { + if (focusedControl == CONTROL_BUTTON_GO_BACK || focusedControl == CONTROL_BUTTON_GO_FWD) + { + std::vector historyWebsiteNames; + m_activeWebControl->GetHistory(historyWebsiteNames, + focusedControl == CONTROL_BUTTON_GO_FWD); + if (!historyWebsiteNames.empty()) + { + // popup the context menu + CContextButtons choices; + for (unsigned int i = 0; i < historyWebsiteNames.size(); ++i) + choices.Add(i, historyWebsiteNames[focusedControl == CONTROL_BUTTON_GO_FWD + ? i + : historyWebsiteNames.size() - 1 - i]); + + int choice = CGUIDialogContextMenu::ShowAndGetChoice(choices); + if (choice >= 0) + { + for (int i = 0; i <= choice; ++i) + CServiceBroker::GetGUI()->GetWindowManager().SendMessage( + focusedControl == CONTROL_BUTTON_GO_FWD ? GUI_MSG_WEB_CONTROL_GO_FWD + : GUI_MSG_WEB_CONTROL_GO_BACK, + GetID(), CONTROL_DEFAULT_WEBADDON); + } + } + return true; + } + else if (focusedControl == CONTROL_LIST_ACTIVE_WEBSITE_TABS) + { + int selected = m_viewControl.GetSelectedItem(); + if (selected < 0 || selected >= m_vecItems->Size()) + break; + + /* No context on add item */ + if (m_vecItems->Get(selected)->GetProperty("type").asString() == "add") + break; + + CContextButtons choices; + choices.Add(TABS_CONTEXT_DELETE_TAB, g_localizeStrings.Get(920)); + if (m_selectedItem == selected && m_controls.size() > 1) + choices.Add(TABS_CONTEXT_DELETE_OTHER_TABS, g_localizeStrings.Get(921)); + choices.Add(TABS_CONTEXT_ADD_TO_FAVORITES, g_localizeStrings.Get(922)); + int choice = CGUIDialogContextMenu::ShowAndGetChoice(choices); + if (choice < 0) + break; + + CFileItemPtr item(m_vecItems->Get(selected)); + switch (choice) + { + case TABS_CONTEXT_DELETE_TAB: + { + ControlDestroy(selected, false); + break; + } + case TABS_CONTEXT_DELETE_OTHER_TABS: + { + ControlDestroy(selected, true); + break; + } + case TABS_CONTEXT_ADD_TO_FAVORITES: + { + CServiceBroker::GetGUI()->GetWindowManager().SendMessage( + GUI_MSG_WEB_CONTROL_ADD_TO_FAVOURITES, GetID(), CONTROL_DEFAULT_WEBADDON); + break; + } + default: + break; + } + return true; + } + break; + } + case ACTION_SELECT_ITEM: + case ACTION_MOUSE_LEFT_CLICK: + { + if (focusedControl == CONTROL_LIST_ACTIVE_WEBSITE_TABS) + { + int selected = m_viewControl.GetSelectedItem(); + if (selected < 0 || selected >= m_vecItems->Size()) + return false; + + CFileItemPtr item(m_vecItems->Get(selected)); + std::string type = item->GetProperty("type").asString(); + if (type == "add") + { + ControlCreate(); + } + else if (type == "website" && m_selectedItem != selected) + { + int id = item->GetProperty("browserid").asInteger(); + const auto& control = m_controls.find(id); + if (control == m_controls.end()) + { + CLog::Log(LOGERROR, "CGUIWindowWebBrowser::{}: Requested website control (id: '{}') not found", + __func__, id); + return false; + } + + m_activeWebControl->SetVisible(false); + m_activeWebControl = control->second; + m_activeWebControl->SetVisible(true); + + m_selectedItem = selected; + m_vecItems->Get(selected)->SetArt("icon", m_activeWebControl->IconURL()); + m_vecItems->Get(selected)->SetLabel(m_activeWebControl->OpenedTitle()); + m_vecItems->Get(selected)->SetLabel2(m_activeWebControl->OpenedAddress()); + SET_CONTROL_LABEL2(CONTROL_EDIT_URL, m_activeWebControl->OpenedAddress()); + } + return true; + } + else if (focusedControl == CONTROL_BUTTON_SEARCH) + { + CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), CONTROL_EDIT_SEARCH); + OnMessage(msg); + std::string searchLabel = msg.GetLabel(); + if (!searchLabel.empty()) + { + m_activeWebControl->SearchText(searchLabel, true, false, + m_lastSearchLabel == searchLabel); + m_lastSearchLabel = searchLabel; + } + else if (!m_lastSearchLabel.empty()) + { + m_lastSearchLabel.clear(); + m_activeWebControl->StopSearch(true); + } + } + } + default: + break; + } + + return CGUIWindow::OnAction(action); +} + +bool CGUIWindowWebBrowser::ControlCreate(const std::string& url) +{ + std::string id = StringUtils::Format("kodi_web_window_browser_id-%05i", m_nextBrowserId); + + CGUIWebAddonControl* control = new CGUIWebAddonControl(*m_originalWebControl); + control->SetWebControlIdString(id); + control->SetLoadAddress(url); + control->AllocResources(); + m_controls[m_nextBrowserId] = control; + InsertControl(control, m_originalWebControl); + + // Add the start website in selection list + CFileItemPtr itemSiteNew(new CFileItem()); + itemSiteNew->SetLabel(g_localizeStrings.Get(919)); + itemSiteNew->SetLabel2(url); + itemSiteNew->SetArt("icon", "DefaultFile.png"); + itemSiteNew->SetProperty("type", "website"); + itemSiteNew->SetProperty("browserid", m_nextBrowserId++); + itemSiteNew->SetProperty("webcontrolid", id); + m_vecItems->AddFront(itemSiteNew, m_vecItems->Size() - 1); + + m_viewControl.SetItems(*m_vecItems); + + m_selectedItem = m_vecItems->Size() - 2; + m_viewControl.SetSelectedItem(m_selectedItem); + if (m_activeWebControl) + m_activeWebControl->SetVisible(false); + m_activeWebControl = control; + m_activeWebControl->SetVisible(true); + + CServiceBroker::GetWEBManager().RegisterRunningWebGUIControl(control, m_selectedItem); + return true; +} + +bool CGUIWindowWebBrowser::ControlDestroyAll() +{ + std::unique_lock lock(m_mutex); + + return ControlDestroy(-1, false); +} + +bool CGUIWindowWebBrowser::ControlDestroy(int itemNo, bool destroyAllOthers) +{ + if (m_controls.empty()) + return false; + + if (m_activeWebControl) + m_activeWebControl->SetVisible(false); + + if (itemNo < 0 || m_controls.size() == 1) + { + for (const auto& it : m_controls) + { + CGUIWebAddonControl* control = it.second; + CServiceBroker::GetWEBManager().UnregisterRunningWebGUIControl(control); + RemoveControl(control); + delete control; + } + + m_controls.clear(); + m_activeWebControl = nullptr; + CServiceBroker::GetGUI()->GetWindowManager().PreviousWindow(); + + m_selectedItem = 0; + m_nextBrowserId = 0; + m_lastSearchLabel = ""; + + // Add the item to add a new site + CFileItemPtr itemSiteAdd(new CFileItem()); + itemSiteAdd->SetProperty("type", "add"); + itemSiteAdd->SetProperty("browserid", -1); + itemSiteAdd->SetProperty("webcontrolid", ""); + m_vecItems->Clear(); + m_vecItems->Add(itemSiteAdd); + m_viewControl.SetItems(*m_vecItems); + + return true; + } + + CFileItemPtr item(m_vecItems->Get(itemNo)); + if (destroyAllOthers) + { + CFileItemPtr itemAddSite(m_vecItems->Get(m_vecItems->Size() - 1)); + int browserId = item->GetProperty("browserid").asInteger(); + const auto& control = m_controls.find(browserId); + if (control == m_controls.end()) + { + CLog::Log(LOGERROR, "CGUIWindowWebBrowser::{}: Requested website control (id: '{}') not found", + __func__, browserId); + return false; + } + + for (auto it = m_controls.begin(); it != m_controls.end();) + { + if (it->first != browserId) + { + CGUIWebAddonControl* control = it->second; + CServiceBroker::GetWEBManager().UnregisterRunningWebGUIControl(control); + + it = m_controls.erase(it); + RemoveControl(control); + delete control; + } + else + ++it; + } + + m_activeWebControl = control->second; + + m_vecItems->Clear(); + m_vecItems->Add(item); + m_vecItems->Add(itemAddSite); + m_selectedItem = m_vecItems->Size() - 2; + } + else + { + if (m_selectedItem == itemNo) + { + int switchTobrowserId; + if (itemNo >= m_vecItems->Size() - 2) + { + m_selectedItem = itemNo - 1; + switchTobrowserId = m_vecItems->Get(itemNo - 1)->GetProperty("browserid").asInteger(); + } + else + switchTobrowserId = m_vecItems->Get(itemNo + 1)->GetProperty("browserid").asInteger(); + + const auto& control = m_controls.find(switchTobrowserId); + if (control == m_controls.end()) + { + CLog::Log(LOGERROR, + "CGUIWindowWebBrowser::{}: Requested website control (id: '{}') to switch to not found", + __func__, switchTobrowserId); + return false; + } + m_activeWebControl = control->second; + } + + if (itemNo <= m_selectedItem) + { + --m_selectedItem; + } + + int browserId = m_vecItems->Get(itemNo)->GetProperty("browserid").asInteger(); + const auto& control = m_controls.find(browserId); + if (control == m_controls.end()) + { + CLog::Log(LOGERROR, + "CGUIWindowWebBrowser::{}: Requested website control (id: '{}') to destroy not found", + __func__, browserId); + return false; + } + + CServiceBroker::GetWEBManager().UnregisterRunningWebGUIControl(control->second); + + m_vecItems->Remove(itemNo); + RemoveControl(control->second); + + m_controls.erase(browserId); + delete control->second; + } + + m_viewControl.SetItems(*m_vecItems); + m_viewControl.SetSelectedItem(m_selectedItem); + if (m_activeWebControl) + m_activeWebControl->SetVisible(true); + + return true; +} + +void CGUIWindowWebBrowser::SetInvalid() +{ + CGUIWindow::SetInvalid(); +} + +KODI::GUILIB::CGUIWebAddonControl* CGUIWindowWebBrowser::GetRunningControl() +{ + std::unique_lock lock(m_mutex); + + return m_activeWebControl; +} + +/*! Return value functions */ +//{ +std::string CGUIWindowWebBrowser::SelectedAddress() +{ + CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), CONTROL_EDIT_URL); + OnMessage(msg); + return msg.GetLabel(); +} + +const std::string& CGUIWindowWebBrowser::OpenedAddress() const +{ + if (m_activeWebControl) + return m_activeWebControl->OpenedAddress(); + return StringUtils::Empty; +} + +const std::string& CGUIWindowWebBrowser::OpenedTitle() const +{ + if (m_activeWebControl) + return m_activeWebControl->OpenedTitle(); + return StringUtils::Empty; +} + +const std::string& CGUIWindowWebBrowser::Tooltip() const +{ + if (m_activeWebControl) + return m_activeWebControl->Tooltip(); + return StringUtils::Empty; +} + +const std::string& CGUIWindowWebBrowser::StatusMessage() const +{ + if (m_activeWebControl) + return m_activeWebControl->StatusMessage(); + return StringUtils::Empty; +} + +const std::string& CGUIWindowWebBrowser::IconURL() const +{ + if (m_activeWebControl) + return m_activeWebControl->IconURL(); + return StringUtils::Empty; +} + +bool CGUIWindowWebBrowser::IsLoading() const +{ + if (m_activeWebControl) + return m_activeWebControl->IsLoading(); + return false; +} + +bool CGUIWindowWebBrowser::CanGoBack() const +{ + if (m_activeWebControl) + return m_activeWebControl->CanGoBack(); + return false; +} + +bool CGUIWindowWebBrowser::CanGoForward() const +{ + if (m_activeWebControl) + return m_activeWebControl->CanGoForward(); + return false; +} diff --git a/xbmc/web/windows/GUIWindowWebBrowser.h b/xbmc/web/windows/GUIWindowWebBrowser.h new file mode 100644 index 0000000000000..35528d387f780 --- /dev/null +++ b/xbmc/web/windows/GUIWindowWebBrowser.h @@ -0,0 +1,75 @@ +/* + * 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 "settings/lib/ISettingCallback.h" +#include "threads/CriticalSection.h" +#include "utils/JobManager.h" +#include "utils/Observer.h" +#include "web/WebAddon.h" +#include "windows/GUIMediaWindow.h" + +namespace KODI +{ + +namespace GUILIB +{ +class CGUIWebAddonControl; +} /* namespace GUILIB */ + +namespace WEB +{ + +class CGUIWindowWebBrowser : public CGUIWindow +{ +public: + CGUIWindowWebBrowser(); + ~CGUIWindowWebBrowser() override; + + void OnInitWindow() override; + void OnDeinitWindow(int nextWindowID) override; + bool OnMessage(CGUIMessage& message) override; + bool OnAction(const CAction& action) override; + bool OnBack(int actionID) override; + void SetInvalid() override; + void OnWindowLoaded() override; + void OnWindowUnload() override; + bool HasWebControl() const override { return true; } + + std::string SelectedAddress(); + const std::string& OpenedAddress() const; + const std::string& OpenedTitle() const; + const std::string& Tooltip() const; + const std::string& StatusMessage() const; + const std::string& IconURL() const; + bool IsLoading() const; + bool CanGoBack() const; + bool CanGoForward() const; + + GUILIB::CGUIWebAddonControl* GetRunningControl(); + bool ControlDestroyAll(); + +private: + bool ControlCreate(const std::string& url = ""); + bool ControlDestroy(int itemNo, bool destroyAllOthers); + bool SelectTab(int tab); + + mutable CCriticalSection m_mutex; + GUILIB::CGUIWebAddonControl* m_originalWebControl{nullptr}; + GUILIB::CGUIWebAddonControl* m_activeWebControl{nullptr}; + std::map m_controls; + std::unique_ptr m_vecItems; + CGUIViewControl m_viewControl; + int m_selectedItem{-1}; + std::atomic_uint m_nextBrowserId{0}; + std::string m_lastSearchLabel; +}; + +} /* namespace WEB */ +} /* namespace KODI */ diff --git a/xbmc/web/windows/GUIWindowWebBrowserFullScreen.cpp b/xbmc/web/windows/GUIWindowWebBrowserFullScreen.cpp new file mode 100644 index 0000000000000..175a40e4422b8 --- /dev/null +++ b/xbmc/web/windows/GUIWindowWebBrowserFullScreen.cpp @@ -0,0 +1,169 @@ +/* + * 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 "GUIWindowWebBrowserFullScreen.h" + +#include "GUIUserMessages.h" +#include "ServiceBroker.h" +#include "guilib/GUIComponent.h" +#include "guilib/GUIKeyboardFactory.h" +#include "guilib/GUIWebAddonControl.h" +#include "guilib/GUIWindowManager.h" +#include "guilib/LocalizeStrings.h" +#include "input/Key.h" +#include "input/actions/Action.h" +#include "web/dialogs/GUIDialogFavourites.h" +#include "web/windows/GUIWindowWebBrowser.h" + +#define CONTROL_WEBADDON 2 + +using namespace KODI::GUILIB; +using namespace KODI::WEB; + +CGUIWindowWebBrowserFullScreen::CGUIWindowWebBrowserFullScreen(void) + : CGUIWindow(WINDOW_WEB_BROWSER_FULLSCREEN, "VideoFullScreen.xml"), + m_useRunningControl(false), + m_webControl(nullptr) +{ +} + +void CGUIWindowWebBrowserFullScreen::OnInitWindow(void) +{ + CGUIWindow::OnInitWindow(); + + CGUIWindowWebBrowser* runningWindow = + CServiceBroker::GetGUI()->GetWindowManager().GetWindow( + WINDOW_WEB_BROWSER); + if (runningWindow) + { + m_webControl = runningWindow->GetRunningControl(); + if (m_webControl) + { + m_useRunningControl = true; + m_webControl->SetFullscreen(true); + } + else + m_useRunningControl = false; + } + + if (!m_useRunningControl) + { + m_webControl = + new CGUIWebAddonControl(GetID(), CONTROL_WEBADDON, 0, 0, GetWidth(), GetHeight()); + } + AddControl(m_webControl); + SetDefaultControl(CONTROL_WEBADDON, true); +} + +void CGUIWindowWebBrowserFullScreen::OnDeinitWindow(int nextWindowID) +{ + if (m_webControl) + { + RemoveControl(m_webControl); + if (m_useRunningControl) + { + m_webControl->SetFullscreen(false); + m_useRunningControl = false; + } + else + { + delete m_webControl; + m_webControl = nullptr; + } + } + CGUIWindow::OnDeinitWindow(nextWindowID); +} + +#define CONTEXT_MENU_GO_BACK 0 +#define CONTEXT_MENU_GO_FWD 1 +#define CONTEXT_MENU_OPEN_URL 2 +#define CONTEXT_MENU_RELOAD 3 +#define CONTEXT_MENU_OPEN_FAVOURITES 4 +#define CONTEXT_MENU_HOME 5 +#define CONTEXT_MENU_CLOSE_FULLSCREEN 6 +bool CGUIWindowWebBrowserFullScreen::OnAction(const CAction& action) +{ + if (m_webControl) + { + int id = action.GetID(); + switch (id) + { + case ACTION_CONTEXT_MENU: + case ACTION_MOUSE_RIGHT_CLICK: + { + CContextButtons choices; + if (m_webControl->CanGoBack()) + choices.Add(CONTEXT_MENU_GO_BACK, g_localizeStrings.Get(915)); + if (m_webControl->CanGoForward()) + choices.Add(CONTEXT_MENU_GO_FWD, g_localizeStrings.Get(916)); + choices.Add(CONTEXT_MENU_OPEN_URL, g_localizeStrings.Get(1051)); + choices.Add(CONTEXT_MENU_RELOAD, g_localizeStrings.Get(914)); + choices.Add(CONTEXT_MENU_OPEN_FAVOURITES, g_localizeStrings.Get(1036)); + choices.Add(CONTEXT_MENU_HOME, g_localizeStrings.Get(913)); + choices.Add(CONTEXT_MENU_CLOSE_FULLSCREEN, g_localizeStrings.Get(917)); + int choice = CGUIDialogContextMenu::ShowAndGetChoice(choices); + if (choice < 0) + return false; + + switch (choice) + { + case CONTEXT_MENU_GO_BACK: + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(GUI_MSG_WEB_CONTROL_GO_BACK, + GetID(), CONTROL_WEBADDON); + break; + case CONTEXT_MENU_GO_FWD: + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(GUI_MSG_WEB_CONTROL_GO_FWD, + GetID(), CONTROL_WEBADDON); + break; + case CONTEXT_MENU_OPEN_URL: + { + std::string url = m_webControl->OpenedAddress(); + if (CGUIKeyboardFactory::ShowAndGetInput(url, CVariant{g_localizeStrings.Get(912)}, + true) && + !url.empty()) + { + CGUIMessage msg(GUI_MSG_WEB_CONTROL_LOAD, GetID(), CONTROL_WEBADDON); + msg.SetLabel(url); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); + } + break; + } + case CONTEXT_MENU_RELOAD: + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(GUI_MSG_WEB_CONTROL_RELOAD, + GetID(), CONTROL_WEBADDON); + break; + case CONTEXT_MENU_OPEN_FAVOURITES: + { + std::string url = WEB::CGUIDialogWebFavourites::ShowAndGetURL(); + if (!url.empty()) + { + CGUIMessage msg(GUI_MSG_WEB_CONTROL_LOAD, GetID(), CONTROL_WEBADDON); + msg.SetLabel(url); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); + } + break; + } + case CONTEXT_MENU_HOME: + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(GUI_MSG_WEB_CONTROL_HOME, + GetID(), CONTROL_WEBADDON); + break; + case CONTEXT_MENU_CLOSE_FULLSCREEN: + CServiceBroker::GetGUI()->GetWindowManager().PreviousWindow(); + break; + default: + return false; + } + return true; + } + default: + break; + } + } + + return CGUIWindow::OnAction(action); +} diff --git a/xbmc/web/windows/GUIWindowWebBrowserFullScreen.h b/xbmc/web/windows/GUIWindowWebBrowserFullScreen.h new file mode 100644 index 0000000000000..a14a4123ee04a --- /dev/null +++ b/xbmc/web/windows/GUIWindowWebBrowserFullScreen.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 "guilib/GUIWindow.h" + +namespace KODI +{ + +namespace GUILIB +{ +class CGUIWebAddonControl; +} /* namespace GUILIB */ + +namespace WEB +{ + +class CGUIWindowWebBrowserFullScreen : public CGUIWindow +{ +public: + CGUIWindowWebBrowserFullScreen(void); + + void OnInitWindow(void) override; + void OnDeinitWindow(int nextWindowID) override; + bool OnAction(const CAction& action) override; + +private: + bool m_useRunningControl; + GUILIB::CGUIWebAddonControl* m_webControl; +}; + +} /* namespace WEB */ +} /* namespace KODI */ diff --git a/xbmc/windows/GUIWindowScreensaver.cpp b/xbmc/windows/GUIWindowScreensaver.cpp index d81424d560bbc..d997e3007cccf 100644 --- a/xbmc/windows/GUIWindowScreensaver.cpp +++ b/xbmc/windows/GUIWindowScreensaver.cpp @@ -28,16 +28,19 @@ void CGUIWindowScreensaver::Process(unsigned int currentTime, CDirtyRegionList & { MarkDirtyRegion(); CGUIWindow::Process(currentTime, regions); - m_renderRegion.SetRect(0, 0, (float)CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth(), (float)CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight()); + auto& context = CServiceBroker::GetWinSystem()->GetGfxContext(); + m_renderRegion.SetRect(0, 0, static_cast(context.GetWidth()), static_cast(context.GetHeight())); } void CGUIWindowScreensaver::Render() { if (m_addon) { - CServiceBroker::GetWinSystem()->GetGfxContext().CaptureStateBlock(); + auto& context = CServiceBroker::GetWinSystem()->GetGfxContext(); + + context.CaptureStateBlock(); m_addon->Render(); - CServiceBroker::GetWinSystem()->GetGfxContext().ApplyStateBlock(); + context.ApplyStateBlock(); return; } @@ -53,6 +56,8 @@ EVENT_RESULT CGUIWindowScreensaver::OnMouseEvent(const CPoint &point, const CMou bool CGUIWindowScreensaver::OnMessage(CGUIMessage& message) { + auto& context = CServiceBroker::GetWinSystem()->GetGfxContext(); + switch (message.GetMessage()) { case GUI_MSG_WINDOW_DEINIT: @@ -63,7 +68,7 @@ bool CGUIWindowScreensaver::OnMessage(CGUIMessage& message) m_addon.reset(); } - CServiceBroker::GetWinSystem()->GetGfxContext().ApplyStateBlock(); + context.ApplyStateBlock(); } break; @@ -71,7 +76,7 @@ bool CGUIWindowScreensaver::OnMessage(CGUIMessage& message) { CGUIWindow::OnMessage(message); - CServiceBroker::GetWinSystem()->GetGfxContext().CaptureStateBlock(); + context.CaptureStateBlock(); const std::string addon = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString( CSettings::SETTING_SCREENSAVER_MODE); diff --git a/xbmc/windows/GUIWindowSystemInfo.cpp b/xbmc/windows/GUIWindowSystemInfo.cpp index 157b7b83aef88..0db43c01b592b 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") +CGUIWindowSystemInfo::CGUIWindowSystemInfo(void) + : 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,13 +83,22 @@ 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, INFO::DEFAULT_CONTEXT)); 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; @@ -235,6 +253,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)); @@ -258,3 +281,114 @@ void CGUIWindowSystemInfo::SetControlLabel(int id, const char *format, int label CServiceBroker::GetGUI()->GetInfoManager().GetLabel(info, INFO::DEFAULT_CONTEXT)); 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("{} %", 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; };