aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormontellese <montellese@xbmc.org>2013-03-07 21:14:56 +0100
committermontellese <montellese@xbmc.org>2013-04-01 22:15:27 +0200
commit1bc96ee2181689d79883c1d863570761911fa61d (patch)
treead65293dff33a6f1ccbebb5f99518dac1e81171c
parent5f655ba67c0fa12c6af0a33e02f4e529a892be9f (diff)
settings: add ISubSettings
-rw-r--r--xbmc/settings/ISubSettings.h47
-rw-r--r--xbmc/settings/Settings.cpp50
-rw-r--r--xbmc/settings/Settings.h11
3 files changed, 106 insertions, 2 deletions
diff --git a/xbmc/settings/ISubSettings.h b/xbmc/settings/ISubSettings.h
new file mode 100644
index 0000000000..3f3b316646
--- /dev/null
+++ b/xbmc/settings/ISubSettings.h
@@ -0,0 +1,47 @@
+#pragma once
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://www.xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+class TiXmlNode;
+
+class ISubSettings
+{
+public:
+ virtual ~ISubSettings() { }
+
+ /*!
+ \brief Load settings from the given XML node.
+
+ \param settings XML node containing setting values
+ \return True if loading the settings was successful, false otherwise.
+ */
+ virtual bool Load(const TiXmlNode *settings) { return true; }
+ /*!
+ \brief Save settings to the given XML node.
+
+ \param settings XML node in which the settings will be saved
+ \return True if saving the settings was successful, false otherwise.
+ */
+ virtual bool Save(TiXmlNode *settings) const { return true; }
+ /*!
+ \brief Clear any loaded setting values.
+ */
+ virtual void Clear() { }
+}; \ No newline at end of file
diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp
index 1e1601771b..f1e6466ef8 100644
--- a/xbmc/settings/Settings.cpp
+++ b/xbmc/settings/Settings.cpp
@@ -83,6 +83,24 @@ void CSettings::UnregisterSettingsHandler(ISettingsHandler *settingsHandler)
m_settingsHandlers.erase(settingsHandler);
}
+void CSettings::RegisterSubSettings(ISubSettings *subSettings)
+{
+ if (subSettings == NULL)
+ return;
+
+ CSingleLock lock(m_critical);
+ m_subSettings.insert(subSettings);
+}
+
+void CSettings::UnregisterSubSettings(ISubSettings *subSettings)
+{
+ if (subSettings == NULL)
+ return;
+
+ CSingleLock lock(m_critical);
+ m_subSettings.erase(subSettings);
+}
+
void CSettings::Initialize()
{
RESOLUTION_INFO res;
@@ -159,6 +177,7 @@ void CSettings::Initialize()
CSettings::~CSettings(void)
{
m_settingsHandlers.clear();
+ m_subSettings.clear();
}
@@ -801,7 +820,9 @@ bool CSettings::LoadSettings(const CStdString& strSettingsFile)
LoadCalibration(pRootElement, strSettingsFile);
g_guiSettings.LoadXML(pRootElement);
LoadSkinSettings(pRootElement);
- return true;
+
+ // load any ISubSettings implementations
+ return Load(pRootElement);
}
bool CSettings::SaveSettings(const CStdString& strSettingsFile, CGUISettings *localSettings /* = NULL */) const
@@ -934,6 +955,9 @@ bool CSettings::SaveSettings(const CStdString& strSettingsFile, CGUISettings *lo
SaveProfiles( PROFILES_FILE );
OnSettingsSaved();
+
+ if (!Save(pRoot))
+ return false;
// save the file
return xmlDoc.SaveFile(strSettingsFile);
@@ -1418,6 +1442,9 @@ void CSettings::Clear()
m_Calibrations.clear();
OnSettingsCleared();
+
+ for (SubSettings::const_iterator it = m_subSettings.begin(); it != m_subSettings.end(); it++)
+ (*it)->Clear();
}
int CSettings::TranslateSkinString(const CStdString &setting)
@@ -1850,3 +1877,24 @@ void CSettings::OnSettingsCleared()
for (SettingsHandlers::const_iterator it = m_settingsHandlers.begin(); it != m_settingsHandlers.end(); it++)
(*it)->OnSettingsCleared();
}
+
+bool CSettings::Load(const TiXmlNode *settings)
+{
+ bool ok = true;
+ for (SubSettings::const_iterator it = m_subSettings.begin(); it != m_subSettings.end(); it++)
+ ok &= (*it)->Load(settings);
+
+ return ok;
+}
+
+bool CSettings::Save(TiXmlNode *settings) const
+{
+ CSingleLock lock(m_critical);
+ for (SubSettings::const_iterator it = m_subSettings.begin(); it != m_subSettings.end(); it++)
+ {
+ if (!(*it)->Save(settings))
+ return false;
+ }
+
+ return true;
+}
diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h
index 0075f1d674..3058ee8b06 100644
--- a/xbmc/settings/Settings.h
+++ b/xbmc/settings/Settings.h
@@ -44,6 +44,7 @@
#endif // MID
#include "settings/ISettingsHandler.h"
+#include "settings/ISubSettings.h"
#include "settings/VideoSettings.h"
#include "Profile.h"
#include "view/ViewState.h"
@@ -103,7 +104,7 @@ class TiXmlElement;
class TiXmlNode;
class CMediaSource;
-class CSettings : private ISettingsHandler
+class CSettings : private ISettingsHandler, ISubSettings
{
public:
CSettings(void);
@@ -111,6 +112,8 @@ public:
void RegisterSettingsHandler(ISettingsHandler *settingsHandler);
void UnregisterSettingsHandler(ISettingsHandler *settingsHandler);
+ void RegisterSubSettings(ISubSettings *subSettings);
+ void UnregisterSubSettings(ISubSettings *subSettings);
void Initialize();
@@ -395,9 +398,15 @@ private:
virtual void OnSettingsSaved() const;
virtual void OnSettingsCleared();
+ // implementation of ISubSettings
+ virtual bool Load(const TiXmlNode *settings);
+ virtual bool Save(TiXmlNode *settings) const;
+
CCriticalSection m_critical;
typedef std::set<ISettingsHandler*> SettingsHandlers;
SettingsHandlers m_settingsHandlers;
+ typedef std::set<ISubSettings*> SubSettings;
+ SubSettings m_subSettings;
std::vector<CProfile> m_vecProfiles;
std::map<CStdString, int> m_watchMode;