CGUIViewStateFromItems::CGUIViewStateFromItems(const CFileItemList &items) : CGUIViewState(items) { const vector<GUIViewSortDetails> &details = items.GetSortDetails(); for (unsigned int i = 0; i < details.size(); i++) { const GUIViewSortDetails sort = details[i]; AddSortMethod(sort.m_sortDescription, sort.m_buttonLabel, sort.m_labelMasks); } // TODO: Should default sort/view mode be specified? m_currentSortMethod = 0; SetViewAsControl(DEFAULT_VIEW_LIST); if (items.IsPlugin()) { CURL url(items.GetPath()); AddonPtr addon; if (CAddonMgr::Get().GetAddon(url.GetHostName(), addon, ADDON_PLUGIN)) { PluginPtr plugin = std::static_pointer_cast<CPluginSource>(addon); if (plugin->Provides(CPluginSource::AUDIO)) m_playlist = PLAYLIST_MUSIC; if (plugin->Provides(CPluginSource::VIDEO)) m_playlist = PLAYLIST_VIDEO; } } LoadViewState(items.GetPath(), g_windowManager.GetActiveWindow()); }
bool CAddonsDirectory::GetScriptsAndPlugins(const CStdString &content, CFileItemList &items) { items.Clear(); CPluginSource::Content type = CPluginSource::Translate(content); if (type == CPluginSource::UNKNOWN) return false; VECADDONS addons; CAddonMgr::Get().GetAddons(ADDON_PLUGIN, addons); for (unsigned i=0; i<addons.size(); i++) { PluginPtr plugin = boost::dynamic_pointer_cast<CPluginSource>(addons[i]); if (!plugin || !plugin->Provides(type)) continue; items.Add(FileItemFromAddon(addons[i], "plugin://", true)); } addons.clear(); CAddonMgr::Get().GetAddons(ADDON_SCRIPT, addons); for (unsigned i=0; i<addons.size(); i++) { PluginPtr plugin = boost::dynamic_pointer_cast<CPluginSource>(addons[i]); if (!plugin || !plugin->Provides(type)) continue; items.Add(FileItemFromAddon(addons[i], "script://", false)); } CFileItemPtr item(new CFileItem("addons://more/"+content,false)); item->SetLabelPreformated(true); item->SetLabel(g_localizeStrings.Get(21452)); item->SetIconImage("DefaultAddon.png"); item->SetSpecialSort(SORT_ON_BOTTOM); items.Add(item); items.SetContent("addons"); return items.Size() > 0; }
bool CAddonsDirectory::GetScriptsAndPlugins(const CStdString &content, VECADDONS &addons) { CPluginSource::Content type = CPluginSource::Translate(content); if (type == CPluginSource::UNKNOWN) return false; VECADDONS tempAddons; CAddonMgr::Get().GetAddons(ADDON_PLUGIN, tempAddons); for (unsigned i=0; i<tempAddons.size(); i++) { PluginPtr plugin = boost::dynamic_pointer_cast<CPluginSource>(tempAddons[i]); if (plugin && plugin->Provides(type)) addons.push_back(tempAddons[i]); } tempAddons.clear(); CAddonMgr::Get().GetAddons(ADDON_SCRIPT, tempAddons); for (unsigned i=0; i<tempAddons.size(); i++) { PluginPtr plugin = boost::dynamic_pointer_cast<CPluginSource>(tempAddons[i]); if (plugin && plugin->Provides(type)) addons.push_back(tempAddons[i]); } return true; }
// \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; }
/*! \brief Run a script or plugin add-on. * \param params The parameters. * \details params[0] = add-on id. * params[1] is blank for no add-on parameters * or * params[1] = add-on parameters in url format * or * params[1,...] = additional parameters in format param=value. */ static int RunAddon(const std::vector<std::string>& params) { if (params.size()) { const std::string& addonid = params[0]; AddonPtr addon; if (CAddonMgr::GetInstance().GetAddon(addonid, addon, ADDON_PLUGIN)) { PluginPtr plugin = std::dynamic_pointer_cast<CPluginSource>(addon); std::string urlParameters; std::vector<std::string> parameters; if (params.size() == 2 && (StringUtils::StartsWith(params[1], "/") || StringUtils::StartsWith(params[1], "?"))) urlParameters = params[1]; else if (params.size() > 1) { parameters.insert(parameters.begin(), params.begin() + 1, params.end()); urlParameters = "?" + StringUtils::Join(parameters, "&"); } else { // Add '/' if addon is run without params (will be removed later so it's safe) // Otherwise there are 2 entries for the same plugin in ViewModesX.db urlParameters = "/"; } std::string cmd; if (plugin->Provides(CPluginSource::VIDEO)) cmd = StringUtils::Format("ActivateWindow(Videos,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str()); else if (plugin->Provides(CPluginSource::AUDIO)) cmd = StringUtils::Format("ActivateWindow(Music,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str()); else if (plugin->Provides(CPluginSource::EXECUTABLE)) cmd = StringUtils::Format("ActivateWindow(Programs,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str()); else if (plugin->Provides(CPluginSource::IMAGE)) cmd = StringUtils::Format("ActivateWindow(Pictures,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str()); else // Pass the script name (addonid) and all the parameters // (params[1] ... params[x]) separated by a comma to RunPlugin cmd = StringUtils::Format("RunPlugin(%s)", StringUtils::Join(params, ",").c_str()); CBuiltins::GetInstance().Execute(cmd); } else if (CAddonMgr::GetInstance().GetAddon(addonid, addon, ADDON_SCRIPT) || CAddonMgr::GetInstance().GetAddon(addonid, addon, ADDON_SCRIPT_WEATHER) || CAddonMgr::GetInstance().GetAddon(addonid, addon, ADDON_SCRIPT_LYRICS) || CAddonMgr::GetInstance().GetAddon(addonid, addon, ADDON_SCRIPT_LIBRARY)) { // Pass the script name (addonid) and all the parameters // (params[1] ... params[x]) separated by a comma to RunScript CBuiltins::GetInstance().Execute(StringUtils::Format("RunScript(%s)", StringUtils::Join(params, ",").c_str())); } else CLog::Log(LOGERROR, "RunAddon: unknown add-on id '%s', or unexpected add-on type (not a script or plugin).", addonid.c_str()); } else { CLog::Log(LOGERROR, "RunAddon called with no arguments."); } return 0; }
JSONRPC_STATUS CAddonsOperations::GetAddons(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { std::vector<TYPE> addonTypes; TYPE addonType = CAddonInfo::TranslateType(parameterObject["type"].asString()); CPluginSource::Content content = CPluginSource::Translate(parameterObject["content"].asString()); CVariant enabled = parameterObject["enabled"]; CVariant installed = parameterObject["installed"]; // ignore the "content" parameter if the type is specified but not a plugin or script if (addonType != ADDON_UNKNOWN && addonType != ADDON_PLUGIN && addonType != ADDON_SCRIPT) content = CPluginSource::UNKNOWN; if (addonType >= ADDON_VIDEO && addonType <= ADDON_EXECUTABLE) { addonTypes.push_back(ADDON_PLUGIN); addonTypes.push_back(ADDON_SCRIPT); switch (addonType) { case ADDON_VIDEO: content = CPluginSource::VIDEO; break; case ADDON_AUDIO: content = CPluginSource::AUDIO; break; case ADDON_IMAGE: content = CPluginSource::IMAGE; break; case ADDON_GAME: content = CPluginSource::GAME; break; case ADDON_EXECUTABLE: content = CPluginSource::EXECUTABLE; break; default: break; } } else addonTypes.push_back(addonType); VECADDONS addons; for (std::vector<TYPE>::const_iterator typeIt = addonTypes.begin(); typeIt != addonTypes.end(); ++typeIt) { VECADDONS typeAddons; if (*typeIt == ADDON_UNKNOWN) { if (!enabled.isBoolean()) //All { if (!installed.isBoolean() || installed.asBoolean()) CServiceBroker::GetAddonMgr().GetInstalledAddons(typeAddons); if (!installed.isBoolean() || (installed.isBoolean() && !installed.asBoolean())) CServiceBroker::GetAddonMgr().GetInstallableAddons(typeAddons); } else if (enabled.asBoolean() && (!installed.isBoolean() || installed.asBoolean())) //Enabled CServiceBroker::GetAddonMgr().GetAddons(typeAddons); else if (!installed.isBoolean() || installed.asBoolean()) CServiceBroker::GetAddonMgr().GetDisabledAddons(typeAddons); } else { if (!enabled.isBoolean()) //All { if (!installed.isBoolean() || installed.asBoolean()) CServiceBroker::GetAddonMgr().GetInstalledAddons(typeAddons, *typeIt); if (!installed.isBoolean() || (installed.isBoolean() && !installed.asBoolean())) CServiceBroker::GetAddonMgr().GetInstallableAddons(typeAddons, *typeIt); } else if (enabled.asBoolean() && (!installed.isBoolean() || installed.asBoolean())) //Enabled CServiceBroker::GetAddonMgr().GetAddons(typeAddons, *typeIt); else if (!installed.isBoolean() || installed.asBoolean()) CServiceBroker::GetAddonMgr().GetDisabledAddons(typeAddons, *typeIt); } addons.insert(addons.end(), typeAddons.begin(), typeAddons.end()); } // remove library addons for (int index = 0; index < (int)addons.size(); index++) { PluginPtr plugin; if (content != CPluginSource::UNKNOWN) plugin = std::dynamic_pointer_cast<CPluginSource>(addons.at(index)); if ((addons.at(index)->Type() <= ADDON_UNKNOWN || addons.at(index)->Type() >= ADDON_MAX) || ((content != CPluginSource::UNKNOWN && plugin == NULL) || (plugin != NULL && !plugin->Provides(content)))) { addons.erase(addons.begin() + index); index--; } } int start, end; HandleLimits(parameterObject, result, addons.size(), start, end); CAddonDatabase addondb; for (int index = start; index < end; index++) FillDetails(addons.at(index), parameterObject["properties"], result["addons"], addondb, true); return OK; }