X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FNode.hh;h=939113b4210fd00d72bbaaeab957335723648660;hb=9e7071473642404359c8b7a88c78fe02f00baf16;hp=0349831a82b2c7fe572900fa07a69ae451a9cba9;hpb=fa5eaa97c8593e3587c87f25adb14f7f91f31f37;p=senf.git diff --git a/Console/Node.hh b/Console/Node.hh index 0349831..939113b 100644 --- a/Console/Node.hh +++ b/Console/Node.hh @@ -215,9 +215,12 @@ namespace senf { namespace console { + class LinkNode; class DirectoryNode; class CommandNode; + DirectoryNode & root(); + /** \brief Config/console node tree base-class GenericNode is the base class of all node objects. There are two basic node types derived @@ -259,6 +262,10 @@ namespace console { std::string path() const; ///< Node path /**< The node path is built by joining the names of all parent nodes with '/' chars. */ + std::string path(DirectoryNode const & root) const; + ///< Node path up to \a root + /**< The node path is built by joining the names of all + parent nodes up to \a root with '/' chars. */ ptr unlink(); ///< Remove node from it's parent directory /**< You may either discard the return value and thereby @@ -272,6 +279,20 @@ namespace console { ptr thisptr(); ///< Get smart pointer to node cptr thisptr() const; ///< Get smart pointer to node (const) + bool isChildOf(DirectoryNode & parent) const; + ///< \c true, if node is a child of \a parent + /**< Will also return \c true, if \a parent is the current + node. */ + + bool operator== (GenericNode & other) const; + /// \c true, if this and \a other are the same node + bool operator!= (GenericNode & other) const; + /// \c true, if this and \a other are different nodes + + bool isDirectory() const; ///< \c true, if this is a drectory node + bool isLink() const; ///< \c true, if this is a link node + bool isCommand() const; ///< \c true, if this is a command node + protected: GenericNode(); @@ -294,6 +315,47 @@ namespace console { friend class DirectoryNode; }; + /** \brief Config/console tree link node + + A LinkNode references another node and provides an additional alias name for that node. A + LinkNode works like a mixture of UNIX symlinks and hardlinks: It is an explicit link like a + UNIX symlink but references another node directly (not via it's path) like a UNIX + hardlink. Therefore, a LinkNode works across chroot(). + */ + class LinkNode + : public GenericNode + { + public: + /////////////////////////////////////////////////////////////////////////// + // Types + + typedef boost::shared_ptr ptr; + typedef boost::shared_ptr cptr; + typedef boost::weak_ptr weak_ptr; + + /////////////////////////////////////////////////////////////////////////// + ///\name Structors and default members + ///@{ + + static ptr create(GenericNode & node); ///< Create new link node. + /**< You should normally use DirectoryNode::link() to + create a link node. */ + + ///@} + /////////////////////////////////////////////////////////////////////////// + + GenericNode & follow() const; ///< Access the referenced node + + protected: + + private: + explicit LinkNode(GenericNode & node); + + virtual void v_help(std::ostream &) const; + + GenericNode::ptr node_; + }; + class SimpleCommandNode; /** \brief Internal: Node creation helper traits @@ -429,6 +491,10 @@ namespace console { ///< Get child node /**< \throws UnknownNodeNameException if a child \a name does not exist */ + GenericNode & getLink(std::string const & name) const; + ///< Get child node without dereferencing links + /**< \throws UnknownNodeNameException if a child \a name + does not exist */ DirectoryNode & getDirectory(std::string const & name) const; ///< Get directory child node @@ -472,27 +538,12 @@ namespace console { ///< Return iterator range of completions for \a s /**< The returned range is sorted by child name. */ + void link(std::string const & name, GenericNode & target); + ///\} /////////////////////////////////////////////////////////////////////////// - template - GenericNode & traverse(ForwardRange const & range, bool autocomplete=false); - ///< Traverse node path starting at this node - /**< The ForwardRange::value_type must be - (convertible to) std::string. Each range element - constitutes a step along the node traversal. - - If the range starts with an empty element, the - traversal is started at the root() node, otherwise it - is started at \a this node. The traversal supports '.', - '..' and ignores further empty elements. - - If \a autocomplete is set to \c true, invalid path - components which can be uniquely completed will be - completed automatically while traversing the tree. */ - - DirectoryNode & doc(std::string const & doc); - ///< Set node documentation + DirectoryNode & doc(std::string const & doc); ///< Set node documentation ptr thisptr(); cptr thisptr() const; @@ -551,7 +602,7 @@ namespace console { \param[in] output stream where result messages may be written to \param[in] arguments command arguments. This is a - range of ranges of ArgumentToken instances. */ + range of ranges of Token instances. */ void operator()(std::ostream & output, ParseCommandInfo const & command) const; ///< Execute the command @@ -559,7 +610,7 @@ namespace console { \param[in] output stream where result messages may be written to \param[in] arguments command arguments. This is a - range of ranges of ArgumentToken instances. */ + range of ranges of Token instances. */ ptr thisptr(); cptr thisptr() const; @@ -575,7 +626,7 @@ namespace console { /**< \param[in] output stream where result messages may be written to \param[in] arguments command arguments. This is a - range of ranges of ArgumentToken instances. */ + range of ranges of Token instances. */ private: }; @@ -641,8 +692,6 @@ namespace console { #endif - DirectoryNode & root(); - }} #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() @@ -653,7 +702,7 @@ BOOST_TYPEOF_REGISTER_TYPE(senf::console::SimpleCommandNode) ///////////////////////////////hh.e//////////////////////////////////////// #include "Node.cci" -#include "Node.ct" +//#include "Node.ct" #include "Node.cti" #endif