4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Stefan Bund <g0dil@berlios.de>
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 \brief OverloadedCommand public header */
26 #ifndef HH_OverloadedCommand_
27 #define HH_OverloadedCommand_ 1
31 #include <boost/intrusive_ptr.hpp>
32 #include "../Utils/intrusive_refcount.hh"
34 //#include "OverloadedCommand.mpp"
35 ///////////////////////////////hh.p////////////////////////////////////////
40 class OverloadedCommandNode;
42 /** \brief Base class for command overload of OverloadedCommandNode
44 This class is the base class of the commands which may be added to an
45 OverloadedCommandNode.
48 : public senf::intrusive_refcount
51 ///////////////////////////////////////////////////////////////////////////
54 typedef boost::intrusive_ptr<CommandOverload> ptr;
55 typedef CommandNode::Arguments Arguments;
57 ///////////////////////////////////////////////////////////////////////////
59 virtual ~CommandOverload();
61 void operator()(std::ostream & os, Arguments const & arguments);
62 ///< Call the overload
63 /**< If the \a arguments are not acceptable for this
64 overload, a SyntaxErrorException must be thrown. */
65 void help(std::ostream & os); ///< Provide help for this specific overload
67 OverloadedCommandNode & node(); ///< Access owning node
68 /**< \pre The command \e must have been added to an
69 OverloadedCommandNode. */
77 virtual void v_help(std::ostream & os) const = 0;
78 virtual void v_execute(std::ostream & os, Arguments const & arguments) const = 0;
81 OverloadedCommandNode * node_;
83 friend class OverloadedCommandNode;
86 /** \brief Command node which allows multiple registered callbacks
88 OverloadedCommandNode is like SimpleCommandNode but allows to register multiple commands to
89 a single node. This works by calling each command in the list consecutively until no
90 'SyntaxErrorException' exception is thrown.
92 This works by first adding an OverloadedCommandNode to the directory in question and then
93 adding commands to that node. Commands are derived from CommandOverload.
95 senf::console::DirectoryNode & dir (...);
96 senf::console::OverloadedCommandNode & cmd (
97 dir.add("cmd", senf::console::OverloadedCommandNode::create()) );
98 cmd.add(senf::console::SimpleCommandOverload::create(&callback));
99 cmd.add(senf::console::SimpleCommandOverload::create(&anotherCallback));
102 However, this facility is mostly used not directly but indirectly (and automatically) when
103 adding argument parsing callbacks.
105 \warning For this to work, the commands <b>must</b> do all syntax checking before doing any
110 class OverloadedCommandNode
114 ///////////////////////////////////////////////////////////////////////////
117 typedef boost::shared_ptr<OverloadedCommandNode> ptr;
118 typedef boost::shared_ptr<OverloadedCommandNode const> cptr;
119 typedef boost::weak_ptr<OverloadedCommandNode> weak_ptr;
121 ///////////////////////////////////////////////////////////////////////////
122 ///\name Structors and default members
128 ///////////////////////////////////////////////////////////////////////////
130 template <class Command>
131 Command & add(boost::intrusive_ptr<Command> overload); ///< Add an additional overload
134 cptr thisptr() const;
136 OverloadedCommandNode & doc(std::string const & doc);
137 ///< Assign global help for all overloads
142 OverloadedCommandNode();
144 virtual void v_help(std::ostream & output) const;
145 virtual void v_execute(std::ostream & output, Arguments const & arguments) const;
147 typedef std::vector<CommandOverload::ptr> Overloads;
149 Overloads overloads_;
153 /** \brief Basic command overload
155 This is an implementation of CommandOverload which allows to call an arbitrary callback with
156 the correct signature (<tt>void (std::ostream &, Arguments const &)</tt>)
158 class SimpleCommandOverload
159 : public CommandOverload
162 ///////////////////////////////////////////////////////////////////////////
165 typedef boost::intrusive_ptr<SimpleCommandOverload> ptr;
166 typedef boost::function<void (std::ostream &, Arguments const &)> Function;
168 ///////////////////////////////////////////////////////////////////////////
169 ///\name Structors and default members
172 static SimpleCommandOverload::ptr create(Function fn);
173 ///< Create new SimpleCommandOverload
174 /**< \param[in] fn callback to call */
177 ///////////////////////////////////////////////////////////////////////////
179 SimpleCommandOverload & doc(std::string const & doc);
180 ///< Assign overload specific documentation
185 SimpleCommandOverload(Function fn);
187 virtual void v_help(std::ostream & os) const;
188 virtual void v_execute(std::ostream & os, Arguments const & arguments) const;
196 ///////////////////////////////hh.e////////////////////////////////////////
197 #include "OverloadedCommand.cci"
198 //#include "OverloadedCommand.ct"
199 #include "OverloadedCommand.cti"
206 // comment-column: 40
207 // c-file-style: "senf"
208 // indent-tabs-mode: nil
209 // ispell-local-dictionary: "american"
210 // compile-command: "scons -u test"