OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
Commander.cs
Go to the documentation of this file.
1 /*
2  * Copyright (c) Contributors, http://opensimulator.org/
3  * See CONTRIBUTORS.TXT for a full list of copyright holders.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of the OpenSimulator Project nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 using System;
29 using System.Collections.Generic;
30 using System.Reflection;
31 using System.Text;
32 using log4net;
33 using OpenSim.Framework;
34 using OpenSim.Region.Framework.Interfaces;
35 
36 namespace OpenSim.Region.CoreModules.Framework.InterfaceCommander
37 {
41  public class Commander : ICommander
42  {
43  private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
44 
48  private string m_generatedApiClassName;
49 
50  public string Name
51  {
52  get { return m_name; }
53  }
54  private string m_name;
55 
56  public string Help
57  {
58  get
59  {
60  StringBuilder sb = new StringBuilder();
61 
62  sb.AppendLine("=== " + m_name + " ===");
63 
64  foreach (ICommand com in m_commands.Values)
65  {
66  sb.AppendLine("* " + Name + " " + com.Name + " - " + com.Help);
67  }
68 
69  return sb.ToString();
70  }
71  }
72 
77  public Commander(string name)
78  {
79  m_name = name;
80  m_generatedApiClassName = m_name[0].ToString().ToUpper();
81 
82  if (m_name.Length > 1)
83  m_generatedApiClassName += m_name.Substring(1);
84  }
85 
86  public Dictionary<string, ICommand> Commands
87  {
88  get { return m_commands; }
89  }
90  private Dictionary<string, ICommand> m_commands = new Dictionary<string, ICommand>();
91 
92  #region ICommander Members
93 
94  public void RegisterCommand(string commandName, ICommand command)
95  {
96  m_commands[commandName] = command;
97  }
98 
103  public string GenerateRuntimeAPI()
104  {
105  string classSrc = "\n\tpublic class " + m_generatedApiClassName + " {\n";
106  foreach (ICommand com in m_commands.Values)
107  {
108  classSrc += "\tpublic void " + EscapeRuntimeAPICommand(com.Name) + "( ";
109  foreach (KeyValuePair<string, string> arg in com.Arguments)
110  {
111  classSrc += arg.Value + " " + Util.Md5Hash(arg.Key) + ",";
112  }
113  classSrc = classSrc.Remove(classSrc.Length - 1); // Delete the last comma
114  classSrc += " )\n\t{\n";
115  classSrc += "\t\tObject[] args = new Object[" + com.Arguments.Count.ToString() + "];\n";
116  int i = 0;
117  foreach (KeyValuePair<string, string> arg in com.Arguments)
118  {
119  classSrc += "\t\targs[" + i.ToString() + "] = " + Util.Md5Hash(arg.Key) + " " + ";\n";
120  i++;
121  }
122  classSrc += "\t\tGetCommander(\"" + m_name + "\").Run(\"" + com.Name + "\", args);\n";
123  classSrc += "\t}\n";
124  }
125  classSrc += "}\n";
126 
127  return classSrc;
128  }
129 
137  public void Run(string function, object[] args)
138  {
139  m_commands[function].Run(args);
140  }
141 
142  public void ProcessConsoleCommand(string function, string[] args)
143  {
144  if (m_commands.ContainsKey(function))
145  {
146  if (args.Length > 0 && args[0] == "help")
147  {
148  m_commands[function].ShowConsoleHelp();
149  }
150  else
151  {
152  m_commands[function].Run(args);
153  }
154  }
155  else
156  {
157  if (function == "api")
158  {
159  m_log.Info(GenerateRuntimeAPI());
160  }
161  else
162  {
163  if (function != "help")
164  Console.WriteLine("ERROR: Invalid command - No such command exists");
165 
166  Console.Write(Help);
167  }
168  }
169  }
170 
171  #endregion
172 
173  private string EscapeRuntimeAPICommand(string command)
174  {
175  command = command.Replace('-', '_');
176  StringBuilder tmp = new StringBuilder(command);
177  tmp[0] = tmp[0].ToString().ToUpper().ToCharArray()[0];
178 
179  return tmp.ToString();
180  }
181  }
182 }
void RegisterCommand(string commandName, ICommand command)
Definition: Commander.cs:94
string GenerateRuntimeAPI()
Generates a runtime C# class which can be compiled and inserted via reflection to enable modules to r...
Definition: Commander.cs:103
void ProcessConsoleCommand(string function, string[] args)
Definition: Commander.cs:142
Dictionary< string, string > Arguments
Definition: ICommand.cs:42
A class to enable modules to register console and script commands, which enforces typing and valid in...
Definition: Commander.cs:41
void Run(string function, object[] args)
Runs a specified function with attached arguments *** DO NOT CALL DIRECTLY. *** Call ProcessConsoleCo...
Definition: Commander.cs:137