AddonPtr CAddonMgr::GetAddonFromDescriptor(const cp_plugin_info_t *info, const CStdString& type) { if (!info) return AddonPtr(); if (!info->extensions) { // no extensions, so we need only the dep information return AddonPtr(new CAddon(info)); } // FIXME: If we want to support multiple extension points per addon, we'll need to extend this to not just take // the first extension point (eg use the TYPE information we pass in) // grab a relevant extension point, ignoring our xbmc.addon.metadata extension point for (unsigned int i = 0; i < info->num_extensions; ++i) { if (0 != strcmp("xbmc.addon.metadata", info->extensions[i].ext_point_id) && (type.empty() || 0 == strcmp(type.c_str(), info->extensions[i].ext_point_id))) { // note that Factory takes care of whether or not we have platform support return Factory(&info->extensions[i]); } } return AddonPtr(); }
bool CScreenSaver::CreateScreenSaver() { if (CScriptInvocationManager::GetInstance().HasLanguageInvoker(LibPath())) { // Don't allow a previously-scheduled alarm to kill our new screensaver g_alarmClock.Stop(SCRIPT_ALARM, true); if (!CScriptInvocationManager::GetInstance().Stop(LibPath())) CScriptInvocationManager::GetInstance().ExecuteAsync(LibPath(), AddonPtr(new CScreenSaver(*this))); return true; } // pass it the screen width,height // and the name of the screensaver int iWidth = g_graphicsContext.GetWidth(); int iHeight = g_graphicsContext.GetHeight(); #ifdef HAS_DX m_info.device = g_Windowing.Get3D11Context(); #else m_info.device = NULL; #endif m_info.x = 0; m_info.y = 0; m_info.width = iWidth; m_info.height = iHeight; m_info.pixelRatio = g_graphicsContext.GetResInfo().fPixelRatio; m_info.name = strdup(Name().c_str()); m_info.presets = strdup(CSpecialProtocol::TranslatePath(Path()).c_str()); m_info.profile = strdup(CSpecialProtocol::TranslatePath(Profile()).c_str()); if (CAddonDll::Create(&m_struct, &m_info) == ADDON_STATUS_OK) return true; return false; }
AddonPtr CAddonDll::GetRunningInstance() const { if (CServiceBroker::IsBinaryAddonCacheUp()) return CServiceBroker::GetBinaryAddonManager().GetRunningAddon(ID()); return AddonPtr(); }
AddonPtr CAddonMgr::AddonFromProps(AddonProps& addonProps) { switch (addonProps.type) { case ADDON_PLUGIN: case ADDON_SCRIPT: return AddonPtr(new CPluginSource(addonProps)); case ADDON_SCRIPT_LIBRARY: case ADDON_SCRIPT_LYRICS: case ADDON_SCRIPT_WEATHER: case ADDON_SCRIPT_SUBTITLES: case ADDON_SCRIPT_MODULE: case ADDON_WEB_INTERFACE: return AddonPtr(new CAddon(addonProps)); case ADDON_SERVICE: return AddonPtr(new CService(addonProps)); case ADDON_SCRAPER_ALBUMS: case ADDON_SCRAPER_ARTISTS: case ADDON_SCRAPER_MOVIES: case ADDON_SCRAPER_MUSICVIDEOS: case ADDON_SCRAPER_TVSHOWS: case ADDON_SCRAPER_LIBRARY: return AddonPtr(new CScraper(addonProps)); case ADDON_SKIN: return AddonPtr(new CSkinInfo(addonProps)); #if defined(HAS_VISUALISATION) case ADDON_VIZ: return AddonPtr(new CVisualisation(addonProps)); #endif case ADDON_SCREENSAVER: return AddonPtr(new CScreenSaver(addonProps)); case ADDON_VIZ_LIBRARY: return AddonPtr(new CAddonLibrary(addonProps)); case ADDON_REPOSITORY: return AddonPtr(new CRepository(addonProps)); default: break; } return AddonPtr(); }
AddonPtr CAddonMgr::GetAddonFromDescriptor(const cp_plugin_info_t *info, const std::string& type) { if (!info) return AddonPtr(); if (!info->extensions && type.empty()) { // no extensions, so we need only the dep information return AddonPtr(new CAddon(info)); } // grab a relevant extension point, ignoring our kodi.addon.metadata extension point for (unsigned int i = 0; i < info->num_extensions; ++i) { if (0 != strcmp("xbmc.addon.metadata" , info->extensions[i].ext_point_id) && //<! backword compatibilty 0 != strcmp("kodi.addon.metadata" , info->extensions[i].ext_point_id) && (type.empty() || 0 == strcmp(type.c_str(), info->extensions[i].ext_point_id))) { // note that Factory takes care of whether or not we have platform support return Factory(&info->extensions[i]); } } return AddonPtr(); }
bool CScreenSaver::CreateScreenSaver() { #ifdef HAS_PYTHON if (URIUtils::HasExtension(LibPath(), ".py")) { // Don't allow a previously-scheduled alarm to kill our new screensaver g_alarmClock.Stop(PYTHON_ALARM, true); if (!g_pythonParser.StopScript(LibPath())) g_pythonParser.evalFile(LibPath(), AddonPtr(new CScreenSaver(Props()))); return true; } #endif // pass it the screen width,height // and the name of the screensaver int iWidth = g_graphicsContext.GetWidth(); int iHeight = g_graphicsContext.GetHeight(); m_pInfo = new SCR_PROPS; #ifdef HAS_DX m_pInfo->device = g_Windowing.Get3DDevice(); #else m_pInfo->device = NULL; #endif m_pInfo->x = 0; m_pInfo->y = 0; m_pInfo->width = iWidth; m_pInfo->height = iHeight; m_pInfo->pixelRatio = CDisplaySettings::Get().GetResolutionInfo(g_graphicsContext.GetVideoResolution()).fPixelRatio; m_pInfo->name = strdup(Name().c_str()); m_pInfo->presets = strdup(CSpecialProtocol::TranslatePath(Path()).c_str()); m_pInfo->profile = strdup(CSpecialProtocol::TranslatePath(Profile()).c_str()); if (CAddonDll<DllScreenSaver, ScreenSaver, SCR_PROPS>::Create() == ADDON_STATUS_OK) return true; return false; }
AddonPtr CService::Clone() const { return AddonPtr(new CService(*this)); }
AddonPtr CAudioDecoder::Clone() const { // Copy constructor is generated by compiler and calls parent copy constructor return AddonPtr(new CAudioDecoder(*this)); }
AddonPtr CVFSEntry::Clone() const { // Copy constructor is generated by compiler and calls parent copy constructor return AddonPtr(new CVFSEntry(*this)); }
std::shared_ptr<IAddon> CAddonBuilder::Build() { if (m_built) throw std::logic_error("Already built"); if (m_addonInfo.m_id.empty()) return nullptr; m_built = true; if (m_addonInfo.m_mainType == ADDON_UNKNOWN) return std::make_shared<CAddon>(std::move(m_addonInfo)); if (m_extPoint == nullptr) return FromProps(std::move(m_addonInfo)); const TYPE type(m_addonInfo.m_mainType); // Handle screensaver special cases if (type == ADDON_SCREENSAVER) { // built in screensaver or python screensaver if (StringUtils::StartsWithNoCase(m_extPoint->plugin->identifier, "screensaver.xbmc.builtin.") || URIUtils::HasExtension(CAddonMgr::GetInstance().GetExtValue(m_extPoint->configuration, "@library"), ".py")) return std::make_shared<CAddon>(std::move(m_addonInfo)); } // Handle audio encoder special cases if (type == ADDON_AUDIOENCODER) { // built in audio encoder if (StringUtils::StartsWithNoCase(m_extPoint->plugin->identifier, "audioencoder.kodi.builtin.")) return std::make_shared<CAddonDll>(std::move(m_addonInfo)); } // Ensure binary types have a valid library for the platform if (type == ADDON_VIZ || type == ADDON_SCREENSAVER || type == ADDON_PVRDLL || type == ADDON_ADSPDLL || type == ADDON_AUDIOENCODER || type == ADDON_AUDIODECODER || type == ADDON_VFS || type == ADDON_IMAGEDECODER || type == ADDON_INPUTSTREAM || type == ADDON_PERIPHERALDLL || type == ADDON_GAMEDLL) { std::string value = CAddonMgr::GetInstance().GetPlatformLibraryName(m_extPoint->plugin->extensions->configuration); if (value.empty()) return AddonPtr(); } switch (type) { case ADDON_PLUGIN: case ADDON_SCRIPT: return CPluginSource::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_SCRIPT_LIBRARY: case ADDON_SCRIPT_LYRICS: case ADDON_SCRIPT_MODULE: case ADDON_SUBTITLE_MODULE: case ADDON_SCRIPT_WEATHER: return std::make_shared<CAddon>(std::move(m_addonInfo)); case ADDON_WEB_INTERFACE: return CWebinterface::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_SERVICE: return CService::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_SCRAPER_ALBUMS: case ADDON_SCRAPER_ARTISTS: case ADDON_SCRAPER_MOVIES: case ADDON_SCRAPER_MUSICVIDEOS: case ADDON_SCRAPER_TVSHOWS: case ADDON_SCRAPER_LIBRARY: return CScraper::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_ADSPDLL: case ADDON_AUDIOENCODER: case ADDON_IMAGEDECODER: case ADDON_VIZ: case ADDON_SCREENSAVER: return std::make_shared<CAddonDll>(std::move(m_addonInfo)); case ADDON_PVRDLL: return std::make_shared<PVR::CPVRClient>(std::move(m_addonInfo)); case ADDON_AUDIODECODER: return CAudioDecoder::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_INPUTSTREAM: return CInputStream::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_PERIPHERALDLL: return PERIPHERALS::CPeripheralAddon::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_GAMEDLL: return GAME::CGameClient::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_VFS: return CVFSEntry::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_SKIN: return CSkinInfo::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_RESOURCE_IMAGES: return CImageResource::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_RESOURCE_GAMES: return CGameResource::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_RESOURCE_LANGUAGE: return CLanguageResource::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_RESOURCE_UISOUNDS: return std::make_shared<CUISoundsResource>(std::move(m_addonInfo)); case ADDON_REPOSITORY: return CRepository::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_CONTEXT_ITEM: return CContextMenuAddon::FromExtension(std::move(m_addonInfo), m_extPoint); case ADDON_GAME_CONTROLLER: return GAME::CController::FromExtension(std::move(m_addonInfo), m_extPoint); default: break; } return AddonPtr(); }
AddonPtr CAddonBuilder::FromProps(CAddonInfo addonInfo) { // FIXME: there is no need for this as none of the derived classes will contain any useful // information. We should return CAddon instances only, however there are several places that // down casts, which need to fixed first. switch (addonInfo.m_mainType) { case ADDON_PLUGIN: case ADDON_SCRIPT: return AddonPtr(new CPluginSource(std::move(addonInfo))); case ADDON_SCRIPT_LIBRARY: case ADDON_SCRIPT_LYRICS: case ADDON_SCRIPT_WEATHER: case ADDON_SCRIPT_MODULE: case ADDON_SUBTITLE_MODULE: return AddonPtr(new CAddon(std::move(addonInfo))); case ADDON_WEB_INTERFACE: return AddonPtr(new CWebinterface(std::move(addonInfo))); case ADDON_SERVICE: return AddonPtr(new CService(std::move(addonInfo))); case ADDON_SCRAPER_ALBUMS: case ADDON_SCRAPER_ARTISTS: case ADDON_SCRAPER_MOVIES: case ADDON_SCRAPER_MUSICVIDEOS: case ADDON_SCRAPER_TVSHOWS: case ADDON_SCRAPER_LIBRARY: return AddonPtr(new CScraper(std::move(addonInfo))); case ADDON_SKIN: return AddonPtr(new CSkinInfo(std::move(addonInfo))); case ADDON_ADSPDLL: case ADDON_AUDIOENCODER: case ADDON_IMAGEDECODER: case ADDON_VIZ: case ADDON_SCREENSAVER: return AddonPtr(new CAddonDll(std::move(addonInfo))); case ADDON_PVRDLL: return AddonPtr(new PVR::CPVRClient(std::move(addonInfo))); case ADDON_AUDIODECODER: return AddonPtr(new CAudioDecoder(std::move(addonInfo))); case ADDON_RESOURCE_IMAGES: return AddonPtr(new CImageResource(std::move(addonInfo))); case ADDON_RESOURCE_GAMES: return AddonPtr(new CGameResource(std::move(addonInfo))); case ADDON_RESOURCE_LANGUAGE: return AddonPtr(new CLanguageResource(std::move(addonInfo))); case ADDON_RESOURCE_UISOUNDS: return AddonPtr(new CUISoundsResource(std::move(addonInfo))); case ADDON_REPOSITORY: return AddonPtr(new CRepository(std::move(addonInfo))); case ADDON_CONTEXT_ITEM: return AddonPtr(new CContextMenuAddon(std::move(addonInfo))); case ADDON_INPUTSTREAM: return AddonPtr(new CInputStream(std::move(addonInfo))); case ADDON_PERIPHERALDLL: return AddonPtr(new PERIPHERALS::CPeripheralAddon(std::move(addonInfo), false, false)); //! @todo implement case ADDON_GAME_CONTROLLER: return AddonPtr(new GAME::CController(std::move(addonInfo))); case ADDON_GAMEDLL: return AddonPtr(new GAME::CGameClient(std::move(addonInfo))); case ADDON_VFS: return AddonPtr(new CVFSEntry(std::move(addonInfo),"","",false,false,false)); default: break; } return AddonPtr(); }
std::shared_ptr<IAddon> CAddonBuilder::Build() { if (m_built) throw std::logic_error("Already built"); if (m_props.id.empty()) return nullptr; m_built = true; if (m_props.type == ADDON_UNKNOWN) return std::make_shared<CAddon>(std::move(m_props)); if (m_extPoint == nullptr) return FromProps(std::move(m_props)); const TYPE type(m_props.type); switch (type) { case ADDON_PLUGIN: case ADDON_SCRIPT: return CPluginSource::FromExtension(std::move(m_props), m_extPoint); case ADDON_SCRIPT_LIBRARY: case ADDON_SCRIPT_LYRICS: case ADDON_SCRIPT_MODULE: case ADDON_SUBTITLE_MODULE: case ADDON_SCRIPT_WEATHER: return std::make_shared<CAddon>(std::move(m_props)); case ADDON_WEB_INTERFACE: return CWebinterface::FromExtension(std::move(m_props), m_extPoint); case ADDON_SERVICE: return CService::FromExtension(std::move(m_props), m_extPoint); case ADDON_SCRAPER_ALBUMS: case ADDON_SCRAPER_ARTISTS: case ADDON_SCRAPER_MOVIES: case ADDON_SCRAPER_MUSICVIDEOS: case ADDON_SCRAPER_TVSHOWS: case ADDON_SCRAPER_LIBRARY: return CScraper::FromExtension(std::move(m_props), m_extPoint); case ADDON_VIZ: case ADDON_SCREENSAVER: case ADDON_PVRDLL: case ADDON_ADSPDLL: case ADDON_AUDIOENCODER: case ADDON_AUDIODECODER: case ADDON_INPUTSTREAM: case ADDON_PERIPHERALDLL: { // begin temporary platform handling for Dlls // ideally platforms issues will be handled by C-Pluff // this is not an attempt at a solution std::string value; if (type == ADDON_SCREENSAVER && 0 == strnicmp(m_extPoint->plugin->identifier, "screensaver.xbmc.builtin.", 25)) { // built in screensaver return std::make_shared<CAddon>(std::move(m_props)); } if (type == ADDON_SCREENSAVER) { // Python screensaver std::string library = CAddonMgr::GetInstance().GetExtValue(m_extPoint->configuration, "@library"); if (URIUtils::HasExtension(library, ".py")) return std::make_shared<CScreenSaver>(std::move(m_props)); } if (type == ADDON_AUDIOENCODER && 0 == strncmp(m_extPoint->plugin->identifier, "audioencoder.xbmc.builtin.", 26)) { // built in audio encoder return CAudioEncoder::FromExtension(std::move(m_props), m_extPoint); } value = CAddonMgr::GetInstance().GetPlatformLibraryName(m_extPoint->plugin->extensions->configuration); if (value.empty()) break; if (type == ADDON_VIZ) { #if defined(HAS_VISUALISATION) return std::make_shared<CVisualisation>(std::move(m_props)); #endif } else if (type == ADDON_PVRDLL) { #ifdef HAS_PVRCLIENTS return PVR::CPVRClient::FromExtension(std::move(m_props), m_extPoint); #endif } else if (type == ADDON_ADSPDLL) { return std::make_shared<ActiveAE::CActiveAEDSPAddon>(std::move(m_props)); } else if (type == ADDON_AUDIOENCODER) return CAudioEncoder::FromExtension(std::move(m_props), m_extPoint); else if (type == ADDON_AUDIODECODER) return CAudioDecoder::FromExtension(std::move(m_props), m_extPoint); else if (type == ADDON_INPUTSTREAM) return CInputStream::FromExtension(std::move(m_props), m_extPoint); else if (type == ADDON_SCREENSAVER) return std::make_shared<CScreenSaver>(std::move(m_props)); else if (type == ADDON_PERIPHERALDLL) return PERIPHERALS::CPeripheralAddon::FromExtension(std::move(m_props), m_extPoint); break; } case ADDON_SKIN: return CSkinInfo::FromExtension(std::move(m_props), m_extPoint); case ADDON_RESOURCE_IMAGES: return CImageResource::FromExtension(std::move(m_props), m_extPoint); case ADDON_RESOURCE_LANGUAGE: return CLanguageResource::FromExtension(std::move(m_props), m_extPoint); case ADDON_RESOURCE_UISOUNDS: return std::make_shared<CUISoundsResource>(std::move(m_props)); case ADDON_REPOSITORY: return CRepository::FromExtension(std::move(m_props), m_extPoint); case ADDON_CONTEXT_ITEM: return CContextMenuAddon::FromExtension(std::move(m_props), m_extPoint); case ADDON_GAME_CONTROLLER: return GAME::CController::FromExtension(std::move(m_props), m_extPoint); default: break; } return AddonPtr(); }
AddonPtr CSkinInfo::Clone() const { return AddonPtr(new CSkinInfo(*this)); }
AddonPtr CUISoundsResource::Clone() const { return AddonPtr(new CUISoundsResource(*this)); }
AddonPtr CLanguageResource::Clone() const { return AddonPtr(new CLanguageResource(*this)); }
AddonPtr CAddonMgr::Factory(const cp_extension_t *props) { if (!PlatformSupportsAddon(props->plugin)) return AddonPtr(); /* Check if user directories need to be created */ const cp_cfg_element_t *settings = GetExtElement(props->configuration, "settings"); if (settings) CheckUserDirs(settings); const TYPE type = TranslateType(props->ext_point_id); switch (type) { case ADDON_PLUGIN: case ADDON_SCRIPT: return AddonPtr(new CPluginSource(props)); case ADDON_SCRIPT_LIBRARY: case ADDON_SCRIPT_LYRICS: case ADDON_SCRIPT_SUBTITLES: case ADDON_SCRIPT_MODULE: case ADDON_WEB_INTERFACE: return AddonPtr(new CAddon(props)); case ADDON_SCRIPT_WEATHER: { // Eden (API v2.0) broke old weather add-ons AddonPtr result(new CAddon(props)); AddonVersion ver1 = AddonVersion(GetXbmcApiVersionDependency(result)); AddonVersion ver2 = AddonVersion("2.0"); if (ver1 < ver2) { CLog::Log(LOGINFO,"%s: Weather add-ons for api < 2.0 unsupported (%s)",__FUNCTION__,result->ID().c_str()); return AddonPtr(); } return result; } case ADDON_SERVICE: return AddonPtr(new CService(props)); case ADDON_SCRAPER_ALBUMS: case ADDON_SCRAPER_ARTISTS: case ADDON_SCRAPER_MOVIES: case ADDON_SCRAPER_MUSICVIDEOS: case ADDON_SCRAPER_TVSHOWS: case ADDON_SCRAPER_LIBRARY: return AddonPtr(new CScraper(props)); case ADDON_VIZ: case ADDON_SCREENSAVER: case ADDON_PVRDLL: { // begin temporary platform handling for Dlls // ideally platforms issues will be handled by C-Pluff // this is not an attempt at a solution CStdString value; if (type == ADDON_SCREENSAVER && 0 == strnicmp(props->plugin->identifier, "screensaver.xbmc.builtin.", 25)) { // built in screensaver return AddonPtr(new CAddon(props)); } if (type == ADDON_SCREENSAVER) { // Python screensaver CStdString library = CAddonMgr::Get().GetExtValue(props->configuration, "@library"); if (URIUtils::GetExtension(library).Equals(".py", false)) return AddonPtr(new CScreenSaver(props)); } #if defined(TARGET_ANDROID) if ((value = GetExtValue(props->plugin->extensions->configuration, "@library_android")) && value.empty()) break; #elif defined(_LINUX) && !defined(TARGET_DARWIN) if ((value = GetExtValue(props->plugin->extensions->configuration, "@library_linux")) && value.empty()) break; #elif defined(_WIN32) && defined(HAS_SDL_OPENGL) if ((value = GetExtValue(props->plugin->extensions->configuration, "@library_wingl")) && value.empty()) break; #elif defined(_WIN32) && defined(HAS_DX) if ((value = GetExtValue(props->plugin->extensions->configuration, "@library_windx")) && value.empty()) break; #elif defined(TARGET_DARWIN) if ((value = GetExtValue(props->plugin->extensions->configuration, "@library_osx")) && value.empty()) break; #endif if (type == ADDON_VIZ) { #if defined(HAS_VISUALISATION) return AddonPtr(new CVisualisation(props)); #endif } else if (type == ADDON_PVRDLL) { #ifdef HAS_PVRCLIENTS return AddonPtr(new CPVRClient(props)); #endif } else return AddonPtr(new CScreenSaver(props)); } case ADDON_SKIN: return AddonPtr(new CSkinInfo(props)); case ADDON_VIZ_LIBRARY: return AddonPtr(new CAddonLibrary(props)); case ADDON_REPOSITORY: return AddonPtr(new CRepository(props)); default: break; } return AddonPtr(); }
AddonPtr CAddonMgr::Factory(const cp_extension_t *props) { if (!PlatformSupportsAddon(props->plugin)) return AddonPtr(); /* Check if user directories need to be created */ const cp_cfg_element_t *settings = GetExtElement(props->configuration, "settings"); if (settings) CheckUserDirs(settings); const TYPE type = TranslateType(props->ext_point_id); switch (type) { case ADDON_PLUGIN: case ADDON_SCRIPT: return AddonPtr(new CPluginSource(props)); case ADDON_SCRIPT_LIBRARY: case ADDON_SCRIPT_LYRICS: case ADDON_SCRIPT_WEATHER: case ADDON_SCRIPT_SUBTITLES: case ADDON_SCRIPT_MODULE: case ADDON_WEB_INTERFACE: return AddonPtr(new CAddon(props)); case ADDON_SERVICE: return AddonPtr(new CService(props)); case ADDON_SCRAPER_ALBUMS: case ADDON_SCRAPER_ARTISTS: case ADDON_SCRAPER_MOVIES: case ADDON_SCRAPER_MUSICVIDEOS: case ADDON_SCRAPER_TVSHOWS: case ADDON_SCRAPER_LIBRARY: return AddonPtr(new CScraper(props)); case ADDON_VIZ: case ADDON_SCREENSAVER: { // begin temporary platform handling for Dlls // ideally platforms issues will be handled by C-Pluff // this is not an attempt at a solution CStdString value; if (type == ADDON_SCREENSAVER && 0 == strnicmp(props->plugin->identifier, "screensaver.xbmc.builtin.", 25)) { // built in screensaver return AddonPtr(new CAddon(props)); } #if defined(_LINUX) && !defined(__APPLE__) if ((value = GetExtValue(props->plugin->extensions->configuration, "@library_linux")) && value.empty()) break; #elif defined(_WIN32) && defined(HAS_SDL_OPENGL) if ((value = GetExtValue(props->plugin->extensions->configuration, "@library_wingl")) && value.empty()) break; #elif defined(_WIN32) && defined(HAS_DX) if ((value = GetExtValue(props->plugin->extensions->configuration, "@library_windx")) && value.empty()) break; #elif defined(__APPLE__) if ((value = GetExtValue(props->plugin->extensions->configuration, "@library_osx")) && value.empty()) break; #elif defined(_XBOX) if ((value = GetExtValue(props->plugin->extensions->configuration, "@library_xbox")) && value.empty()) break; #endif if (type == ADDON_VIZ) { #if defined(HAS_VISUALISATION) return AddonPtr(new CVisualisation(props)); #endif } else return AddonPtr(new CScreenSaver(props)); } case ADDON_SKIN: return AddonPtr(new CSkinInfo(props)); case ADDON_VIZ_LIBRARY: return AddonPtr(new CAddonLibrary(props)); case ADDON_REPOSITORY: return AddonPtr(new CRepository(props)); default: break; } return AddonPtr(); }
AddonPtr CScreenSaver::Clone() const { // Copy constructor is generated by compiler and calls parent copy constructor return AddonPtr(new CScreenSaver(*this)); }