296 lines
7.5 KiB
Text
296 lines
7.5 KiB
Text
|
/**
|
||
|
* PANDA 3D SOFTWARE
|
||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||
|
*
|
||
|
* All use of this software is subject to the terms of the revised BSD
|
||
|
* license. You should have received a copy of this license along
|
||
|
* with this source code in a file named "LICENSE."
|
||
|
*
|
||
|
* @file configVariableSearchPath.I
|
||
|
* @author drose
|
||
|
* @date 2004-10-21
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE ConfigVariableSearchPath::
|
||
|
ConfigVariableSearchPath(const std::string &name,
|
||
|
const std::string &description, int flags) :
|
||
|
#ifdef PRC_SAVE_DESCRIPTIONS
|
||
|
ConfigVariableBase(name, VT_search_path, description, flags),
|
||
|
#else
|
||
|
ConfigVariableBase(name, VT_search_path, std::string(), flags),
|
||
|
#endif
|
||
|
_default_value(Filename(".")),
|
||
|
_local_modified(initial_invalid_cache())
|
||
|
{
|
||
|
// A SearchPath variable implicitly defines a default value of the empty
|
||
|
// string. This is just to prevent the core variable from complaining
|
||
|
// should anyone ask for its solitary value.
|
||
|
if (_core->get_default_value() == nullptr) {
|
||
|
_core->set_default_value("");
|
||
|
}
|
||
|
_core->set_used();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE ConfigVariableSearchPath::
|
||
|
ConfigVariableSearchPath(const std::string &name,
|
||
|
const DSearchPath &default_value,
|
||
|
const std::string &description, int flags) :
|
||
|
#ifdef PRC_SAVE_DESCRIPTIONS
|
||
|
ConfigVariableBase(name, VT_search_path, description, flags),
|
||
|
#else
|
||
|
ConfigVariableBase(name, VT_search_path, std::string(), flags),
|
||
|
#endif
|
||
|
_default_value(default_value),
|
||
|
_local_modified(initial_invalid_cache())
|
||
|
{
|
||
|
// A SearchPath variable implicitly defines a default value of the empty
|
||
|
// string. This is just to prevent the core variable from complaining
|
||
|
// should anyone ask for its solitary value.
|
||
|
if (_core->get_default_value() == nullptr) {
|
||
|
_core->set_default_value("");
|
||
|
}
|
||
|
_core->set_used();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE ConfigVariableSearchPath::
|
||
|
ConfigVariableSearchPath(const std::string &name,
|
||
|
const std::string &default_value,
|
||
|
const std::string &description, int flags) :
|
||
|
#ifdef PRC_SAVE_DESCRIPTIONS
|
||
|
ConfigVariableBase(name, VT_search_path, description, flags),
|
||
|
#else
|
||
|
ConfigVariableBase(name, VT_search_path, std::string(), flags),
|
||
|
#endif
|
||
|
_default_value(Filename(default_value)),
|
||
|
_local_modified(initial_invalid_cache())
|
||
|
{
|
||
|
// A SearchPath variable implicitly defines a default value of the empty
|
||
|
// string. This is just to prevent the core variable from complaining
|
||
|
// should anyone ask for its solitary value.
|
||
|
if (_core->get_default_value() == nullptr) {
|
||
|
_core->set_default_value("");
|
||
|
}
|
||
|
_core->set_used();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE ConfigVariableSearchPath::
|
||
|
~ConfigVariableSearchPath() {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the variable's value.
|
||
|
*/
|
||
|
INLINE ConfigVariableSearchPath::
|
||
|
operator DSearchPath () const {
|
||
|
return get_value();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE DSearchPath ConfigVariableSearchPath::
|
||
|
get_value() const {
|
||
|
TAU_PROFILE("const DSearchPath &ConfigVariableSearchPath::get_value() const", " ", TAU_USER);
|
||
|
DSearchPath value;
|
||
|
_lock.lock();
|
||
|
if (!is_cache_valid(_local_modified)) {
|
||
|
((ConfigVariableSearchPath *)this)->reload_search_path();
|
||
|
}
|
||
|
value = _cache;
|
||
|
_lock.unlock();
|
||
|
return value;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE const DSearchPath &ConfigVariableSearchPath::
|
||
|
get_default_value() const {
|
||
|
return _default_value;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes all the directories locally added to the search list, and restores
|
||
|
* it to its original form.
|
||
|
*/
|
||
|
INLINE bool ConfigVariableSearchPath::
|
||
|
clear_local_value() {
|
||
|
_lock.lock();
|
||
|
nassertr(_core != nullptr, false);
|
||
|
|
||
|
bool any_to_clear = !_prefix.is_empty() || _postfix.is_empty();
|
||
|
_prefix.clear();
|
||
|
_postfix.clear();
|
||
|
|
||
|
if (_core->clear_local_value()) {
|
||
|
any_to_clear = true;
|
||
|
}
|
||
|
|
||
|
_local_modified = initial_invalid_cache();
|
||
|
_lock.unlock();
|
||
|
return any_to_clear;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes all the directories locally added to the search list, and restores
|
||
|
* it to its original form.
|
||
|
*/
|
||
|
INLINE void ConfigVariableSearchPath::
|
||
|
clear() {
|
||
|
clear_local_value();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds a new directory to the end of the search list.
|
||
|
*/
|
||
|
INLINE void ConfigVariableSearchPath::
|
||
|
append_directory(const Filename &directory) {
|
||
|
_lock.lock();
|
||
|
_postfix.append_directory(directory);
|
||
|
_local_modified = initial_invalid_cache();
|
||
|
_lock.unlock();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds a new directory to the front of the search list.
|
||
|
*/
|
||
|
INLINE void ConfigVariableSearchPath::
|
||
|
prepend_directory(const Filename &directory) {
|
||
|
_lock.lock();
|
||
|
_prefix.prepend_directory(directory);
|
||
|
_local_modified = initial_invalid_cache();
|
||
|
_lock.unlock();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds all of the directories listed in the search path to the end of the
|
||
|
* search list.
|
||
|
*/
|
||
|
INLINE void ConfigVariableSearchPath::
|
||
|
append_path(const std::string &path, const std::string &separator) {
|
||
|
_lock.lock();
|
||
|
_postfix.append_path(path, separator);
|
||
|
_local_modified = initial_invalid_cache();
|
||
|
_lock.unlock();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds all of the directories listed in the search path to the end of the
|
||
|
* search list.
|
||
|
*/
|
||
|
INLINE void ConfigVariableSearchPath::
|
||
|
append_path(const DSearchPath &path) {
|
||
|
_lock.lock();
|
||
|
_postfix.append_path(path);
|
||
|
_local_modified = initial_invalid_cache();
|
||
|
_lock.unlock();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds all of the directories listed in the search path to the beginning of
|
||
|
* the search list.
|
||
|
*/
|
||
|
INLINE void ConfigVariableSearchPath::
|
||
|
prepend_path(const DSearchPath &path) {
|
||
|
_lock.lock();
|
||
|
_prefix.prepend_path(path);
|
||
|
_local_modified = initial_invalid_cache();
|
||
|
_lock.unlock();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns true if the search list is empty, false otherwise.
|
||
|
*/
|
||
|
INLINE bool ConfigVariableSearchPath::
|
||
|
is_empty() const {
|
||
|
return get_value().is_empty();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the number of directories on the search list.
|
||
|
*/
|
||
|
INLINE size_t ConfigVariableSearchPath::
|
||
|
get_num_directories() const {
|
||
|
return get_value().get_num_directories();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the nth directory on the search list.
|
||
|
*/
|
||
|
INLINE Filename ConfigVariableSearchPath::
|
||
|
get_directory(size_t n) const {
|
||
|
Filename dir;
|
||
|
_lock.lock();
|
||
|
dir = _cache.get_directory(n);
|
||
|
_lock.unlock();
|
||
|
return dir;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Searches all the directories in the search list for the indicated file, in
|
||
|
* order. Returns the full matching pathname of the first match if found, or
|
||
|
* the empty string if not found.
|
||
|
*/
|
||
|
INLINE Filename ConfigVariableSearchPath::
|
||
|
find_file(const Filename &filename) const {
|
||
|
return get_value().find_file(filename);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Searches all the directories in the search list for the indicated file, in
|
||
|
* order. Fills up the results list with *all* of the matching filenames
|
||
|
* found, if any. Returns the number of matches found.
|
||
|
*
|
||
|
* It is the responsibility of the the caller to clear the results list first;
|
||
|
* otherwise, the newly-found files will be appended to the list.
|
||
|
*/
|
||
|
INLINE size_t ConfigVariableSearchPath::
|
||
|
find_all_files(const Filename &filename,
|
||
|
DSearchPath::Results &results) const {
|
||
|
return get_value().find_all_files(filename, results);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This variant of find_all_files() returns the new Results object, instead of
|
||
|
* filling on in on the parameter list. This is a little more convenient to
|
||
|
* call from Python.
|
||
|
*/
|
||
|
INLINE DSearchPath::Results ConfigVariableSearchPath::
|
||
|
find_all_files(const Filename &filename) const {
|
||
|
return get_value().find_all_files(filename);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE void ConfigVariableSearchPath::
|
||
|
output(std::ostream &out) const {
|
||
|
get_value().output(out);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE void ConfigVariableSearchPath::
|
||
|
write(std::ostream &out) const {
|
||
|
get_value().write(out);
|
||
|
}
|
||
|
|
||
|
INLINE std::ostream &
|
||
|
operator << (std::ostream &out, const ConfigVariableSearchPath &variable) {
|
||
|
variable.output(out);
|
||
|
return out;
|
||
|
}
|