X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FNode.hh;h=939113b4210fd00d72bbaaeab957335723648660;hb=9e7071473642404359c8b7a88c78fe02f00baf16;hp=a93c23cccd5a5820589e669f26f8d20fd445e33d;hpb=706fe01937df3649e40aed24b75c3d28fc4fa007;p=senf.git diff --git a/Console/Node.hh b/Console/Node.hh index a93c23c..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 @@ -465,27 +531,19 @@ namespace console { DirectoryNode & mkdir(std::string const & name); ///< Create sub-directory node - ChildrenRange children() const; - ///< Return iterator range over all children. + ChildrenRange children() const; ///< Return iterator range over all children. /**< The returned range is sorted by child name. */ - ///\} - /////////////////////////////////////////////////////////////////////////// + ChildrenRange completions(std::string const & s) const; + ///< Return iterator range of completions for \a s + /**< The returned range is sorted by child name. */ - template - GenericNode & traverse(ForwardRange const & range); - ///< 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. + void link(std::string const & name, GenericNode & target); - 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. */ + ///\} + /////////////////////////////////////////////////////////////////////////// - DirectoryNode & doc(std::string const & doc); - ///< Set node documentation + DirectoryNode & doc(std::string const & doc); ///< Set node documentation ptr thisptr(); cptr thisptr() const; @@ -513,23 +571,6 @@ namespace console { {}; #endif - /** \brief Syntax error parsing command arguments exception - - All errors while parsing the arguments of a command must be signaled by throwing an instance - of SyntaxErrorException. This is important, so command overloading works. - */ - struct SyntaxErrorException : public std::exception - { - explicit SyntaxErrorException(std::string const & msg = ""); - virtual ~SyntaxErrorException() throw(); - - virtual char const * what() const throw(); - std::string const & message() const; - - private: - std::string message_; - }; - /** \brief Config/console tree command node The CommandNode is the base-class for the tree leaf nodes. Concrete command node @@ -561,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 @@ -569,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; @@ -585,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: }; @@ -651,8 +692,6 @@ namespace console { #endif - DirectoryNode & root(); - }} #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() @@ -663,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