You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
301 lines
7.7 KiB
C++
301 lines
7.7 KiB
C++
/*
|
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
|
* its licensors.
|
|
*
|
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
|
* distribution (the "License"). All use of this software is governed by the License,
|
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
*
|
|
*/
|
|
// Original file Copyright Crytek GMBH or its affiliates, used under license.
|
|
|
|
#include "ResourceCompiler_precompiled.h"
|
|
#include "Config.h"
|
|
#include "PropertyVars.h"
|
|
#include "StringHelpers.h"
|
|
#include "IRCLog.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
Config::Config()
|
|
: m_pConfigKeyRegistry(0)
|
|
{
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
Config::~Config()
|
|
{
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void Config::GetUnknownKeys(std::vector<string>& unknownKeys) const
|
|
{
|
|
unknownKeys.clear();
|
|
|
|
if (!m_pConfigKeyRegistry)
|
|
{
|
|
return;
|
|
}
|
|
|
|
const Map::const_iterator end = m_map.end();
|
|
|
|
for (Map::const_iterator it = m_map.begin(); it != end; ++it)
|
|
{
|
|
const char* const keyName = it->first.m_sKeyName.c_str();
|
|
if (!m_pConfigKeyRegistry->HasKeyRegistered(keyName))
|
|
{
|
|
unknownKeys.push_back(keyName);
|
|
}
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void Config::SetConfigKeyRegistry(IConfigKeyRegistry* pConfigKeyRegistry)
|
|
{
|
|
m_pConfigKeyRegistry = pConfigKeyRegistry;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
IConfigKeyRegistry* Config::GetConfigKeyRegistry() const
|
|
{
|
|
return m_pConfigKeyRegistry;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int Config::GetSum(const char* key) const
|
|
{
|
|
if (m_pConfigKeyRegistry)
|
|
{
|
|
m_pConfigKeyRegistry->VerifyKeyRegistration(key);
|
|
}
|
|
|
|
MapKey mapKey;
|
|
mapKey.m_sKeyName = key;
|
|
mapKey.m_eKeyPri = eCP_PriorityHighest;
|
|
const Map::const_iterator lowerBound = m_map.lower_bound(mapKey);
|
|
mapKey.m_eKeyPri = eCP_PriorityLowest;
|
|
const Map::const_iterator upperBound = m_map.upper_bound(mapKey);
|
|
|
|
int ret = 0;
|
|
|
|
for (Map::const_iterator it = lowerBound; it != upperBound; ++it)
|
|
{
|
|
const MapKey& foundMapKey = it->first;
|
|
|
|
if (!StringHelpers::EqualsIgnoreCase(foundMapKey.m_sKeyName, mapKey.m_sKeyName))
|
|
{
|
|
RCLogError("Unexpected failure in %s", __FUNCTION__);
|
|
break;
|
|
}
|
|
|
|
int localvalue;
|
|
if (azsscanf(it->second.c_str(), "%d", &localvalue) == 1)
|
|
{
|
|
ret += localvalue;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
bool Config::GetKeyValue(const char* const key, const char*& value, const int ePriMask) const
|
|
{
|
|
if (m_pConfigKeyRegistry)
|
|
{
|
|
m_pConfigKeyRegistry->VerifyKeyRegistration(key);
|
|
}
|
|
|
|
MapKey mapKey;
|
|
mapKey.m_sKeyName = key;
|
|
mapKey.m_eKeyPri = eCP_PriorityHighest;
|
|
const Map::const_iterator lowerBound = m_map.lower_bound(mapKey);
|
|
mapKey.m_eKeyPri = eCP_PriorityLowest;
|
|
const Map::const_iterator upperBound = m_map.upper_bound(mapKey);
|
|
|
|
for (Map::const_iterator it = lowerBound; it != upperBound; ++it)
|
|
{
|
|
const MapKey& foundMapKey = it->first;
|
|
|
|
if (ePriMask & foundMapKey.m_eKeyPri)
|
|
{
|
|
if (!StringHelpers::EqualsIgnoreCase(foundMapKey.m_sKeyName, mapKey.m_sKeyName))
|
|
{
|
|
RCLogError("Unexpected failure in %s", __FUNCTION__);
|
|
break;
|
|
}
|
|
|
|
value = it->second.c_str();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void Config::AddConfig(const IConfig* inpConfig)
|
|
{
|
|
if (!inpConfig)
|
|
{
|
|
return;
|
|
}
|
|
|
|
const Config* const pConfig = inpConfig->GetInternalRepresentation();
|
|
|
|
if (!pConfig)
|
|
{
|
|
assert(0);
|
|
return;
|
|
}
|
|
|
|
const Map::const_iterator end = pConfig->m_map.end();
|
|
|
|
for (Map::const_iterator it = pConfig->m_map.begin(); it != end; ++it)
|
|
{
|
|
const MapKey& mapKey = it->first;
|
|
const string value = it->second;
|
|
|
|
SetKeyValue(mapKey.m_eKeyPri, mapKey.m_sKeyName.c_str(), value.c_str());
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
const Config* Config::GetInternalRepresentation() const
|
|
{
|
|
return this;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
bool Config::HasKeyRegistered(const char* szKey) const
|
|
{
|
|
assert(szKey);
|
|
return m_pConfigKeyRegistry ? m_pConfigKeyRegistry->HasKeyRegistered(szKey) : false;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
bool Config::HasKeyMatchingWildcards(const char* wildcards) const
|
|
{
|
|
if (!wildcards || !wildcards[0])
|
|
{
|
|
return false;
|
|
}
|
|
|
|
const string strWildcards(wildcards);
|
|
|
|
const Map::const_iterator end = m_map.end();
|
|
for (Map::const_iterator it = m_map.begin(); it != end; ++it)
|
|
{
|
|
if (StringHelpers::MatchesWildcardsIgnoreCase(it->first.m_sKeyName, strWildcards))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void Config::Clear()
|
|
{
|
|
m_map.clear();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
uint32 Config::ClearPriorityUsage(const int ePriMask)
|
|
{
|
|
uint32 dwRet = 0;
|
|
|
|
Map::const_iterator it = m_map.begin();
|
|
|
|
while (it != m_map.end())
|
|
{
|
|
Map::const_iterator itNext = it;
|
|
++itNext;
|
|
|
|
const MapKey& mapKey = it->first;
|
|
|
|
if (mapKey.m_eKeyPri & ePriMask)
|
|
{
|
|
m_map.erase(mapKey);
|
|
++dwRet;
|
|
}
|
|
|
|
it = itNext;
|
|
}
|
|
|
|
return dwRet;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
uint32 Config::CountPriorityUsage(const int ePriMask) const
|
|
{
|
|
uint32 dwRet = 0;
|
|
|
|
const Map::const_iterator end = m_map.end();
|
|
|
|
for (Map::const_iterator it = m_map.begin(); it != end; ++it)
|
|
{
|
|
const MapKey& mapKey = it->first;
|
|
|
|
if (mapKey.m_eKeyPri == ePriMask)
|
|
{
|
|
++dwRet;
|
|
}
|
|
}
|
|
|
|
return dwRet;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void Config::SetKeyValue(const EConfigPriority ePri, const char* key, const char* value)
|
|
{
|
|
assert(Util::isPowerOfTwo(ePri));
|
|
|
|
if (!key || !key[0])
|
|
{
|
|
return;
|
|
}
|
|
|
|
MapKey mapKey;
|
|
mapKey.m_sKeyName = key;
|
|
mapKey.m_eKeyPri = ePri;
|
|
|
|
if (value == 0)
|
|
{
|
|
m_map.erase(mapKey);
|
|
}
|
|
else
|
|
{
|
|
m_map[mapKey] = value;
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void Config::CopyToConfig(const EConfigPriority ePri, IConfigSink* pDestConfig) const
|
|
{
|
|
assert(Util::isPowerOfTwo(ePri));
|
|
|
|
const Map::const_iterator end = m_map.end();
|
|
for (Map::const_iterator it = m_map.begin(); it != end; ++it)
|
|
{
|
|
const MapKey& mapKey = it->first;
|
|
if (mapKey.m_eKeyPri == ePri)
|
|
{
|
|
pDestConfig->SetKeyValue(ePri, mapKey.m_sKeyName, it->second);
|
|
}
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void Config::CopyToPropertyVars(CPropertyVars& properties) const
|
|
{
|
|
const Map::const_iterator end = m_map.end();
|
|
for (Map::const_iterator it = m_map.begin(); it != end; ++it)
|
|
{
|
|
const MapKey& mapKey = it->first;
|
|
properties.SetProperty(mapKey.m_sKeyName, it->second);
|
|
}
|
|
}
|