Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/multi_player_map/src/lib/shell/shell_command.h @ 8804

Last change on this file since 8804 was 8145, checked in by bensch, 18 years ago

trunk: merged the gui back
merged with command:
svn merge -r8114:HEAD https://svn.orxonox.net/orxonox/branches/gui .
→ no conflicts

File size: 5.6 KB
Line 
1/*!
2 * @file shell_command.h
3 * Definition of a on-screen-shell
4 */
5
6#ifndef _SHELL_COMMAND_H
7#define _SHELL_COMMAND_H
8
9#include "base_object.h"
10
11#include "executor/executor.h"
12#include "shell_completion_plugin.h"
13
14#define     SHELL_COMMAND_MAX_SIZE      //!< The maximum size of a Shell Command
15
16namespace OrxShell
17{
18  // FORWARD DECLARATION
19  class ShellCommandClass;
20  class ShellCommandAlias;
21  class CompletorPlugin;
22
23  /**
24   * @brief an easy to use Macro to create a Command
25   * @param command the name of the command (without "" around the string)
26   * @param class the name of the class to apply this command to (without the "" around the string)
27   * @param function the function to call
28   *
29   * MEANING:
30   *  ShellCommand* someUniqueVarName =
31   *       ShellCommand<ClassName>::registerCommand("commandNameInShell", "ClassName", &ClassName::FunctionToCall);
32   *
33   * In the Shell you would call this Command using:
34   * $ ClassName [ObjectName] commandNameInShell [parameters]
35   */
36#define SHELL_COMMAND(command, class, function) \
37           OrxShell::ShellCommand* shell_command_##class##_##command = OrxShell::ShellCommand::registerCommand(#command, #class, createExecutor<class>(&class::function))
38
39  /**
40   * @brief an easy to use Macro to create a Command
41   * @param command the name of the command (without "" around the string)
42   * @param class the name of the class to apply this command to (without the "" around the string)
43   * @param function the function to call
44   *
45   * MEANING:
46   *  ShellCommand* someUniqueVarName =
47   *       ShellCommand<ClassName>::registerCommand("commandNameInShell", "ClassName", &ClassName::FunctionToCall);
48   *
49   * In the Shell you would call this Command using:
50   * $ ClassName [ObjectName] commandNameInShell [parameters]
51   */
52#define SHELL_COMMAND_STATIC(command, class, function) \
53           OrxShell::ShellCommand* shell_command_##class##_##command = OrxShell::ShellCommand::registerCommand(#command, #class, createExecutor<class>(function))
54
55
56
57  //! a baseClass for all possible ShellCommands
58  class ShellCommand : public BaseObject
59  {
60    friend class ShellCommandClass;
61  public:
62    static bool execute (const std::string& executionString);
63
64    ShellCommand* describe(const std::string& description);
65    ShellCommand* setAlias(const std::string& alias);
66    ShellCommand* defaultValues(const MultiType& value0 = MT_NULL, const MultiType& value1 = MT_NULL,
67                                const MultiType& value2 = MT_NULL, const MultiType& value3 = MT_NULL,
68                                const MultiType& value4 = MT_NULL);
69    ShellCommand* completionPlugin(unsigned int parameter, const CompletorPlugin& completorPlugin);
70
71    static ShellCommand* registerCommand(const std::string& commandName, const std::string& className, Executor* executor);
72    static void unregisterCommand(const std::string& commandName, const std::string& className);
73    static const ShellCommand* const getCommand(const std::string& commandName, const std::string& className);
74    static const ShellCommand* const getCommand(const std::string& commandName, const ShellCommandClass* cmdClass);
75    static bool exists(const std::string& commandName, const std::string& className);
76    static const ShellCommand* const getCommandFromInput(const std::string& inputLine, unsigned int& paramBegin, std::vector<BaseObject*>* boList = NULL);
77    static const ShellCommand* const getCommandFromInput(const SubString& strings, unsigned int& paramBegin, std::vector<BaseObject*>* boList = NULL);
78
79    const ShellCommandClass* const getCommandClass() const { return this->shellClass; };
80    const ShellCommandAlias* const getAlias() const { return this->alias; }
81    unsigned int getParamCount() const { return this->executor->getParamCount(); }
82    const CompletorPlugin* const getCompletorPlugin(unsigned int i) const { return this->completors[i]; };
83
84    void help() const;
85
86  protected:
87    ShellCommand(const std::string& commandName, const std::string& className, Executor* executor);
88    virtual ~ShellCommand();
89
90    static bool fillObjectList(const std::string& objectDescriptor, const ShellCommand* cmd, std::vector<BaseObject*>* boList);
91    static const std::string& paramToString(long parameter);
92
93  private:
94    ShellCommandClass*               shellClass;            //!< A Pointer to the Shell-Class this Command belongs to.
95    ShellCommandAlias*               alias;                 //!< An Alias for the Class.
96
97    std::string                      description;           //!< A description for this commnand. (initially ""). Assigned with (create)->describe("blablabla");
98    std::vector<CompletorPlugin*>    completors;            //!< Completors for the Parameters
99    Executor*                        executor;              //!< The Executor, that really executes the Function.
100  };
101
102  //! A Class, that handles aliases.
103  class ShellCommandAlias
104  {
105  public:
106    ShellCommandAlias(const std::string& aliasName, ShellCommand* command);
107    ~ShellCommandAlias();
108
109    /** @returns the Name of the Alias. */
110    const std::string& getName() const { return this->aliasName; };
111    /** @returns the Command, this Alias is asociated with */
112    ShellCommand* getCommand() const { return this->command; };
113    static bool getCommandListOfAlias(std::list<std::string>& stringList);
114    static const std::vector<ShellCommandAlias*>& getAliases() { return ShellCommandAlias::aliasList; };
115
116  private:
117    std::string     aliasName;       //!< the name of the Alias
118    ShellCommand*   command;         //!< a pointer to the command, this alias executes.
119
120    static std::vector<ShellCommandAlias*> aliasList; //!< A list of Aliases to A Commands.
121  };
122
123}
124
125#endif /* _SHELL_COMMAND_H */
Note: See TracBrowser for help on using the repository browser.