Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/shell/shell_command.h @ 8021

Last change on this file since 8021 was 7742, checked in by bensch, 18 years ago

trying to fix a strange bug of the static initialisation

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