#pragma once /* * Copyright (C) 2005-2017 Team Kodi * http://kodi.tv * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This Program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Kodi; see the file COPYING. If not, see * . * */ #include "../AddonBase.h" namespace kodi { namespace addon { class CInstanceScreensaver; }} extern "C" { struct AddonInstance_Screensaver; typedef struct AddonProps_Screensaver { void *device; int x; int y; int width; int height; float pixelRatio; const char *name; const char *presets; const char *profile; } AddonProps_Screensaver; typedef struct AddonToKodiFuncTable_Screensaver { KODI_HANDLE kodiInstance; } AddonToKodiFuncTable_Screensaver; typedef struct KodiToAddonFuncTable_Screensaver { kodi::addon::CInstanceScreensaver* addonInstance; bool (__cdecl* Start) (AddonInstance_Screensaver* instance); void (__cdecl* Stop) (AddonInstance_Screensaver* instance); void (__cdecl* Render) (AddonInstance_Screensaver* instance); } KodiToAddonFuncTable_Screensaver; typedef struct AddonInstance_Screensaver { AddonProps_Screensaver props; AddonToKodiFuncTable_Screensaver toKodi; KodiToAddonFuncTable_Screensaver toAddon; } AddonInstance_Screensaver; } /* extern "C" */ namespace kodi { namespace addon { class CInstanceScreensaver : public IAddonInstance { public: CInstanceScreensaver() : IAddonInstance(ADDON_INSTANCE_SCREENSAVER) { if (CAddonBase::m_interface->globalSingleInstance != nullptr) throw std::logic_error("kodi::addon::CInstanceScreensaver: Creation of more as one in single instance way is not allowed!"); SetAddonStruct(CAddonBase::m_interface->firstKodiInstance); CAddonBase::m_interface->globalSingleInstance = this; } CInstanceScreensaver(KODI_HANDLE instance) : IAddonInstance(ADDON_INSTANCE_SCREENSAVER) { if (CAddonBase::m_interface->globalSingleInstance != nullptr) throw std::logic_error("kodi::addon::CInstanceScreensaver: Creation of multiple together with single instance way is not allowed!"); SetAddonStruct(instance); } virtual ~CInstanceScreensaver() { } virtual bool Start() { return true; } virtual void Stop() {} virtual void Render() {} inline void* Device() { return m_instanceData->props.device; } inline int X() { return m_instanceData->props.x; } inline int Y() { return m_instanceData->props.y; } inline int Width() { return m_instanceData->props.width; } inline int Height() { return m_instanceData->props.height; } inline float PixelRatio() { return m_instanceData->props.pixelRatio; } inline std::string Name() { return m_instanceData->props.name; } inline std::string Presets() { return m_instanceData->props.presets; } inline std::string Profile() { return m_instanceData->props.profile; } private: void SetAddonStruct(KODI_HANDLE instance) { if (instance == nullptr) throw std::logic_error("kodi::addon::CInstanceScreensaver: Creation with empty addon structure not allowed, table must be given from Kodi!"); m_instanceData = static_cast(instance); m_instanceData->toAddon.addonInstance = this; m_instanceData->toAddon.Start = ADDON_Start; m_instanceData->toAddon.Stop = ADDON_Stop; m_instanceData->toAddon.Render = ADDON_Render; } inline static bool ADDON_Start(AddonInstance_Screensaver* instance) { return instance->toAddon.addonInstance->Start(); } inline static void ADDON_Stop(AddonInstance_Screensaver* instance) { instance->toAddon.addonInstance->Stop(); } inline static void ADDON_Render(AddonInstance_Screensaver* instance) { instance->toAddon.addonInstance->Render(); } AddonInstance_Screensaver* m_instanceData; }; } /* namespace addon */ } /* namespace kodi */