/*
* Settings.cpp
*
* Copyright (C) 2009-12 by RStudio, PBC
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
#include
#include
#include
#include
#include
namespace rstudio {
namespace core {
Settings::Settings()
: updatePending_(false),
isDirty_(false)
{
}
Settings::~Settings()
{
}
Error Settings::initialize(const FilePath& filePath)
{
settingsFile_ = filePath ;
settingsMap_.clear() ;
Error error = core::readStringMapFromFile(settingsFile_, &settingsMap_) ;
if (error)
{
// we don't consider file-not-found and error because it is a
// common initialization case
if (error != systemError(boost::system::errc::no_such_file_or_directory, ErrorLocation()))
{
error.addProperty("settings-file", settingsFile_);
return error ;
}
}
return Success() ;
}
void Settings::set(const std::string& name, const std::string& value)
{
if (value != settingsMap_[name])
{
settingsMap_[name] = value ;
isDirty_ = true;
if (!updatePending_)
writeSettings() ;
}
}
void Settings::set(const std::string& name, int value)
{
set(name, safe_convert::numberToString(value));
}
void Settings::set(const std::string& name, double value)
{
set(name, safe_convert::numberToString(value));
}
void Settings::set(const std::string& name, bool value)
{
set(name, safe_convert::numberToString(value));
}
bool Settings::contains(const std::string& name) const
{
return settingsMap_.find(name) != settingsMap_.end();
}
std::string Settings::get(const std::string& name,
const std::string& defaultValue) const
{
std::map::const_iterator pos =
settingsMap_.find(name) ;
if (pos != settingsMap_.end())
return (*pos).second ;
else
return defaultValue ;
}
int Settings::getInt(const std::string& name, int defaultValue) const
{
std::string value = get(name) ;
if (value.empty())
return defaultValue ;
else
return safe_convert::stringTo(value, defaultValue);
}
double Settings::getDouble(const std::string& name, double defaultValue) const
{
std::string value = get(name) ;
if (value.empty())
return defaultValue ;
else
return safe_convert::stringTo(value, defaultValue);
}
bool Settings::getBool(const std::string& name, bool defaultValue) const
{
std::string value = get(name) ;
if (value.empty())
return defaultValue ;
else
return safe_convert::stringTo(value, defaultValue);
}
void Settings::forEach(const boost::function& func)
const
{
for (std::map::const_iterator
it = settingsMap_.begin(); it != settingsMap_.end(); ++it)
{
func(it->first, it->second);
}
}
void Settings::beginUpdate()
{
updatePending_ = true ;
}
void Settings::endUpdate()
{
updatePending_ = false ;
if (isDirty_)
writeSettings();
}
void Settings::writeSettings()
{
isDirty_ = false;
Error error = core::writeStringMapToFile(settingsFile_, settingsMap_) ;
if (error)
LOG_ERROR(error);
}
}
}