static int RunScript(const std::vector<std::string>& params) { #if defined(TARGET_DARWIN_OSX) std::string execute; std::string parameter = params.size() ? params[0] : ""; if (URIUtils::HasExtension(parameter, ".applescript|.scpt")) { std::string osxPath = CSpecialProtocol::TranslatePath(parameter); Cocoa_DoAppleScriptFile(osxPath.c_str()); } else if (OnlyApple) return 1; else #endif { AddonPtr addon; std::string scriptpath; // Test to see if the param is an addon ID if (CAddonMgr::GetInstance().GetAddon(params[0], addon)) { //Get the correct extension point to run if (CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT) || CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_WEATHER) || CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_LYRICS) || CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_LIBRARY)) { scriptpath = addon->LibPath(); } else { //Run a random extension point (old behaviour). CAddonMgr::GetInstance().GetAddon(params[0], addon); scriptpath = addon->LibPath(); CLog::Log(LOGWARNING, "RunScript called for a non-script addon '%s'. This behaviour is deprecated.", params[0].c_str()); } } else scriptpath = params[0]; // split the path up to find the filename std::vector<std::string> argv = params; std::string filename = URIUtils::GetFileName(scriptpath); if (!filename.empty()) argv[0] = filename; CScriptInvocationManager::GetInstance().ExecuteAsync(scriptpath, addon, argv); } return 0; }
bool CWeatherJob::DoWork() { // wait for the network if (!g_application.getNetwork().IsAvailable(true)) return false; AddonPtr addon; if (!ADDON::CAddonMgr::Get().GetAddon(g_guiSettings.GetString("weather.addon"), addon, ADDON_SCRIPT_WEATHER)) return false; // initialize our sys.argv variables std::vector<CStdString> argv; argv.push_back(addon->LibPath()); CStdString strSetting; strSetting.Format("%i", m_location); argv.push_back(strSetting); // Download our weather CLog::Log(LOGINFO, "WEATHER: Downloading weather"); // call our script, passing the areacode if (g_pythonParser.evalFile(argv[0], argv,addon)) { while (true) { if (!g_pythonParser.isRunning(g_pythonParser.getScriptId(addon->LibPath().c_str()))) break; Sleep(100); } if (!m_imagesOkay) { CDirectory::Create(WEATHER_BASE_PATH); g_ZipManager.ExtractArchive(WEATHER_SOURCE_FILE, WEATHER_BASE_PATH); m_imagesOkay = true; } SetFromProperties(); // and send a message that we're done CGUIMessage msg(GUI_MSG_NOTIFY_ALL,0,0,GUI_MSG_WEATHER_FETCHED); g_windowManager.SendThreadMessage(msg); } else CLog::Log(LOGERROR, "WEATHER: Weather download failed!"); return true; }
void CServiceAddonManager::Start(const AddonPtr& addon) { CSingleLock lock(m_criticalSection); if (m_services.find(addon->ID()) != m_services.end()) { CLog::Log(LOGDEBUG, "CServiceAddonManager: %s already started.", addon->ID().c_str()); return; } if (StringUtils::EndsWith(addon->LibPath(), ".py")) { CLog::Log(LOGDEBUG, "CServiceAddonManager: starting %s", addon->ID().c_str()); auto handle = CScriptInvocationManager::GetInstance().ExecuteAsync(addon->LibPath(), addon); if (handle == -1) { CLog::Log(LOGERROR, "CServiceAddonManager: %s failed to start", addon->ID().c_str()); return; } m_services[addon->ID()] = handle; } }
/*! \brief Stop a running script. * \param params The parameters. * \details params[0] = The add-on ID of the script to stop * or * params[0] = The URL of the script to stop. */ static int StopScript(const std::vector<std::string>& params) { // FIXME: This does not work for addons with multiple extension points! // Are there any use for this? TODO: Fix hack in CScreenSaver::Destroy() and deprecate. std::string scriptpath(params[0]); // Test to see if the param is an addon ID AddonPtr script; if (CAddonMgr::GetInstance().GetAddon(params[0], script)) scriptpath = script->LibPath(); CScriptInvocationManager::GetInstance().Stop(scriptpath); return 0; }
bool CWeatherJob::DoWork() { // wait for the network if (!g_application.getNetwork().IsAvailable()) return false; AddonPtr addon; if (!ADDON::CAddonMgr::GetInstance().GetAddon(CServiceBroker::GetSettings().GetString(CSettings::SETTING_WEATHER_ADDON), addon, ADDON_SCRIPT_WEATHER)) return false; // initialize our sys.argv variables std::vector<std::string> argv; argv.push_back(addon->LibPath()); std::string strSetting = StringUtils::Format("%i", m_location); argv.push_back(strSetting); // Download our weather CLog::Log(LOGINFO, "WEATHER: Downloading weather"); // call our script, passing the areacode int scriptId = -1; if ((scriptId = CScriptInvocationManager::GetInstance().ExecuteAsync(argv[0], addon, argv)) >= 0) { while (true) { if (!CScriptInvocationManager::GetInstance().IsRunning(scriptId)) break; Sleep(100); } SetFromProperties(); // and send a message that we're done CGUIMessage msg(GUI_MSG_NOTIFY_ALL,0,0,GUI_MSG_WEATHER_FETCHED); g_windowManager.SendThreadMessage(msg); } else CLog::Log(LOGERROR, "WEATHER: Weather download failed!"); return true; }
bool CPluginDirectory::RunScriptWithParams(const CStdString& strPath) { CURL url(strPath); if (url.GetHostName().IsEmpty()) // called with no script - should never happen return false; AddonPtr addon; if (!CAddonMgr::Get().GetAddon(url.GetHostName(), addon, ADDON_PLUGIN) && !CAddonInstaller::Get().PromptForInstall(url.GetHostName(), addon)) { CLog::Log(LOGERROR, "Unable to find plugin %s", url.GetHostName().c_str()); return false; } // options CStdString options = url.GetOptions(); URIUtils::RemoveSlashAtEnd(options); // This MAY kill some scripts (eg though with a URL ending with a slash), but // is needed for all others, as XBMC adds slashes to "folders" url.SetOptions(""); // do this because we can then use the url to generate the basepath // which is passed to the plugin (and represents the share) CStdString basePath(url.Get()); // setup our parameters to send the script CStdString strHandle; strHandle.Format("%i", -1); vector<CStdString> argv; argv.push_back(basePath); argv.push_back(strHandle); argv.push_back(options); // run the script #ifdef HAS_PYTHON CLog::Log(LOGDEBUG, "%s - calling plugin %s('%s','%s','%s')", __FUNCTION__, addon->Name().c_str(), argv[0].c_str(), argv[1].c_str(), argv[2].c_str()); if (g_pythonParser.evalFile(addon->LibPath(), argv,addon) >= 0) return true; else #endif CLog::Log(LOGERROR, "Unable to run plugin %s", addon->Name().c_str()); return false; }
bool CPluginDirectory::RunScriptWithParams(const std::string& strPath) { CURL url(strPath); if (url.GetHostName().empty()) // called with no script - should never happen return false; AddonPtr addon; if (!CAddonMgr::Get().GetAddon(url.GetHostName(), addon, ADDON_PLUGIN) && !CAddonInstaller::Get().PromptForInstall(url.GetHostName(), addon)) { CLog::Log(LOGERROR, "Unable to find plugin %s", url.GetHostName().c_str()); return false; } // options std::string options = url.GetOptions(); url.SetOptions(""); // do this because we can then use the url to generate the basepath // which is passed to the plugin (and represents the share) std::string basePath(url.Get()); // setup our parameters to send the script std::string strHandle = StringUtils::Format("%i", -1); vector<string> argv; argv.push_back(basePath); argv.push_back(strHandle); argv.push_back(options); // run the script CLog::Log(LOGDEBUG, "%s - calling plugin %s('%s','%s','%s')", __FUNCTION__, addon->Name().c_str(), argv[0].c_str(), argv[1].c_str(), argv[2].c_str()); if (CScriptInvocationManager::Get().Execute(addon->LibPath(), addon, argv) >= 0) return true; else CLog::Log(LOGERROR, "Unable to run plugin %s", addon->Name().c_str()); return false; }
void CGUIWindowWeather::CallScript() { #ifdef HAS_PYTHON if (!g_guiSettings.GetString("weather.script").Equals(DEFAULT_WEATHER_ADDON)) { AddonPtr addon; if (!ADDON::CAddonMgr::Get().GetAddon(g_guiSettings.GetString("weather.script"), addon, ADDON_SCRIPT_WEATHER)) return; // initialize our sys.argv variables std::vector<CStdString> argv; argv.push_back(addon->LibPath()); // if script is running we wait for another timeout only when in weather window if (g_windowManager.GetActiveWindow() == WINDOW_WEATHER) { int id = g_pythonParser.getScriptId(argv[0]); if (id != -1 && g_pythonParser.isRunning(id)) { m_scriptTimer.StartZero(); return; } } // get the current locations area code CStdString strSetting; strSetting.Format("weather.areacode%i", m_iCurWeather + 1); argv.push_back(CWeather::GetAreaCode(g_guiSettings.GetString(strSetting))); // call our script, passing the areacode g_pythonParser.evalFile(argv[0], argv); CLog::Log(LOGDEBUG, "%s - Weather script called: %s (%s)", __FUNCTION__, argv[0].c_str(), argv[1].c_str()); } #endif }
// \brief With this function you can react on a users click in the list/thumb panel. // It returns true, if the click is handled. // This function calls OnPlayMedia() bool CGUIMediaWindow::OnClick(int iItem) { if ( iItem < 0 || iItem >= (int)m_vecItems->Size() ) return true; CFileItemPtr pItem = m_vecItems->Get(iItem); if (pItem->IsParentFolder()) { GoParentFolder(); return true; } if (pItem->GetPath() == "add" || pItem->GetPath() == "sources://add/") // 'add source button' in empty root { OnContextButton(iItem, CONTEXT_BUTTON_ADD_SOURCE); return true; } if (!pItem->m_bIsFolder && pItem->IsFileFolder()) { XFILE::IFileDirectory *pFileDirectory = NULL; pFileDirectory = XFILE::CFactoryFileDirectory::Create(pItem->GetPath(), pItem.get(), ""); if(pFileDirectory) pItem->m_bIsFolder = true; else if(pItem->m_bIsFolder) pItem->m_bIsFolder = false; delete pFileDirectory; } if (pItem->IsScript()) { // execute the script CURL url(pItem->GetPath()); AddonPtr addon; if (CAddonMgr::Get().GetAddon(url.GetHostName(), addon)) { #ifdef HAS_PYTHON if (!g_pythonParser.StopScript(addon->LibPath())) g_pythonParser.evalFile(addon->LibPath(),addon); #endif return true; } } if (pItem->m_bIsFolder) { if ( pItem->m_bIsShareOrDrive ) { const CStdString& strLockType=m_guiState->GetLockType(); if (g_settings.GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE) if (!strLockType.IsEmpty() && !g_passwordManager.IsItemUnlocked(pItem.get(), strLockType)) return true; if (!HaveDiscOrConnection(pItem->GetPath(), pItem->m_iDriveType)) return true; } // check for the partymode playlist items - they may not exist yet if ((pItem->GetPath() == g_settings.GetUserDataItem("PartyMode.xsp")) || (pItem->GetPath() == g_settings.GetUserDataItem("PartyMode-Video.xsp"))) { // party mode playlist item - if it doesn't exist, prompt for user to define it if (!XFILE::CFile::Exists(pItem->GetPath())) { m_vecItems->RemoveDiscCache(GetID()); if (CGUIDialogSmartPlaylistEditor::EditPlaylist(pItem->GetPath())) Update(m_vecItems->GetPath()); return true; } } // remove the directory cache if the folder is not normally cached CFileItemList items(pItem->GetPath()); if (!items.AlwaysCache()) items.RemoveDiscCache(GetID()); CFileItem directory(*pItem); if (!Update(directory.GetPath())) ShowShareErrorMessage(&directory); return true; } else if (pItem->IsPlugin() && !pItem->GetProperty("isplayable").asBoolean()) { return XFILE::CPluginDirectory::RunScriptWithParams(pItem->GetPath()); } else { m_iSelectedItem = m_viewControl.GetSelectedItem(); if (pItem->GetPath() == "newplaylist://") { m_vecItems->RemoveDiscCache(GetID()); g_windowManager.ActivateWindow(WINDOW_MUSIC_PLAYLIST_EDITOR,"newplaylist://"); return true; } else if (pItem->GetPath().Left(19).Equals("newsmartplaylist://")) { m_vecItems->RemoveDiscCache(GetID()); if (CGUIDialogSmartPlaylistEditor::NewPlaylist(pItem->GetPath().Mid(19))) Update(m_vecItems->GetPath()); return true; } else if (pItem->GetPath().Left(14).Equals("addons://more/")) { CBuiltins::Execute("ActivateWindow(AddonBrowser,addons://all/xbmc.addon." + pItem->GetPath().Mid(14) + ",return)"); return true; } // If karaoke song is being played AND popup autoselector is enabled, the playlist should not be added bool do_not_add_karaoke = g_guiSettings.GetBool("karaoke.enabled") && g_guiSettings.GetBool("karaoke.autopopupselector") && pItem->IsKaraoke(); bool autoplay = m_guiState.get() && m_guiState->AutoPlayNextItem(); if (pItem->IsPlugin()) { CURL url(pItem->GetPath()); AddonPtr addon; if (CAddonMgr::Get().GetAddon(url.GetHostName(),addon)) { PluginPtr plugin = boost::dynamic_pointer_cast<CPluginSource>(addon); if (plugin && plugin->Provides(CPluginSource::AUDIO) && pItem->IsAudio()) { autoplay = g_guiSettings.GetBool("musicplayer.autoplaynextitem"); } } } if (autoplay && !g_partyModeManager.IsEnabled() && !pItem->IsPlayList() && !do_not_add_karaoke) { return OnPlayAndQueueMedia(pItem); } else { return OnPlayMedia(iItem); } } return false; }