bool CAddonMgr::GetAddons(const TYPE &type, VECADDONS &addons, bool enabled /* = true */) { CSingleLock lock(m_critSection); addons.clear(); cp_status_t status; int num; CStdString ext_point(TranslateType(type)); cp_extension_t **exts = m_cpluff->get_extensions_info(m_cp_context, ext_point.c_str(), &status, &num); for(int i=0; i <num; i++) { const cp_extension_t *props = exts[i]; if (m_database.IsAddonDisabled(props->plugin->identifier) != enabled) { // get a pointer to a running pvrclient if it's already started, or we won't be able to change settings if (TranslateType(props->ext_point_id) == ADDON_PVRDLL && enabled && g_PVRManager.IsStarted()) { AddonPtr pvrAddon; if (g_PVRClients->GetClient(props->plugin->identifier, pvrAddon)) { addons.push_back(pvrAddon); continue; } } AddonPtr addon(Factory(props)); if (addon) addons.push_back(addon); } } m_cpluff->release_info(m_cp_context, exts); return addons.size() > 0; }
bool CAddonMgr::GetAddons(const TYPE &type, VECADDONS &addons, bool enabled /* = true */, bool bGetDisabledPVRAddons /* = true */) { CStdString xbmcPath = CSpecialProtocol::TranslatePath("special://xbmc/addons"); CSingleLock lock(m_critSection); addons.clear(); cp_status_t status; int num; CStdString ext_point(TranslateType(type)); cp_extension_t **exts = m_cpluff->get_extensions_info(m_cp_context, ext_point.c_str(), &status, &num); for(int i=0; i <num; i++) { const cp_extension_t *props = exts[i]; bool bIsPVRAddon(TranslateType(props->ext_point_id) == ADDON_PVRDLL); if (((bGetDisabledPVRAddons && bIsPVRAddon) || m_database.IsAddonDisabled(props->plugin->identifier) != enabled)) { if (bIsPVRAddon && g_PVRManager.IsStarted()) { AddonPtr pvrAddon; if (g_PVRClients->GetClient(props->plugin->identifier, pvrAddon)) { addons.push_back(pvrAddon); continue; } } AddonPtr addon(Factory(props)); if (addon) addons.push_back(addon); } } m_cpluff->release_info(m_cp_context, exts); return addons.size() > 0; }
void CAddonHelpers_PVR::PVRRecording(void *addonData, const char *Name, const char *FileName, bool On) { CAddonHelpers* addon = (CAddonHelpers*) addonData; if (addon == NULL) { CLog::Log(LOGERROR, "PVR: PVRRecording is called with NULL-Pointer!!!"); return; } CAddonHelpers_PVR* addonHelper = addon->GetHelperPVR(); CStdString line1; CStdString line2; if (On) line1.Format(g_localizeStrings.Get(19197), addonHelper->m_addon->Name()); else line1.Format(g_localizeStrings.Get(19198), addonHelper->m_addon->Name()); if (Name) line2 = Name; else if (FileName) line2 = FileName; else line2 = ""; g_application.m_guiDialogKaiToast.QueueNotification(CGUIDialogKaiToast::Info, line1, line2, 5000, false); CLog::Log(LOGDEBUG, "%s: %s-%s - Recording %s : %s %s", __FUNCTION__, TranslateType(addonHelper->m_addon->Type()).c_str(), addonHelper->m_addon->Name().c_str(), On ? "started" : "finished", Name, FileName); }
CFileItemPtr CAddonsDirectory::FileItemFromAddon(AddonPtr &addon, const CStdString &basePath, bool folder) { if (!addon) return CFileItemPtr(); // TODO: This can probably be done more efficiently CURL url(basePath); url.SetFileName(addon->ID()); CStdString path(url.Get()); if (folder) URIUtils::AddSlashAtEnd(path); CFileItemPtr item(new CFileItem(path, folder)); CStdString strLabel(addon->Name()); if (url.GetHostName().Equals("search")) strLabel.Format("%s - %s", TranslateType(addon->Type(), true), addon->Name()); item->SetLabel(strLabel); if (!(basePath.Equals("addons://") && addon->Type() == ADDON_REPOSITORY)) item->SetLabel2(addon->Version().c_str()); item->SetArt("thumb", addon->Icon()); item->SetLabelPreformated(true); item->SetIconImage("DefaultAddon.png"); if (!addon->FanArt().IsEmpty() && (URIUtils::IsInternetStream(addon->FanArt()) || CFile::Exists(addon->FanArt()))) { item->SetArt("fanart", addon->FanArt()); } CAddonDatabase::SetPropertiesFromAddon(addon, item); return item; }
bool CAddonMgr::GetAddon(const CStdString &str, AddonPtr &addon, const TYPE &type/*=ADDON_UNKNOWN*/, bool enabledOnly /*= true*/) { CSingleLock lock(m_critSection); cp_status_t status; cp_plugin_info_t *cpaddon = m_cpluff->get_plugin_info(m_cp_context, str.c_str(), &status); if (status == CP_OK && cpaddon) { addon = GetAddonFromDescriptor(cpaddon, type==ADDON_UNKNOWN?"":TranslateType(type)); m_cpluff->release_info(m_cp_context, cpaddon); if (addon && addon.get()) { if (enabledOnly && m_database.IsAddonDisabled(addon->ID())) return false; if (addon->Type() == ADDON_PVRDLL && g_PVRManager.IsStarted()) { AddonPtr pvrAddon; if (g_PVRClients->GetClient(addon->ID(), pvrAddon)) addon = pvrAddon; } } return NULL != addon.get(); } if (cpaddon) m_cpluff->release_info(m_cp_context, cpaddon); return false; }
bool CAddonMgr::GetAddon(const std::string &str, AddonPtr &addon, const TYPE &type/*=ADDON_UNKNOWN*/, bool enabledOnly /*= true*/) { CSingleLock lock(m_critSection); cp_status_t status; cp_plugin_info_t *cpaddon = m_cpluff->get_plugin_info(m_cp_context, str.c_str(), &status); if (status == CP_OK && cpaddon) { addon = GetAddonFromDescriptor(cpaddon, type==ADDON_UNKNOWN?"":TranslateType(type)); m_cpluff->release_info(m_cp_context, cpaddon); if (addon) { if (enabledOnly && IsAddonDisabled(addon->ID())) return false; // if the addon has a running instance, grab that AddonPtr runningAddon = addon->GetRunningInstance(); if (runningAddon) addon = runningAddon; } return NULL != addon.get(); } if (cpaddon) m_cpluff->release_info(m_cp_context, cpaddon); return false; }
bool CAddonMgr::GetAddons(const TYPE &type, VECADDONS &addons, bool enabled /* = true */) { CSingleLock lock(m_critSection); addons.clear(); if (!m_cp_context) return false; cp_status_t status; int num; std::string ext_point(TranslateType(type)); cp_extension_t **exts = m_cpluff->get_extensions_info(m_cp_context, ext_point.c_str(), &status, &num); for(int i=0; i <num; i++) { const cp_extension_t *props = exts[i]; if (IsAddonDisabled(props->plugin->identifier) != enabled) { AddonPtr addon(Factory(props)); if (addon) { if (enabled) { // if the addon has a running instance, grab that AddonPtr runningAddon = addon->GetRunningInstance(); if (runningAddon) addon = runningAddon; } addons.push_back(addon); } } } m_cpluff->release_info(m_cp_context, exts); return addons.size() > 0; }
ADDON_STATUS CAddonDll::Create(void* funcTable, void* info) { /* ensure that a previous instance is destroyed */ Destroy(); if (!funcTable) return ADDON_STATUS_PERMANENT_FAILURE; CLog::Log(LOGDEBUG, "ADDON: Dll Initializing - %s", Name().c_str()); m_initialized = false; if (!LoadDll()) return ADDON_STATUS_PERMANENT_FAILURE; /* Load add-on function table (written by add-on itself) */ m_pDll->GetAddon(funcTable); if (!CheckAPIVersion()) return ADDON_STATUS_PERMANENT_FAILURE; /* Allocate the helper function class to allow crosstalk over helper libraries */ m_pHelpers = new CAddonInterfaces(this); /* Call Create to make connections, initializing data or whatever is needed to become the AddOn running */ ADDON_STATUS status = m_pDll->Create(m_pHelpers->GetCallbacks(), info); if (status == ADDON_STATUS_OK) { m_initialized = true; } else if ((status == ADDON_STATUS_NEED_SETTINGS) || (status == ADDON_STATUS_NEED_SAVEDSETTINGS)) { m_needsavedsettings = (status == ADDON_STATUS_NEED_SAVEDSETTINGS); if ((status = TransferSettings()) == ADDON_STATUS_OK) m_initialized = true; else new CAddonStatusHandler(ID(), status, "", false); } else { // Addon failed initialization CLog::Log(LOGERROR, "ADDON: Dll %s - Client returned bad status (%i) from Create and is not usable", Name().c_str(), status); CGUIDialogOK* pDialog = g_windowManager.GetWindow<CGUIDialogOK>(WINDOW_DIALOG_OK); if (pDialog) { std::string heading = StringUtils::Format("%s: %s", TranslateType(Type(), true).c_str(), Name().c_str()); pDialog->SetHeading(CVariant{heading}); pDialog->SetLine(1, CVariant{24070}); pDialog->SetLine(2, CVariant{24071}); pDialog->Open(); } } return status; }
void CAddonHelpers_PVR::PVRTriggerRecordingUpdate(void *addonData) { CAddonHelpers* addon = (CAddonHelpers*) addonData; if (addon == NULL) { CLog::Log(LOGERROR, "PVR: PVRTriggerRecordingUpdate is called with NULL-Pointer!!!"); return; } CAddonHelpers_PVR* addonHelper = addon->GetHelperPVR(); CPVRManager::Get()->TriggerRecordingsUpdate(); CLog::Log(LOGDEBUG, "%s: %s-%s - Triggered Recording Update", __FUNCTION__, TranslateType(addonHelper->m_addon->Type()).c_str(), addonHelper->m_addon->Name().c_str()); }
void INVENTORY::ListInventory() { if (Inventory.size() == 0) { std::cout << "Your inventory is empty." << std::endl; return; } std::cout << "Inventory\n--------------------\n"; for (std::list<ITEM>::iterator itr = Inventory.begin(); itr != Inventory.end(); itr++) { std::cout << itr->Name << " x " << itr->Amount; std::cout << "\t" << TranslateType(itr->Type) << std::endl; } }
void INVENTORY::ListInventoryDetailed() { if (Inventory.size() == 0) { std::cout << "Your inventory is empty." << std::endl; return; } for (std::list<ITEM>::iterator itr = Inventory.begin(); itr != Inventory.end(); itr++) { std::cout << "Item Id: " << itr->Id; std::cout << "\tItem Name: " << itr->Name; std::cout << "\tItem Amount: " << itr->Amount; std::cout << "\tItem Type: " << TranslateType(itr->Type) << std::endl; } }
bool CAddonMgr::GetAddons(const TYPE &type, VECADDONS &addons, bool enabled /* = true */) { CSingleLock lock(m_critSection); addons.clear(); cp_status_t status; int num; CStdString ext_point(TranslateType(type)); cp_extension_t **exts = m_cpluff->get_extensions_info(m_cp_context, ext_point.c_str(), &status, &num); for(int i=0; i <num; i++) { AddonPtr addon(Factory(exts[i])); if (addon && m_database.IsAddonDisabled(addon->ID()) != enabled) addons.push_back(addon); } m_cpluff->release_info(m_cp_context, exts); return addons.size() > 0; }
void CAddonStatusHandler::Process() { CSingleLock lock(m_critSection); std::string heading = StringUtils::Format("%s: %s", TranslateType(m_addon->Type(), true).c_str(), m_addon->Name().c_str()); /* Request to restart the AddOn and data structures need updated */ if (m_status == ADDON_STATUS_NEED_RESTART) { CGUIDialogOK* pDialog = (CGUIDialogOK*)g_windowManager.GetWindow(WINDOW_DIALOG_OK); if (!pDialog) return; pDialog->SetHeading(CVariant{heading}); pDialog->SetLine(1, CVariant{24074}); pDialog->Open(); CAddonMgr::GetInstance().GetCallbackForType(m_addon->Type())->RequestRestart(m_addon, true); } /* Some required settings are missing/invalid */ else if ((m_status == ADDON_STATUS_NEED_SETTINGS) || (m_status == ADDON_STATUS_NEED_SAVEDSETTINGS)) { CGUIDialogYesNo* pDialogYesNo = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); if (!pDialogYesNo) return; pDialogYesNo->SetHeading(CVariant{heading}); pDialogYesNo->SetLine(1, CVariant{24070}); pDialogYesNo->SetLine(2, CVariant{24072}); pDialogYesNo->SetLine(3, CVariant{m_message}); pDialogYesNo->Open(); if (!pDialogYesNo->IsConfirmed()) return; if (!m_addon->HasSettings()) return; if (CGUIDialogAddonSettings::ShowAndGetInput(m_addon)) { //! @todo Doesn't dialogaddonsettings save these automatically? It should do this. m_addon->SaveSettings(); CAddonMgr::GetInstance().GetCallbackForType(m_addon->Type())->RequestRestart(m_addon, true); } } }
bool CAddonMgr::GetAddons(const TYPE &type, VECADDONS &addons, bool enabled /* = true */) { CStdString xbmcPath = _P("special://xbmc/addons"); CSingleLock lock(m_critSection); addons.clear(); cp_status_t status; int num; CStdString ext_point(TranslateType(type)); cp_extension_t **exts = m_cpluff->get_extensions_info(m_cp_context, ext_point.c_str(), &status, &num); for(int i=0; i <num; i++) { AddonPtr addon(Factory(exts[i])); if (addon && addon->Type() == ADDON_PVRDLL && addon->Path().Left(xbmcPath.size()).Equals(xbmcPath)) { if (m_database.IsSystemPVRAddonEnabled(addon->ID()) != enabled) addon->Disable(); } if (addon && m_database.IsAddonDisabled(addon->ID()) != enabled) addons.push_back(addon); } m_cpluff->release_info(m_cp_context, exts); return addons.size() > 0; }
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; }
void CAddonStatusHandler::Process() { CSingleLock lock(m_critSection); CStdString heading; heading.Format("%s: %s", TranslateType(m_addon->Type(), true).c_str(), m_addon->Name().c_str()); /* AddOn lost connection to his backend (for ones that use Network) */ if (m_status == ADDON_STATUS_LOST_CONNECTION && m_addon->Type() != ADDON_PVRDLL) // TODO display a proper message for pvr addons, but don't popup a dialog that requires user action { CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); if (!pDialog) return; pDialog->SetHeading(heading); pDialog->SetLine(1, 24070); pDialog->SetLine(2, 24073); //send message and wait for user input ThreadMessage tMsg = {TMSG_DIALOG_DOMODAL, WINDOW_DIALOG_YES_NO, g_windowManager.GetActiveWindow()}; g_application.getApplicationMessenger().SendMessage(tMsg, true); if (pDialog->IsConfirmed()) CAddonMgr::Get().GetCallbackForType(m_addon->Type())->RequestRestart(m_addon, false); } /* Request to restart the AddOn and data structures need updated */ else if (m_status == ADDON_STATUS_NEED_RESTART) { CGUIDialogOK* pDialog = (CGUIDialogOK*)g_windowManager.GetWindow(WINDOW_DIALOG_OK); if (!pDialog) return; pDialog->SetHeading(heading); pDialog->SetLine(1, 24074); //send message and wait for user input ThreadMessage tMsg = {TMSG_DIALOG_DOMODAL, WINDOW_DIALOG_OK, g_windowManager.GetActiveWindow()}; g_application.getApplicationMessenger().SendMessage(tMsg, true); CAddonMgr::Get().GetCallbackForType(m_addon->Type())->RequestRestart(m_addon, true); } /* Some required settings are missing/invalid */ else if ((m_status == ADDON_STATUS_NEED_SETTINGS) || (m_status == ADDON_STATUS_NEED_SAVEDSETTINGS)) { CGUIDialogYesNo* pDialogYesNo = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); if (!pDialogYesNo) return; pDialogYesNo->SetHeading(heading); pDialogYesNo->SetLine(1, 24070); pDialogYesNo->SetLine(2, 24072); pDialogYesNo->SetLine(3, m_message); //send message and wait for user input ThreadMessage tMsg = {TMSG_DIALOG_DOMODAL, WINDOW_DIALOG_YES_NO, g_windowManager.GetActiveWindow()}; g_application.getApplicationMessenger().SendMessage(tMsg, true); if (!pDialogYesNo->IsConfirmed()) return; if (!m_addon->HasSettings()) return; if (CGUIDialogAddonSettings::ShowAndGetInput(m_addon)) { //todo doesn't dialogaddonsettings save these automatically? should do m_addon->SaveSettings(); CAddonMgr::Get().GetCallbackForType(m_addon->Type())->RequestRestart(m_addon, true); } } /* A unknown event has occurred */ else if (m_status == ADDON_STATUS_UNKNOWN) { //CAddonMgr::Get().DisableAddon(m_addon->ID()); CGUIDialogOK* pDialog = (CGUIDialogOK*)g_windowManager.GetWindow(WINDOW_DIALOG_OK); if (!pDialog) return; pDialog->SetHeading(heading); pDialog->SetLine(1, 24070); pDialog->SetLine(2, 24071); pDialog->SetLine(3, m_message); //send message and wait for user input ThreadMessage tMsg = {TMSG_DIALOG_DOMODAL, WINDOW_DIALOG_OK, g_windowManager.GetActiveWindow()}; g_application.getApplicationMessenger().SendMessage(tMsg, 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_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(); }
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; }
void CAddonStatusHandler::Process() { CSingleLock lock(m_critSection); std::string heading = StringUtils::Format("%s: %s", TranslateType(m_addon->Type(), true).c_str(), m_addon->Name().c_str()); /* AddOn lost connection to his backend (for ones that use Network) */ if (m_status == ADDON_STATUS_LOST_CONNECTION) { if (m_addon->Type() == ADDON_PVRDLL) { if (!CSettings::Get().GetBool("pvrmanager.hideconnectionlostwarning")) CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, m_addon->Name().c_str(), g_localizeStrings.Get(36030)); // connection lost // TODO handle disconnects after the add-on's been initialised } else { CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); if (!pDialog) return; pDialog->SetHeading(heading); pDialog->SetLine(1, 24070); pDialog->SetLine(2, 24073); //send message and wait for user input ThreadMessage tMsg = {TMSG_DIALOG_DOMODAL, WINDOW_DIALOG_YES_NO, g_windowManager.GetActiveWindow()}; CApplicationMessenger::Get().SendMessage(tMsg, true); if (pDialog->IsConfirmed()) CAddonMgr::Get().GetCallbackForType(m_addon->Type())->RequestRestart(m_addon, false); } } /* Request to restart the AddOn and data structures need updated */ else if (m_status == ADDON_STATUS_NEED_RESTART) { CGUIDialogOK* pDialog = (CGUIDialogOK*)g_windowManager.GetWindow(WINDOW_DIALOG_OK); if (!pDialog) return; pDialog->SetHeading(heading); pDialog->SetLine(1, 24074); //send message and wait for user input ThreadMessage tMsg = {TMSG_DIALOG_DOMODAL, WINDOW_DIALOG_OK, g_windowManager.GetActiveWindow()}; CApplicationMessenger::Get().SendMessage(tMsg, true); CAddonMgr::Get().GetCallbackForType(m_addon->Type())->RequestRestart(m_addon, true); } /* Some required settings are missing/invalid */ else if ((m_status == ADDON_STATUS_NEED_SETTINGS) || (m_status == ADDON_STATUS_NEED_SAVEDSETTINGS)) { CGUIDialogYesNo* pDialogYesNo = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); if (!pDialogYesNo) return; pDialogYesNo->SetHeading(heading); pDialogYesNo->SetLine(1, 24070); pDialogYesNo->SetLine(2, 24072); pDialogYesNo->SetLine(3, m_message); //send message and wait for user input ThreadMessage tMsg = {TMSG_DIALOG_DOMODAL, WINDOW_DIALOG_YES_NO, g_windowManager.GetActiveWindow()}; CApplicationMessenger::Get().SendMessage(tMsg, true); if (!pDialogYesNo->IsConfirmed()) return; if (!m_addon->HasSettings()) return; if (CGUIDialogAddonSettings::ShowAndGetInput(m_addon)) { //todo doesn't dialogaddonsettings save these automatically? should do m_addon->SaveSettings(); CAddonMgr::Get().GetCallbackForType(m_addon->Type())->RequestRestart(m_addon, true); } } /* A unknown event has occurred */ else if (m_status == ADDON_STATUS_UNKNOWN) { CGUIDialogOK* pDialog = (CGUIDialogOK*)g_windowManager.GetWindow(WINDOW_DIALOG_OK); if (!pDialog) return; pDialog->SetHeading(heading); pDialog->SetLine(1, 24070); pDialog->SetLine(2, 24071); pDialog->SetLine(3, m_message); //send message and wait for user input ThreadMessage tMsg = {TMSG_DIALOG_DOMODAL, WINDOW_DIALOG_OK, g_windowManager.GetActiveWindow()}; CApplicationMessenger::Get().SendMessage(tMsg, 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_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(); }
bool CAddonDll::LoadDll() { if (m_pDll) return true; std::string strFileName; std::string strAltFileName; if (!m_bIsChild) { strFileName = LibPath(); } else { std::string libPath = LibPath(); if (!XFILE::CFile::Exists(libPath)) { std::string temp = CSpecialProtocol::TranslatePath("special://xbmc/"); std::string tempbin = CSpecialProtocol::TranslatePath("special://xbmcbin/"); libPath.erase(0, temp.size()); libPath = tempbin + libPath; if (!XFILE::CFile::Exists(libPath)) { CLog::Log(LOGERROR, "ADDON: Could not locate %s", m_props.libname.c_str()); return false; } } std::stringstream childcount; childcount << GetChildCount(); std::string extension = URIUtils::GetExtension(libPath); strFileName = "special://temp/" + ID() + "-" + childcount.str() + extension; XFILE::CFile::Copy(libPath, strFileName); m_parentLib = libPath; CLog::Log(LOGNOTICE, "ADDON: Loaded virtual child addon %s", strFileName.c_str()); } /* Check if lib being loaded exists, else check in XBMC binary location */ #if defined(TARGET_ANDROID) // Android libs MUST live in this path, else multi-arch will break. // The usual soname requirements apply. no subdirs, and filename is ^lib.*\.so$ if (!XFILE::CFile::Exists(strFileName)) { std::string tempbin = getenv("XBMC_ANDROID_LIBS"); strFileName = tempbin + "/" + m_props.libname; } #endif if (!XFILE::CFile::Exists(strFileName)) { std::string altbin = CSpecialProtocol::TranslatePath("special://xbmcaltbinaddons/"); if (!altbin.empty()) { strAltFileName = altbin + m_props.libname; 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 %s", strAltFileName.c_str()); } 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 %s", m_props.libname.c_str()); 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 = NULL; CGUIDialogOK* pDialog = g_windowManager.GetWindow<CGUIDialogOK>(WINDOW_DIALOG_OK); if (pDialog) { std::string heading = StringUtils::Format("%s: %s", TranslateType(Type(), true).c_str(), Name().c_str()); pDialog->SetHeading(CVariant{heading}); pDialog->SetLine(1, CVariant{24070}); pDialog->SetLine(2, CVariant{24071}); pDialog->SetLine(2, CVariant{"Can't load shared library"}); pDialog->Open(); } return false; } return true; }