summaryrefslogtreecommitdiffstats
path: root/xbmc/settings/SettingPath.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--xbmc/settings/SettingPath.cpp145
1 files changed, 145 insertions, 0 deletions
diff --git a/xbmc/settings/SettingPath.cpp b/xbmc/settings/SettingPath.cpp
new file mode 100644
index 0000000..fa215ff
--- /dev/null
+++ b/xbmc/settings/SettingPath.cpp
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2013-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "SettingPath.h"
+
+#include "settings/lib/SettingsManager.h"
+#include "utils/FileExtensionProvider.h"
+#include "utils/StringUtils.h"
+#include "utils/XBMCTinyXML.h"
+#include "utils/XMLUtils.h"
+#include "utils/log.h"
+
+#include <mutex>
+
+#define XML_ELM_DEFAULT "default"
+#define XML_ELM_CONSTRAINTS "constraints"
+
+CSettingPath::CSettingPath(const std::string &id, CSettingsManager *settingsManager /* = nullptr */)
+ : CSettingString(id, settingsManager)
+{ }
+
+CSettingPath::CSettingPath(const std::string &id, int label, const std::string &value, CSettingsManager *settingsManager /* = nullptr */)
+ : CSettingString(id, label, value, settingsManager)
+{ }
+
+CSettingPath::CSettingPath(const std::string &id, const CSettingPath &setting)
+ : CSettingString(id, setting)
+{
+ copy(setting);
+}
+
+SettingPtr CSettingPath::Clone(const std::string &id) const
+{
+ return std::make_shared<CSettingPath>(id, *this);
+}
+
+bool CSettingPath::Deserialize(const TiXmlNode *node, bool update /* = false */)
+{
+ std::unique_lock<CSharedSection> lock(m_critical);
+
+ if (!CSettingString::Deserialize(node, update))
+ return false;
+
+ if (m_control != nullptr &&
+ (m_control->GetType() != "button" || (m_control->GetFormat() != "path" && m_control->GetFormat() != "file" && m_control->GetFormat() != "image")))
+ {
+ CLog::Log(LOGERROR, "CSettingPath: invalid <control> of \"{}\"", m_id);
+ return false;
+ }
+
+ auto constraints = node->FirstChild(XML_ELM_CONSTRAINTS);
+ if (constraints != nullptr)
+ {
+ // get writable
+ XMLUtils::GetBoolean(constraints, "writable", m_writable);
+ // get hide extensions
+ XMLUtils::GetBoolean(constraints, "hideextensions", m_hideExtension);
+
+ // get sources
+ auto sources = constraints->FirstChild("sources");
+ if (sources != nullptr)
+ {
+ m_sources.clear();
+ auto source = sources->FirstChild("source");
+ while (source != nullptr)
+ {
+ auto child = source->FirstChild();
+ if (child != nullptr)
+ {
+ const std::string& strSource = child->ValueStr();
+ if (!strSource.empty())
+ m_sources.push_back(strSource);
+ }
+
+ source = source->NextSibling("source");
+ }
+ }
+
+ // get masking
+ auto masking = constraints->FirstChild("masking");
+ if (masking != nullptr)
+ m_masking = masking->FirstChild()->ValueStr();
+ }
+
+ return true;
+}
+
+bool CSettingPath::SetValue(const std::string &value)
+{
+ // for backwards compatibility to Frodo
+ if (StringUtils::EqualsNoCase(value, "select folder") ||
+ StringUtils::EqualsNoCase(value, "select writable folder"))
+ return CSettingString::SetValue("");
+
+ return CSettingString::SetValue(value);
+}
+
+std::string CSettingPath::GetMasking(const CFileExtensionProvider& fileExtensionProvider) const
+{
+ if (m_masking.empty())
+ return m_masking;
+
+ // setup masking
+ auto audioMask = fileExtensionProvider.GetMusicExtensions();
+ auto videoMask = fileExtensionProvider.GetVideoExtensions();
+ auto imageMask = fileExtensionProvider.GetPictureExtensions();
+ auto execMask = "";
+#if defined(TARGET_WINDOWS)
+ execMask = ".exe|.bat|.cmd|.py";
+#endif // defined(TARGET_WINDOWS)
+
+ std::string masking = m_masking;
+ if (masking == "video")
+ return videoMask;
+ if (masking == "audio")
+ return audioMask;
+ if (masking == "image")
+ return imageMask;
+ if (masking == "executable")
+ return execMask;
+
+ // convert mask qualifiers
+ StringUtils::Replace(masking, "$AUDIO", audioMask);
+ StringUtils::Replace(masking, "$VIDEO", videoMask);
+ StringUtils::Replace(masking, "$IMAGE", imageMask);
+ StringUtils::Replace(masking, "$EXECUTABLE", execMask);
+
+ return masking;
+}
+
+void CSettingPath::copy(const CSettingPath& setting)
+{
+ CSettingString::Copy(setting);
+
+ std::unique_lock<CSharedSection> lock(m_critical);
+ m_writable = setting.m_writable;
+ m_sources = setting.m_sources;
+ m_hideExtension = setting.m_hideExtension;
+ m_masking = setting.m_masking;
+}