X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FConfig.cc;h=afb365feb78cee4ad17e86dd2062d365f5169140;hb=7a1093db9def94e1cc1aac873f98e28b92fde889;hp=15d3cc52324f3fc29df1d5153711e6322032da31;hpb=bf6bdcb90de19ed474535d41c5519518921b717b;p=senf.git diff --git a/Console/Config.cc b/Console/Config.cc index 15d3cc5..afb365f 100644 --- a/Console/Config.cc +++ b/Console/Config.cc @@ -35,27 +35,90 @@ /////////////////////////////////////////////////////////////////////////// // senf::console::ConfigFile -prefix_ void senf::console::ConfigFile::parse() +#ifndef DOXYGEN + +namespace { + struct BindPolicy + { + BindPolicy(senf::console::Executor & e, senf::console::Executor::SecurityPolicy p) + : e_ (e) + { e_.policy(p); } + + ~BindPolicy() + { e_.policy(senf::console::Executor::SecurityPolicy()); } + + senf::console::Executor & e_; + }; +} + +#endif + +prefix_ void senf::console::ConfigFile::parse(DirectoryNode & restrict) { + DirectoryNode::ptr r (restrict.thisptr()); + BindPolicy bp ( executor_, + boost::bind(&ConfigFile::policyCallback, this, r, _1, _2) ); if (! parser_.parseFile(filename_, boost::bind( boost::ref(executor_), boost::ref(std::cerr), _1 )) ) throw SyntaxErrorException(); + insertParsedNode(r); } -prefix_ void senf::console::ConfigFile::parse(DirectoryNode & restrict) +prefix_ bool senf::console::ConfigFile::parsed(GenericNode & node) + const +{ + ParsedNodes::const_iterator i (parsedNodes_.begin()); + ParsedNodes::const_iterator const i_end (parsedNodes_.end()); + for (; i != i_end; ++i) + if ( ! i->expired() && node.isChildOf(*(i->lock())) ) + return true; + return false; +} + +prefix_ void senf::console::ConfigFile::policyCallback(DirectoryNode::ptr restrict, + DirectoryNode & dir, + std::string const & name) +{ + if (dir.hasChild(name)) { + GenericNode & item (dir.get(name)); + if (restrict && ! item.isChildOf(*restrict)) { + DirectoryNode * itemdir (dynamic_cast(&item)); + if (! itemdir || ! restrict->isChildOf(*itemdir)) + throw Executor::IgnoreCommandException(); + } + if (parsed(item)) + throw Executor::IgnoreCommandException(); + } + else if (restrict && ! dir.isChildOf(*restrict)) + throw Executor::IgnoreCommandException(); +} + +namespace { + struct RemoveNodesFn + { + RemoveNodesFn(senf::console::DirectoryNode::ptr newNode) : newNode_ (newNode) {} + + bool operator()(senf::console::DirectoryNode::weak_ptr node) const + { return node.expired() || node.lock()->isChildOf(*newNode_); } + + senf::console::DirectoryNode::ptr newNode_; + }; +} + +prefix_ void senf::console::ConfigFile::insertParsedNode(DirectoryNode::ptr node) { - restrict_ = restrict.thisptr(); - parse(); - parsedNodes_.push_back(restrict_); - restrict_.reset(); + parsedNodes_.erase( + std::remove_if(parsedNodes_.begin(), parsedNodes_.end(), RemoveNodesFn(node)), + parsedNodes_.end()); + parsedNodes_.push_back(node); } /////////////////////////////////////////////////////////////////////////// -prefix_ void senf::console::readConfig(std::string const & filename) +prefix_ void senf::console::readConfig(std::string const & filename, DirectoryNode & root) { - ConfigFile cfg (filename); + ConfigFile cfg (filename, root); cfg.parse(); }