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: { // 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(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 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(); }
bool CAddonsDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items) { CStdString path1(strPath); URIUtils::RemoveSlashAtEnd(path1); CURL path(path1); items.ClearProperties(); items.SetContent("addons"); VECADDONS addons; // get info from repository bool reposAsFolders = true; if (path.GetHostName().Equals("enabled")) { CAddonMgr::Get().GetAllAddons(addons, true); items.SetProperty("reponame",g_localizeStrings.Get(24062)); items.SetLabel(g_localizeStrings.Get(24062)); } else if (path.GetHostName().Equals("disabled")) { // grab all disabled addons, including disabled repositories reposAsFolders = false; CAddonMgr::Get().GetAllAddons(addons, false, true); items.SetProperty("reponame",g_localizeStrings.Get(24039)); items.SetLabel(g_localizeStrings.Get(24039)); } else if (path.GetHostName().Equals("outdated")) { reposAsFolders = false; CAddonMgr::Get().GetAllOutdatedAddons(addons); items.SetProperty("reponame",g_localizeStrings.Get(24043)); items.SetLabel(g_localizeStrings.Get(24043)); } else if (path.GetHostName().Equals("repos")) { CAddonMgr::Get().GetAddons(ADDON_REPOSITORY,addons,true); items.SetLabel(g_localizeStrings.Get(24033)); // Get Add-ons } else if (path.GetHostName().Equals("sources")) { return GetScriptsAndPlugins(path.GetFileName(), items); } else if (path.GetHostName().Equals("all")) { CAddonDatabase database; database.Open(); database.GetAddons(addons); items.SetProperty("reponame",g_localizeStrings.Get(24032)); items.SetLabel(g_localizeStrings.Get(24032)); } else if (path.GetHostName().Equals("search")) { CStdString search(path.GetFileName()); if (search.IsEmpty() && !GetKeyboardInput(16017, search)) return false; items.SetProperty("reponame",g_localizeStrings.Get(283)); items.SetLabel(g_localizeStrings.Get(283)); CAddonDatabase database; database.Open(); database.Search(search, addons); GenerateListing(path, addons, items, true); path.SetFileName(search); items.SetPath(path.Get()); return true; } else { reposAsFolders = false; AddonPtr addon; CAddonMgr::Get().GetAddon(path.GetHostName(),addon); if (!addon) return false; // ensure our repos are up to date CAddonInstaller::Get().UpdateRepos(false, true); CAddonDatabase database; database.Open(); database.GetRepository(addon->ID(),addons); items.SetProperty("reponame",addon->Name()); items.SetLabel(addon->Name()); } if (path.GetFileName().IsEmpty()) { if (!path.GetHostName().Equals("repos")) { for (int i=ADDON_UNKNOWN+1;i<ADDON_VIZ_LIBRARY;++i) { for (unsigned int j=0;j<addons.size();++j) { if (addons[j]->IsType((TYPE)i)) { CFileItemPtr item(new CFileItem(TranslateType((TYPE)i,true))); item->SetPath(URIUtils::AddFileToFolder(strPath,TranslateType((TYPE)i,false))); item->m_bIsFolder = true; CStdString thumb = GetIcon((TYPE)i); if (!thumb.IsEmpty() && g_TextureManager.HasTexture(thumb)) item->SetArt("thumb", thumb); items.Add(item); break; } } } items.SetPath(strPath); return true; } } else { TYPE type = TranslateType(path.GetFileName()); items.SetProperty("addoncategory",TranslateType(type, true)); items.SetLabel(TranslateType(type, true)); items.SetPath(strPath); // FIXME: Categorisation of addons needs adding here for (unsigned int j=0;j<addons.size();++j) { if (!addons[j]->IsType(type)) addons.erase(addons.begin()+j--); } } items.SetPath(strPath); GenerateListing(path, addons, items, reposAsFolders); // check for available updates if (path.GetHostName().Equals("enabled")) { CAddonDatabase database; database.Open(); for (int i=0;i<items.Size();++i) { AddonPtr addon2; database.GetAddon(items[i]->GetProperty("Addon.ID").asString(),addon2); if (addon2 && addon2->Version() > AddonVersion(items[i]->GetProperty("Addon.Version").asString()) && !database.IsAddonBlacklisted(addon2->ID(),addon2->Version().c_str())) { items[i]->SetProperty("Addon.Status",g_localizeStrings.Get(24068)); items[i]->SetProperty("Addon.UpdateAvail", true); } } } if (path.GetHostName().Equals("repos") && items.Size() > 1) { CFileItemPtr item(new CFileItem("addons://all/",true)); item->SetLabel(g_localizeStrings.Get(24032)); items.Add(item); } return true; }
AddonVersion IAddonInstanceHandler::Version() const { return m_addon ? m_addon->Version() : AddonVersion("0.0.0"); }
bool CAddonsDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items) { CStdString path1(strPath); CUtil::RemoveSlashAtEnd(path1); CURL path(path1); items.ClearProperties(); items.SetContent("addons"); VECADDONS addons; // get info from repository bool reposAsFolders = true; if (path.GetHostName().Equals("enabled")) { CAddonMgr::Get().GetAllAddons(addons, true); items.SetProperty("reponame",g_localizeStrings.Get(24062)); } else if (path.GetHostName().Equals("disabled")) { // grab all disabled addons, including disabled repositories reposAsFolders = false; CAddonMgr::Get().GetAllAddons(addons, false, true); items.SetProperty("reponame",g_localizeStrings.Get(24039)); } else if (path.GetHostName().Equals("outdated")) { reposAsFolders = false; CAddonMgr::Get().GetAllOutdatedAddons(addons); items.SetProperty("reponame",g_localizeStrings.Get(24043)); } else if (path.GetHostName().Equals("repos")) { CAddonMgr::Get().GetAddons(ADDON_REPOSITORY,addons,true); } else if (path.GetHostName().Equals("sources")) { return GetScriptsAndPlugins(path.GetFileName(), items); } else if (path.GetHostName().Equals("all")) { CAddonDatabase database; database.Open(); database.GetAddons(addons); items.SetProperty("reponame",g_localizeStrings.Get(24032)); } else { AddonPtr addon; CAddonMgr::Get().GetAddon(path.GetHostName(),addon); if (!addon) return false; CAddonDatabase database; database.Open(); if (!database.GetRepository(addon->ID(),addons)) { RepositoryPtr repo = boost::dynamic_pointer_cast<CRepository>(addon); addons = CRepositoryUpdateJob::GrabAddons(repo,false); } items.SetProperty("reponame",addon->Name()); } if (path.GetFileName().IsEmpty()) { if (!path.GetHostName().Equals("repos")) { for (int i=ADDON_UNKNOWN+1;i<ADDON_VIZ_LIBRARY;++i) { for (unsigned int j=0;j<addons.size();++j) { if (addons[j]->IsType((TYPE)i)) { CFileItemPtr item(new CFileItem(TranslateType((TYPE)i,true))); item->m_strPath = CUtil::AddFileToFolder(strPath,TranslateType((TYPE)i,false)); item->m_bIsFolder = true; CStdString thumb = GetIcon((TYPE)i); if (!thumb.IsEmpty() && g_TextureManager.HasTexture(thumb)) item->SetThumbnailImage(thumb); items.Add(item); break; } } } items.m_strPath = strPath; return true; } } else { TYPE type = TranslateType(path.GetFileName()); items.SetProperty("addoncategory",TranslateType(type, true)); items.m_strPath = strPath; // FIXME: Categorisation of addons needs adding here for (unsigned int j=0;j<addons.size();++j) { if (!addons[j]->IsType(type)) addons.erase(addons.begin()+j--); } } items.m_strPath = strPath; GenerateListing(path, addons, items, reposAsFolders); // check for available updates if (path.GetHostName().Equals("enabled")) { CAddonDatabase database; database.Open(); for (int i=0;i<items.Size();++i) { AddonPtr addon2; database.GetAddon(items[i]->GetProperty("Addon.ID"),addon2); if (addon2 && addon2->Version() > AddonVersion(items[i]->GetProperty("Addon.Version"))) { items[i]->SetProperty("Addon.Status",g_localizeStrings.Get(24068)); items[i]->SetProperty("Addon.UpdateAvail","true"); } } } if (path.GetHostName().Equals("repos") && items.Size() > 1) { CFileItemPtr item(new CFileItem("addons://all/",true)); item->SetLabel(g_localizeStrings.Get(24032)); items.Add(item); } return true; }
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_MODULE: case ADDON_SUBTITLE_MODULE: return AddonPtr(new CAddon(props)); case ADDON_WEB_INTERFACE: return AddonPtr(new CWebinterface(props)); case ADDON_SCRIPT_WEATHER: { // Eden (API v2.0) broke old weather add-ons AddonPtr result(new CAddon(props)); AddonVersion ver1 = result->GetDependencyVersion("xbmc.python"); 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: case ADDON_AUDIOENCODER: { // 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(props->plugin->identifier, "screensaver.xbmc.builtin.", 25)) { // built in screensaver return AddonPtr(new CAddon(props)); } if (type == ADDON_SCREENSAVER) { // Python screensaver std::string library = CAddonMgr::Get().GetExtValue(props->configuration, "@library"); if (URIUtils::HasExtension(library, ".py")) return AddonPtr(new CScreenSaver(props)); } if (type == ADDON_AUDIOENCODER && 0 == strncmp(props->plugin->identifier, "audioencoder.xbmc.builtin.", 26)) { // built in audio encoder return AddonPtr(new CAudioEncoder(props)); } std::string tograb; #if defined(TARGET_ANDROID) tograb = "@library_android"; #elif defined(TARGET_LINUX) || defined(TARGET_FREEBSD) tograb = "@library_linux"; #elif defined(TARGET_WINDOWS) && defined(HAS_DX) tograb = "@library_windx"; #elif defined(TARGET_DARWIN) tograb = "@library_osx"; #endif value = GetExtValue(props->plugin->extensions->configuration, tograb.c_str()); if (value.empty()) break; 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 PVR::CPVRClient(props)); #endif } else if (type == ADDON_AUDIOENCODER) return AddonPtr(new CAudioEncoder(props)); 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)); case ADDON_CONTEXT_ITEM: return AddonPtr(new CContextItemAddon(props)); default: break; } return AddonPtr(); }