aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormontellese <montellese@xbmc.org>2013-03-07 20:33:05 +0100
committermontellese <montellese@xbmc.org>2013-04-01 22:15:24 +0200
commitac4c044d348998a2cadf4f36fea317391ee846d7 (patch)
tree40b575bcd863573ee626d76d72cf7c87626dee0f
parent93f06349dc82c261145e2c2f2c4869690e571985 (diff)
settings: add ISettingsHandler
-rw-r--r--xbmc/settings/ISettingsHandler.h58
-rw-r--r--xbmc/settings/Settings.cpp80
-rw-r--r--xbmc/settings/Settings.h19
3 files changed, 155 insertions, 2 deletions
diff --git a/xbmc/settings/ISettingsHandler.h b/xbmc/settings/ISettingsHandler.h
new file mode 100644
index 0000000000..15804377c3
--- /dev/null
+++ b/xbmc/settings/ISettingsHandler.h
@@ -0,0 +1,58 @@
+#pragma once
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://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 ISettingsHandler
+{
+public:
+ virtual ~ISettingsHandler() { }
+
+ /*!
+ \brief Settings loading has been initiated.
+
+ \return True if the settings should be loaded, false if the loading should be aborted.
+ */
+ virtual bool OnSettingsLoading() { return true; }
+ /*!
+ \brief Settings have been loaded.
+
+ This callback can be used to trigger loading other settings.
+ */
+ virtual void OnSettingsLoaded() { }
+ /*!
+ \brief Settings saving has been initiated.
+
+ \return True if the settings should be saved, false if the saving should be aborted.
+ */
+ virtual bool OnSettingsSaving() const { return true; }
+ /*!
+ \brief Settings have been saved.
+
+ This callback can be used to trigger saving other settings.
+ */
+ virtual void OnSettingsSaved() const { }
+ /*!
+ \brief Settings have been cleared.
+
+ This callback can be used to trigger clearing any state variables
+ (e.g. before re-loading the settings).
+ */
+ virtual void OnSettingsCleared() { }
+};
diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp
index 3bb10695da..7880b59d1b 100644
--- a/xbmc/settings/Settings.cpp
+++ b/xbmc/settings/Settings.cpp
@@ -59,6 +59,7 @@
#ifdef HAS_UPNP
#include "network/upnp/UPnPSettings.h"
#endif
+#include "threads/SingleLock.h"
#include "utils/RssManager.h"
using namespace std;
@@ -68,6 +69,24 @@ CSettings::CSettings(void)
{
}
+void CSettings::RegisterSettingsHandler(ISettingsHandler *settingsHandler)
+{
+ if (settingsHandler == NULL)
+ return;
+
+ CSingleLock lock(m_critical);
+ m_settingsHandlers.insert(settingsHandler);
+}
+
+void CSettings::UnregisterSettingsHandler(ISettingsHandler *settingsHandler)
+{
+ if (settingsHandler == NULL)
+ return;
+
+ CSingleLock lock(m_critical);
+ m_settingsHandlers.erase(settingsHandler);
+}
+
void CSettings::Initialize()
{
RESOLUTION_INFO res;
@@ -142,7 +161,9 @@ void CSettings::Initialize()
}
CSettings::~CSettings(void)
-{ }
+{
+ m_settingsHandlers.clear();
+}
void CSettings::Save() const
@@ -170,6 +191,9 @@ bool CSettings::Reset()
bool CSettings::Load()
{
+ if (!OnSettingsLoading())
+ return false;
+
CSpecialProtocol::SetProfilePath(GetProfileUserDataFolder());
CLog::Log(LOGNOTICE, "loading %s", GetSettingsFile().c_str());
if (!LoadSettings(GetSettingsFile()))
@@ -183,6 +207,8 @@ bool CSettings::Load()
CRssManager::Get().Load();
LoadUserFolderLayout();
+ OnSettingsLoaded();
+
return true;
}
@@ -829,6 +855,9 @@ bool CSettings::SaveSettings(const CStdString& strSettingsFile, CGUISettings *lo
if (!pRoot) return false;
// write our tags one by one - just a big list for now (can be flashed up later)
+ if (!OnSettingsSaving())
+ return false;
+
// mymusic settings
TiXmlElement musicNode("mymusic");
TiXmlNode *pNode = pRoot->InsertEndChild(musicNode);
@@ -947,6 +976,8 @@ bool CSettings::SaveSettings(const CStdString& strSettingsFile, CGUISettings *lo
// For mastercode
SaveProfiles( PROFILES_FILE );
+ OnSettingsSaved();
+
// save the file
return xmlDoc.SaveFile(strSettingsFile);
}
@@ -1433,6 +1464,8 @@ void CSettings::Clear()
CUPnPSettings::Get().Clear();
#endif
CRssManager::Get().Clear();
+
+ OnSettingsCleared();
}
int CSettings::TranslateSkinString(const CStdString &setting)
@@ -1820,3 +1853,48 @@ void CSettings::LoadMasterForLogin()
if (m_currentProfile != 0)
LoadProfile(0);
}
+
+bool CSettings::OnSettingsLoading()
+{
+ CSingleLock lock(m_critical);
+ for (SettingsHandlers::const_iterator it = m_settingsHandlers.begin(); it != m_settingsHandlers.end(); it++)
+ {
+ if (!(*it)->OnSettingsLoading())
+ return false;
+ }
+
+ return true;
+}
+
+void CSettings::OnSettingsLoaded()
+{
+ CSingleLock lock(m_critical);
+ for (SettingsHandlers::const_iterator it = m_settingsHandlers.begin(); it != m_settingsHandlers.end(); it++)
+ (*it)->OnSettingsLoaded();
+}
+
+bool CSettings::OnSettingsSaving() const
+{
+ CSingleLock lock(m_critical);
+ for (SettingsHandlers::const_iterator it = m_settingsHandlers.begin(); it != m_settingsHandlers.end(); it++)
+ {
+ if (!(*it)->OnSettingsSaving())
+ return false;
+ }
+
+ return true;
+}
+
+void CSettings::OnSettingsSaved() const
+{
+ CSingleLock lock(m_critical);
+ for (SettingsHandlers::const_iterator it = m_settingsHandlers.begin(); it != m_settingsHandlers.end(); it++)
+ (*it)->OnSettingsSaved();
+}
+
+void CSettings::OnSettingsCleared()
+{
+ CSingleLock lock(m_critical);
+ for (SettingsHandlers::const_iterator it = m_settingsHandlers.begin(); it != m_settingsHandlers.end(); it++)
+ (*it)->OnSettingsCleared();
+}
diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h
index 050f8d6f04..0075f1d674 100644
--- a/xbmc/settings/Settings.h
+++ b/xbmc/settings/Settings.h
@@ -43,14 +43,17 @@
#endif
#endif // MID
+#include "settings/ISettingsHandler.h"
#include "settings/VideoSettings.h"
#include "Profile.h"
#include "view/ViewState.h"
#include "guilib/Resolution.h"
#include "guilib/GraphicContext.h"
+#include "threads/CriticalSection.h"
#include <vector>
#include <map>
+#include <set>
#define CACHE_AUDIO 0
#define CACHE_VIDEO 1
@@ -100,12 +103,15 @@ class TiXmlElement;
class TiXmlNode;
class CMediaSource;
-class CSettings
+class CSettings : private ISettingsHandler
{
public:
CSettings(void);
virtual ~CSettings(void);
+ void RegisterSettingsHandler(ISettingsHandler *settingsHandler);
+ void UnregisterSettingsHandler(ISettingsHandler *settingsHandler);
+
void Initialize();
bool Load();
@@ -382,6 +388,17 @@ protected:
void LoadUserFolderLayout();
private:
+ // implementation of ISettingsHandler
+ virtual bool OnSettingsLoading();
+ virtual void OnSettingsLoaded();
+ virtual bool OnSettingsSaving() const;
+ virtual void OnSettingsSaved() const;
+ virtual void OnSettingsCleared();
+
+ CCriticalSection m_critical;
+ typedef std::set<ISettingsHandler*> SettingsHandlers;
+ SettingsHandlers m_settingsHandlers;
+
std::vector<CProfile> m_vecProfiles;
std::map<CStdString, int> m_watchMode;
bool m_usingLoginScreen;