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(); }
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(); }