📄 config.cxx
字号:
currentSection->GetList().Append(value);
}
envp++;
}
// can't save environment configs
saveOnExit = FALSE;
}
static BOOL LocateFile(const PString & baseName,
PFilePath & readFilename,
PFilePath & filename)
{
PFilePath userFile;
// check the user's home directory first
filename = readFilename = PProcess::Current().PXGetHomeDir() +
APP_CONFIG_DIR + baseName + EXTENSION;
if (PFile::Exists(filename))
return TRUE;
// otherwise check the system directory for a file to read,
// and then create
readFilename = SYS_CONFIG_DIR + baseName + EXTENSION;
return PFile::Exists(readFilename);
}
////////////////////////////////////////////////////////////
//
// PXConfigDictionary
//
PXConfigDictionary::PXConfigDictionary(int)
{
environmentInstance = NULL;
writeThread = NULL;
configDict = this;
}
PXConfigDictionary::~PXConfigDictionary()
{
if (writeThread != NULL)
stopConfigWriteThread.Signal();
delete environmentInstance;
}
PXConfig * PXConfigDictionary::GetEnvironmentInstance()
{
mutex.Wait();
if (environmentInstance == NULL) {
environmentInstance = new PXConfig(0);
environmentInstance->ReadFromEnvironment(PProcess::Current().PXGetEnvp());
}
mutex.Signal();
return environmentInstance;
}
PXConfig * PXConfigDictionary::GetFileConfigInstance(const PFilePath & key, const PFilePath & readKey)
{
mutex.Wait();
// start write thread, if not already started
if (writeThread == NULL)
writeThread = new PXConfigWriteThread(stopConfigWriteThread);
PXConfig * config = GetAt(key);
if (config != NULL)
config->AddInstance();
else {
config = new PXConfig(0);
config->ReadFromFile(readKey);
config->AddInstance();
SetAt(key, config);
}
mutex.Signal();
return config;
}
void PXConfigDictionary::RemoveInstance(PXConfig * instance)
{
mutex.Wait();
if (instance != environmentInstance) {
PINDEX index = GetObjectsIndex(instance);
PAssert(index != P_MAX_INDEX, "Cannot find PXConfig instance to remove");
// decrement the instance count, but don't remove it yet
PFilePath key = GetKeyAt(index);
instance->RemoveInstance(key);
}
mutex.Signal();
}
void PXConfigDictionary::WriteChangedInstances(BOOL force)
{
mutex.Wait();
PINDEX i;
for (i = 0; i < GetSize(); i++) {
PFilePath key = GetKeyAt(i);
GetAt(key)->Flush(key, force);
}
mutex.Signal();
}
////////////////////////////////////////////////////////////
//
// PConfig::
//
// Create a new configuration object
//
////////////////////////////////////////////////////////////
void PConfig::Construct(Source src,
const PString & appname,
const PString & /*manuf*/)
{
PString name;
PFilePath filename, readFilename;
// handle cnvironment configs differently
if (src == PConfig::Environment)
config = configDict->GetEnvironmentInstance();
// look up file name to read, and write
if (src == PConfig::System)
LocateFile(SYS_CONFIG_NAME, readFilename, filename);
else {
if (appname.IsEmpty())
name = PProcess::Current().GetName();
else
name = appname;
if (!LocateFile(name, readFilename, filename)) {
name = PProcess::Current().GetFile().GetTitle();
LocateFile(name, readFilename, filename);
}
}
// get, or create, the configuration
config = configDict->GetFileConfigInstance(filename, readFilename);
}
PConfig::PConfig(int, const PString & name)
: defaultSection("Options")
{
PFilePath readFilename, filename;
LocateFile(name, readFilename, filename);
config = configDict->GetFileConfigInstance(filename, readFilename);
}
void PConfig::Construct(const PFilePath & theFilename)
{
PFilePath filename;
config = configDict->GetFileConfigInstance(filename, theFilename);
}
PConfig::~PConfig()
{
configDict->RemoveInstance(config);
}
////////////////////////////////////////////////////////////
//
// PConfig::
//
// Return a list of all the section names in the file.
//
////////////////////////////////////////////////////////////
PStringList PConfig::GetSections() const
{
PAssert(config != NULL, "config instance not set");
config->Wait();
PStringList list;
for (PINDEX i = 0; i < (*config).GetSize(); i++)
list.AppendString((*config)[i]);
config->Signal();
return list;
}
////////////////////////////////////////////////////////////
//
// PConfig::
//
// Return a list of all the keys in the section. If the section name is
// not specified then use the default section.
//
////////////////////////////////////////////////////////////
PStringList PConfig::GetKeys(const PString & theSection) const
{
PAssert(config != NULL, "config instance not set");
config->Wait();
PINDEX index;
PStringList list;
if ((index = config->GetValuesIndex(theSection)) != P_MAX_INDEX) {
PXConfigSectionList & section = (*config)[index].GetList();
for (PINDEX i = 0; i < section.GetSize(); i++)
list.AppendString(section[i]);
}
config->Signal();
return list;
}
////////////////////////////////////////////////////////////
//
// PConfig::
//
// Delete all variables in the specified section. If the section name is
// not specified then use the default section.
//
////////////////////////////////////////////////////////////
void PConfig::DeleteSection(const PString & theSection)
{
PAssert(config != NULL, "config instance not set");
config->Wait();
PStringList list;
PINDEX index;
if ((index = config->GetValuesIndex(theSection)) != P_MAX_INDEX) {
config->RemoveAt(index);
config->SetDirty();
}
config->Signal();
}
////////////////////////////////////////////////////////////
//
// PConfig::
//
// Delete the particular variable in the specified section.
//
////////////////////////////////////////////////////////////
void PConfig::DeleteKey(const PString & theSection, const PString & theKey)
{
PAssert(config != NULL, "config instance not set");
config->Wait();
PINDEX index;
if ((index = config->GetValuesIndex(theSection)) != P_MAX_INDEX) {
PXConfigSectionList & section = (*config)[index].GetList();
PINDEX index_2;
if ((index_2 = section.GetValuesIndex(theKey)) != P_MAX_INDEX) {
section.RemoveAt(index_2);
config->SetDirty();
}
}
config->Signal();
}
////////////////////////////////////////////////////////////
//
// PConfig::
//
// Get a string variable determined by the key in the section.
//
////////////////////////////////////////////////////////////
PString PConfig::GetString(const PString & theSection,
const PString & theKey, const PString & dflt) const
{
PAssert(config != NULL, "config instance not set");
config->Wait();
PString value = dflt;
PINDEX index;
if ((index = config->GetValuesIndex(theSection)) != P_MAX_INDEX) {
PXConfigSectionList & section = (*config)[index].GetList();
if ((index = section.GetValuesIndex(theKey)) != P_MAX_INDEX)
value = section[index].GetValue();
}
config->Signal();
return value;
}
////////////////////////////////////////////////////////////
//
// PConfig::
//
// Set a string variable determined by the key in the section.
//
////////////////////////////////////////////////////////////
void PConfig::SetString(const PString & theSection,
const PString & theKey,
const PString & theValue)
{
PAssert(config != NULL, "config instance not set");
config->Wait();
PINDEX index;
PXConfigSection * section;
PXConfigValue * value;
if ((index = config->GetValuesIndex(theSection)) != P_MAX_INDEX)
section = &(*config)[index];
else {
section = new PXConfigSection(theSection);
config->Append(section);
config->SetDirty();
}
if ((index = section->GetList().GetValuesIndex(theKey)) != P_MAX_INDEX)
value = &(section->GetList()[index]);
else {
value = new PXConfigValue(theKey);
section->GetList().Append(value);
config->SetDirty();
}
if (theValue != value->GetValue()) {
value->SetValue(theValue);
config->SetDirty();
}
config->Signal();
}
///////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -