249 lines
6.1 KiB
C++
249 lines
6.1 KiB
C++
/**
|
|
* @file lldaycyclemanager.cpp
|
|
* @brief Implementation for the LLDayCycleManager class.
|
|
*
|
|
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
|
|
* Second Life Viewer Source Code
|
|
* Copyright (C) 2011, Linden Research, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation;
|
|
* version 2.1 of the License only.
|
|
*
|
|
* This library 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
|
* $/LicenseInfo$
|
|
*/
|
|
|
|
#include "llviewerprecompiledheaders.h"
|
|
|
|
#include "llweb.h"
|
|
#include "llwlparamset.h"
|
|
#include "llwlparammanager.h"
|
|
#include "lldaycyclemanager.h"
|
|
#include "lldiriterator.h"
|
|
|
|
// [RLVa:KB] - Checked: 2011-09-04 (RLVa-1.4.1a) | Added: RLVa-1.4.1a
|
|
#include <boost/algorithm/string.hpp>
|
|
// [/RLVa:KB]
|
|
|
|
void LLDayCycleManager::getPresetNames(preset_name_list_t& names) const
|
|
{
|
|
names.clear();
|
|
|
|
for (dc_map_t::const_iterator it = mDayCycleMap.begin(); it != mDayCycleMap.end(); ++it)
|
|
{
|
|
names.push_back(it->first);
|
|
}
|
|
}
|
|
|
|
void LLDayCycleManager::getPresetNames(preset_name_list_t& user, preset_name_list_t& sys) const
|
|
{
|
|
user.clear();
|
|
sys.clear();
|
|
|
|
for (dc_map_t::const_iterator it = mDayCycleMap.begin(); it != mDayCycleMap.end(); ++it)
|
|
{
|
|
const std::string& name = it->first;
|
|
|
|
if (isSystemPreset(name))
|
|
{
|
|
sys.push_back(name);
|
|
}
|
|
else
|
|
{
|
|
user.push_back(name);
|
|
}
|
|
}
|
|
}
|
|
|
|
// [RLVa:KB] - Checked: 2011-09-04 (RLVa-1.4.1a) | Added: RLVa-1.4.1a
|
|
const std::string& LLDayCycleManager::findPreset(const std::string& strPresetName)
|
|
{
|
|
for (dc_map_t::const_iterator itCycle = mDayCycleMap.begin(); itCycle != mDayCycleMap.end(); ++itCycle)
|
|
{
|
|
if (boost::iequals(itCycle->first, strPresetName))
|
|
return itCycle->first;
|
|
}
|
|
return LLStringUtil::null;
|
|
}
|
|
// [/RLVa:KB]
|
|
|
|
void LLDayCycleManager::getUserPresetNames(preset_name_list_t& user) const
|
|
{
|
|
preset_name_list_t sys; // unused
|
|
getPresetNames(user, sys);
|
|
}
|
|
|
|
bool LLDayCycleManager::getPreset(const std::string name, LLWLDayCycle& day_cycle) const
|
|
{
|
|
dc_map_t::const_iterator it = mDayCycleMap.find(name);
|
|
if (it == mDayCycleMap.end())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
day_cycle = it->second;
|
|
return true;
|
|
}
|
|
|
|
bool LLDayCycleManager::getPreset(const std::string name, LLSD& day_cycle) const
|
|
{
|
|
LLWLDayCycle dc;
|
|
if (!getPreset(name, dc))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
day_cycle = dc.asLLSD();
|
|
return true;
|
|
}
|
|
|
|
bool LLDayCycleManager::presetExists(const std::string name) const
|
|
{
|
|
LLWLDayCycle dummy;
|
|
return getPreset(name, dummy);
|
|
}
|
|
|
|
bool LLDayCycleManager::isSystemPreset(const std::string& name) const
|
|
{
|
|
return gDirUtilp->fileExists(getSysDir() + LLWeb::curlEscape(name) + ".xml");
|
|
}
|
|
|
|
bool LLDayCycleManager::savePreset(const std::string& name, const LLSD& data)
|
|
{
|
|
// Save given preset.
|
|
LLWLDayCycle day;
|
|
day.loadDayCycle(data, LLEnvKey::SCOPE_LOCAL);
|
|
day.save(getUserDir() + LLWeb::curlEscape(name) + ".xml");
|
|
|
|
// Add it to our map.
|
|
addPreset(name, data);
|
|
mModifySignal();
|
|
return true;
|
|
}
|
|
|
|
bool LLDayCycleManager::deletePreset(const std::string& name)
|
|
{
|
|
// Remove it from the map.
|
|
dc_map_t::iterator it = mDayCycleMap.find(name);
|
|
if (it == mDayCycleMap.end())
|
|
{
|
|
LL_WARNS("Windlight") << "No day cycle named " << name << LL_ENDL;
|
|
return false;
|
|
}
|
|
mDayCycleMap.erase(it);
|
|
|
|
// Remove from the filesystem.
|
|
std::string filename = LLWeb::curlEscape(name) + ".xml";
|
|
if (gDirUtilp->fileExists(getUserDir() + filename))
|
|
{
|
|
gDirUtilp->deleteFilesInDir(getUserDir(), filename);
|
|
}
|
|
|
|
// Signal interested parties.
|
|
mModifySignal();
|
|
return true;
|
|
}
|
|
|
|
bool LLDayCycleManager::isSkyPresetReferenced(const std::string& preset_name) const
|
|
{
|
|
// We're traversing local day cycles, they can only reference local skies.
|
|
LLWLParamKey key(preset_name, LLEnvKey::SCOPE_LOCAL);
|
|
|
|
for (dc_map_t::const_iterator it = mDayCycleMap.begin(); it != mDayCycleMap.end(); ++it)
|
|
{
|
|
if (it->second.hasReferencesTo(key))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
boost::signals2::connection LLDayCycleManager::setModifyCallback(const modify_signal_t::slot_type& cb)
|
|
{
|
|
return mModifySignal.connect(cb);
|
|
}
|
|
|
|
// virtual
|
|
void LLDayCycleManager::initSingleton()
|
|
{
|
|
LL_DEBUGS("Windlight") << "Loading all day cycles" << LL_ENDL;
|
|
loadAllPresets();
|
|
}
|
|
|
|
void LLDayCycleManager::loadAllPresets()
|
|
{
|
|
mDayCycleMap.clear();
|
|
|
|
// First, load system (coming out of the box) day cycles.
|
|
loadPresets(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/days", ""));
|
|
|
|
// Then load user presets. Note that user day cycles will modify any system ones already loaded.
|
|
loadPresets(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/days", ""));
|
|
}
|
|
|
|
void LLDayCycleManager::loadPresets(const std::string& dir)
|
|
{
|
|
LLDirIterator dir_iter(dir, "*.xml");
|
|
|
|
while (1)
|
|
{
|
|
std::string file;
|
|
if (!dir_iter.next(file)) break; // no more files
|
|
loadPreset(dir + file);
|
|
}
|
|
}
|
|
|
|
bool LLDayCycleManager::loadPreset(const std::string& path)
|
|
{
|
|
LLSD data = LLWLDayCycle::loadDayCycleFromPath(path);
|
|
if (data.isUndefined())
|
|
{
|
|
llwarns << "Error loading day cycle from " << path << llendl;
|
|
return false;
|
|
}
|
|
|
|
std::string name(LLURI::unescape(gDirUtilp->getBaseFileName(path, true)));
|
|
addPreset(name, data);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool LLDayCycleManager::addPreset(const std::string& name, const LLSD& data)
|
|
{
|
|
if (name.empty())
|
|
{
|
|
llassert(name.empty());
|
|
return false;
|
|
}
|
|
|
|
LLWLDayCycle day;
|
|
day.loadDayCycle(data, LLEnvKey::SCOPE_LOCAL);
|
|
mDayCycleMap[name] = day;
|
|
return true;
|
|
}
|
|
|
|
// static
|
|
std::string LLDayCycleManager::getSysDir()
|
|
{
|
|
return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/days", "");
|
|
}
|
|
|
|
// static
|
|
std::string LLDayCycleManager::getUserDir()
|
|
{
|
|
return gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS , "windlight/days", "");
|
|
}
|