opensim – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 eva 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.IO;
31 using System.Linq;
32 using System.Reflection;
33 using log4net;
34 using OpenMetaverse;
35  
36 namespace OpenSim.Framework.Console
37 {
38 public class ConsoleUtil
39 {
40 // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
41  
42 public const int LocalIdNotFound = 0;
43  
44 /// <summary>
45 /// Used by modules to display stock co-ordinate help, though possibly this should be under some general section
46 /// rather than in each help summary.
47 /// </summary>
48 public const string CoordHelp
49 = @"Each component of the coord is comma separated. There must be no spaces between the commas.
50 If you don't care about the z component you can simply omit it.
51 If you don't care about the x or y components then you can leave them blank (though a comma is still required)
52 If you want to specify the maximum value of a component then you can use ~ instead of a number
53 If you want to specify the minimum value of a component then you can use -~ instead of a number
54 e.g.
55 show object pos 20,20,20 to 40,40,40
56 delete object pos 20,20 to 40,40
57 show object pos ,20,20 to ,40,40
58 delete object pos ,,30 to ,,~
59 show object pos ,,-~ to ,,30";
60  
61 public const string MinRawConsoleVectorValue = "-~";
62 public const string MaxRawConsoleVectorValue = "~";
63  
64 public const string VectorSeparator = ",";
65 public static char[] VectorSeparatorChars = VectorSeparator.ToCharArray();
66  
67 /// <summary>
68 /// Check if the given file path exists.
69 /// </summary>
70 /// <remarks>If not, warning is printed to the given console.</remarks>
71 /// <returns>true if the file does not exist, false otherwise.</returns>
72 /// <param name='console'></param>
73 /// <param name='path'></param>
74 public static bool CheckFileDoesNotExist(ICommandConsole console, string path)
75 {
76 if (File.Exists(path))
77 {
78 console.OutputFormat("File {0} already exists. Please move or remove it.", path);
79 return false;
80 }
81  
82 return true;
83 }
84  
85 /// <summary>
86 /// Try to parse a console UUID from the console.
87 /// </summary>
88 /// <remarks>
89 /// Will complain to the console if parsing fails.
90 /// </remarks>
91 /// <returns></returns>
92 /// <param name='console'>If null then no complaint is printed.</param>
93 /// <param name='rawUuid'></param>
94 /// <param name='uuid'></param>
95 public static bool TryParseConsoleUuid(ICommandConsole console, string rawUuid, out UUID uuid)
96 {
97 if (!UUID.TryParse(rawUuid, out uuid))
98 {
99 if (console != null)
100 console.OutputFormat("ERROR: {0} is not a valid uuid", rawUuid);
101  
102 return false;
103 }
104  
105 return true;
106 }
107  
108 public static bool TryParseConsoleLocalId(ICommandConsole console, string rawLocalId, out uint localId)
109 {
110 if (!uint.TryParse(rawLocalId, out localId))
111 {
112 if (console != null)
113 console.OutputFormat("ERROR: {0} is not a valid local id", localId);
114  
115 return false;
116 }
117  
118 if (localId == 0)
119 {
120 if (console != null)
121 console.OutputFormat("ERROR: {0} is not a valid local id - it must be greater than 0", localId);
122  
123 return false;
124 }
125  
126 return true;
127 }
128  
129 /// <summary>
130 /// Tries to parse the input as either a UUID or a local ID.
131 /// </summary>
132 /// <returns>true if parsing succeeded, false otherwise.</returns>
133 /// <param name='console'></param>
134 /// <param name='rawId'></param>
135 /// <param name='uuid'></param>
136 /// <param name='localId'>
137 /// Will be set to ConsoleUtil.LocalIdNotFound if parsing result was a UUID or no parse succeeded.
138 /// </param>
139 public static bool TryParseConsoleId(ICommandConsole console, string rawId, out UUID uuid, out uint localId)
140 {
141 if (TryParseConsoleUuid(null, rawId, out uuid))
142 {
143 localId = LocalIdNotFound;
144 return true;
145 }
146  
147 if (TryParseConsoleLocalId(null, rawId, out localId))
148 {
149 return true;
150 }
151  
152 if (console != null)
153 console.OutputFormat("ERROR: {0} is not a valid UUID or local id", rawId);
154  
155 return false;
156 }
157  
158 /// <summary>
159 /// Convert a console integer to an int, automatically complaining if a console is given.
160 /// </summary>
161 /// <param name='console'>Can be null if no console is available.</param>
162 /// <param name='rawConsoleVector'>/param>
163 /// <param name='vector'></param>
164 /// <returns></returns>
165 public static bool TryParseConsoleBool(ICommandConsole console, string rawConsoleString, out bool b)
166 {
167 if (!bool.TryParse(rawConsoleString, out b))
168 {
169 if (console != null)
170 console.OutputFormat("ERROR: {0} is not a true or false value", rawConsoleString);
171  
172 return false;
173 }
174  
175 return true;
176 }
177  
178 /// <summary>
179 /// Convert a console integer to an int, automatically complaining if a console is given.
180 /// </summary>
181 /// <param name='console'>Can be null if no console is available.</param>
182 /// <param name='rawConsoleInt'>/param>
183 /// <param name='i'></param>
184 /// <returns></returns>
185 public static bool TryParseConsoleInt(ICommandConsole console, string rawConsoleInt, out int i)
186 {
187 if (!int.TryParse(rawConsoleInt, out i))
188 {
189 if (console != null)
190 console.OutputFormat("ERROR: {0} is not a valid integer", rawConsoleInt);
191  
192 return false;
193 }
194  
195 return true;
196 }
197  
198 /// <summary>
199 /// Convert a console integer to a natural int, automatically complaining if a console is given.
200 /// </summary>
201 /// <param name='console'>Can be null if no console is available.</param>
202 /// <param name='rawConsoleInt'>/param>
203 /// <param name='i'></param>
204 /// <returns></returns>
205 public static bool TryParseConsoleNaturalInt(ICommandConsole console, string rawConsoleInt, out int i)
206 {
207 if (TryParseConsoleInt(console, rawConsoleInt, out i))
208 {
209 if (i < 0)
210 {
211 if (console != null)
212 console.OutputFormat("ERROR: {0} is not a positive integer", rawConsoleInt);
213  
214 return false;
215 }
216  
217 return true;
218 }
219  
220 return false;
221 }
222  
223 /// <summary>
224 /// Convert a minimum vector input from the console to an OpenMetaverse.Vector3
225 /// </summary>
226 /// <param name='rawConsoleVector'>/param>
227 /// <param name='vector'></param>
228 /// <returns></returns>
229 public static bool TryParseConsoleMinVector(string rawConsoleVector, out Vector3 vector)
230 {
231 return TryParseConsoleVector(rawConsoleVector, c => float.MinValue.ToString(), out vector);
232 }
233  
234 /// <summary>
235 /// Convert a maximum vector input from the console to an OpenMetaverse.Vector3
236 /// </summary>
237 /// <param name='rawConsoleVector'>/param>
238 /// <param name='vector'></param>
239 /// <returns></returns>
240 public static bool TryParseConsoleMaxVector(string rawConsoleVector, out Vector3 vector)
241 {
242 return TryParseConsoleVector(rawConsoleVector, c => float.MaxValue.ToString(), out vector);
243 }
244  
245 /// <summary>
246 /// Convert a vector input from the console to an OpenMetaverse.Vector3
247 /// </summary>
248 /// <param name='rawConsoleVector'>
249 /// A string in the form <x>,<y>,<z> where there is no space between values.
250 /// Any component can be missing (e.g. ,,40). blankComponentFunc is invoked to replace the blank with a suitable value
251 /// Also, if the blank component is at the end, then the comma can be missed off entirely (e.g. 40,30 or 40)
252 /// The strings "~" and "-~" are valid in components. The first substitutes float.MaxValue whilst the second is float.MinValue
253 /// Other than that, component values must be numeric.
254 /// </param>
255 /// <param name='blankComponentFunc'></param>
256 /// <param name='vector'></param>
257 /// <returns></returns>
258 public static bool TryParseConsoleVector(
259 string rawConsoleVector, Func<string, string> blankComponentFunc, out Vector3 vector)
260 {
261 List<string> components = rawConsoleVector.Split(VectorSeparatorChars).ToList();
262  
263 if (components.Count < 1 || components.Count > 3)
264 {
265 vector = Vector3.Zero;
266 return false;
267 }
268  
269 for (int i = components.Count; i < 3; i++)
270 components.Add("");
271  
272 List<string> semiDigestedComponents
273 = components.ConvertAll<string>(
274 c =>
275 {
276 if (c == "")
277 return blankComponentFunc.Invoke(c);
278 else if (c == MaxRawConsoleVectorValue)
279 return float.MaxValue.ToString();
280 else if (c == MinRawConsoleVectorValue)
281 return float.MinValue.ToString();
282 else
283 return c;
284 });
285  
286 string semiDigestedConsoleVector = string.Join(VectorSeparator, semiDigestedComponents.ToArray());
287  
288 // m_log.DebugFormat("[CONSOLE UTIL]: Parsing {0} into OpenMetaverse.Vector3", semiDigestedConsoleVector);
289  
290 return Vector3.TryParse(semiDigestedConsoleVector, out vector);
291 }
292 }
293 }