diff options
author | Justin Clark-Casey (justincc) | 2012-10-24 04:10:22 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-10-24 04:10:22 +0100 |
commit | 81aeecc90723658187668baa49bd168b7b333afb (patch) | |
tree | 11e62ae375450e7d8d500565e29d05cc9b0b4ec7 | |
parent | Get "save oar" and "save iar" to tell you in a more friendly manner if the fi... (diff) | |
download | opensim-SC_OLD-81aeecc90723658187668baa49bd168b7b333afb.zip opensim-SC_OLD-81aeecc90723658187668baa49bd168b7b333afb.tar.gz opensim-SC_OLD-81aeecc90723658187668baa49bd168b7b333afb.tar.bz2 opensim-SC_OLD-81aeecc90723658187668baa49bd168b7b333afb.tar.xz |
Allow "show object", "show part", "dump object" and "delete object" to accept a local ID as well as a UUID.
This means that the sub-commands are now id rather than uuid, e.g. show object id
-rw-r--r-- | OpenSim/Framework/Console/ConsoleUtil.cs | 58 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs | 103 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 13 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneGraph.cs | 24 |
4 files changed, 153 insertions, 45 deletions
diff --git a/OpenSim/Framework/Console/ConsoleUtil.cs b/OpenSim/Framework/Console/ConsoleUtil.cs index 3ebfdf8..16a63e0 100644 --- a/OpenSim/Framework/Console/ConsoleUtil.cs +++ b/OpenSim/Framework/Console/ConsoleUtil.cs | |||
@@ -38,6 +38,8 @@ namespace OpenSim.Framework.Console | |||
38 | public class ConsoleUtil | 38 | public class ConsoleUtil |
39 | { | 39 | { |
40 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 40 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
41 | |||
42 | public const int LocalIdNotFound = 0; | ||
41 | 43 | ||
42 | /// <summary> | 44 | /// <summary> |
43 | /// Used by modules to display stock co-ordinate help, though possibly this should be under some general section | 45 | /// Used by modules to display stock co-ordinate help, though possibly this should be under some general section |
@@ -87,19 +89,71 @@ namespace OpenSim.Framework.Console | |||
87 | /// Will complain to the console if parsing fails. | 89 | /// Will complain to the console if parsing fails. |
88 | /// </remarks> | 90 | /// </remarks> |
89 | /// <returns></returns> | 91 | /// <returns></returns> |
90 | /// <param name='console'></param> | 92 | /// <param name='console'>If null then no complaint is printed.</param> |
91 | /// <param name='rawUuid'></param> | 93 | /// <param name='rawUuid'></param> |
92 | /// <param name='uuid'></param> | 94 | /// <param name='uuid'></param> |
93 | public static bool TryParseConsoleUuid(ICommandConsole console, string rawUuid, out UUID uuid) | 95 | public static bool TryParseConsoleUuid(ICommandConsole console, string rawUuid, out UUID uuid) |
94 | { | 96 | { |
95 | if (!UUID.TryParse(rawUuid, out uuid)) | 97 | if (!UUID.TryParse(rawUuid, out uuid)) |
96 | { | 98 | { |
97 | console.OutputFormat("{0} is not a valid uuid", rawUuid); | 99 | if (console != null) |
100 | console.OutputFormat("{0} is not a valid uuid", rawUuid); | ||
101 | |||
98 | return false; | 102 | return false; |
99 | } | 103 | } |
100 | 104 | ||
101 | return true; | 105 | return true; |
102 | } | 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("{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("{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("{0} is not a valid UUID or local id", rawId); | ||
154 | |||
155 | return false; | ||
156 | } | ||
103 | 157 | ||
104 | /// <summary> | 158 | /// <summary> |
105 | /// Convert a minimum vector input from the console to an OpenMetaverse.Vector3 | 159 | /// Convert a minimum vector input from the console to an OpenMetaverse.Vector3 |
diff --git a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs index f0a35ad..b2c9bce 100644 --- a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs | |||
@@ -99,9 +99,9 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
99 | HandleDeleteObject); | 99 | HandleDeleteObject); |
100 | 100 | ||
101 | m_console.Commands.AddCommand( | 101 | m_console.Commands.AddCommand( |
102 | "Objects", false, "delete object uuid", | 102 | "Objects", false, "delete object id", |
103 | "delete object uuid <UUID>", | 103 | "delete object id <UUID-or-localID>", |
104 | "Delete a scene object by uuid", | 104 | "Delete a scene object by uuid or localID", |
105 | HandleDeleteObject); | 105 | HandleDeleteObject); |
106 | 106 | ||
107 | m_console.Commands.AddCommand( | 107 | m_console.Commands.AddCommand( |
@@ -131,12 +131,12 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
131 | m_console.Commands.AddCommand( | 131 | m_console.Commands.AddCommand( |
132 | "Objects", | 132 | "Objects", |
133 | false, | 133 | false, |
134 | "show object uuid", | 134 | "show object id", |
135 | "show object uuid [--full] <UUID>", | 135 | "show object id [--full] <UUID-or-localID>", |
136 | "Show details of a scene object with the given UUID", | 136 | "Show details of a scene object with the given UUID or localID", |
137 | "The --full option will print out information on all the parts of the object.\n" | 137 | "The --full option will print out information on all the parts of the object.\n" |
138 | + "For yet more detailed part information, use the \"show part\" commands.", | 138 | + "For yet more detailed part information, use the \"show part\" commands.", |
139 | HandleShowObjectByUuid); | 139 | HandleShowObjectById); |
140 | 140 | ||
141 | m_console.Commands.AddCommand( | 141 | m_console.Commands.AddCommand( |
142 | "Objects", | 142 | "Objects", |
@@ -163,9 +163,9 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
163 | m_console.Commands.AddCommand( | 163 | m_console.Commands.AddCommand( |
164 | "Objects", | 164 | "Objects", |
165 | false, | 165 | false, |
166 | "show part uuid", | 166 | "show part id", |
167 | "show part uuid <UUID>", | 167 | "show part id <UUID-or-localID>", |
168 | "Show details of a scene object parts with the given UUID", HandleShowPartByUuid); | 168 | "Show details of a scene object part with the given UUID or localID", HandleShowPartById); |
169 | 169 | ||
170 | m_console.Commands.AddCommand( | 170 | m_console.Commands.AddCommand( |
171 | "Objects", | 171 | "Objects", |
@@ -173,7 +173,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
173 | "show part name", | 173 | "show part name", |
174 | "show part name [--regex] <name>", | 174 | "show part name [--regex] <name>", |
175 | "Show details of scene object parts with the given name.", | 175 | "Show details of scene object parts with the given name.", |
176 | "If --regex is specified then the name is treatead as a regular expression", | 176 | "If --regex is specified then the name is treated as a regular expression", |
177 | HandleShowPartByName); | 177 | HandleShowPartByName); |
178 | 178 | ||
179 | m_console.Commands.AddCommand( | 179 | m_console.Commands.AddCommand( |
@@ -188,12 +188,13 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
188 | m_console.Commands.AddCommand( | 188 | m_console.Commands.AddCommand( |
189 | "Objects", | 189 | "Objects", |
190 | false, | 190 | false, |
191 | "dump object uuid", | 191 | "dump object id", |
192 | "dump object uuid <UUID>", | 192 | "dump object id <UUID-or-localID>", |
193 | "Dump the formatted serialization of the given object to the file <UUID>.xml", | 193 | "Dump the formatted serialization of the given object to the file <UUID>.xml", |
194 | "e.g. dump object uuid c1ed6809-cc24-4061-a4c2-93082a2d1f1d will dump serialization to c1ed6809-cc24-4061-a4c2-93082a2d1f1d.xml\n" | 194 | "e.g. dump object uuid c1ed6809-cc24-4061-a4c2-93082a2d1f1d will dump serialization to c1ed6809-cc24-4061-a4c2-93082a2d1f1d.xml\n" |
195 | + "To locate the UUID in the first place, you need to use the other show object commands", | 195 | + "To locate the UUID or localID in the first place, you need to use the other show object commands.\n" |
196 | HandleDumpObjectByUuid); | 196 | + "If a local ID is given then the filename used is still that for the UUID", |
197 | HandleDumpObjectById); | ||
197 | } | 198 | } |
198 | 199 | ||
199 | public void RemoveRegion(Scene scene) | 200 | public void RemoveRegion(Scene scene) |
@@ -248,7 +249,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
248 | m_console.OutputFormat(sb.ToString()); | 249 | m_console.OutputFormat(sb.ToString()); |
249 | } | 250 | } |
250 | 251 | ||
251 | private void HandleShowObjectByUuid(string module, string[] cmdparams) | 252 | private void HandleShowObjectById(string module, string[] cmdparams) |
252 | { | 253 | { |
253 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) | 254 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) |
254 | return; | 255 | return; |
@@ -264,14 +265,17 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
264 | return; | 265 | return; |
265 | } | 266 | } |
266 | 267 | ||
267 | UUID objectUuid; | 268 | UUID uuid; |
268 | if (!UUID.TryParse(mainParams[3], out objectUuid)) | 269 | uint localId; |
269 | { | 270 | if (!ConsoleUtil.TryParseConsoleId(m_console, mainParams[3], out uuid, out localId)) |
270 | m_console.OutputFormat("{0} is not a valid uuid", mainParams[3]); | ||
271 | return; | 271 | return; |
272 | } | ||
273 | 272 | ||
274 | SceneObjectGroup so = m_scene.GetSceneObjectGroup(objectUuid); | 273 | SceneObjectGroup so; |
274 | |||
275 | if (localId != ConsoleUtil.LocalIdNotFound) | ||
276 | so = m_scene.GetSceneObjectGroup(localId); | ||
277 | else | ||
278 | so = m_scene.GetSceneObjectGroup(uuid); | ||
275 | 279 | ||
276 | if (so == null) | 280 | if (so == null) |
277 | { | 281 | { |
@@ -348,7 +352,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
348 | OutputSogsToConsole(searchPredicate, showFull); | 352 | OutputSogsToConsole(searchPredicate, showFull); |
349 | } | 353 | } |
350 | 354 | ||
351 | private void HandleShowPartByUuid(string module, string[] cmdparams) | 355 | private void HandleShowPartById(string module, string[] cmdparams) |
352 | { | 356 | { |
353 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) | 357 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) |
354 | return; | 358 | return; |
@@ -361,18 +365,20 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
361 | 365 | ||
362 | if (mainParams.Count < 4) | 366 | if (mainParams.Count < 4) |
363 | { | 367 | { |
364 | m_console.OutputFormat("Usage: show part uuid [--full] <uuid>"); | 368 | m_console.OutputFormat("Usage: show part id [--full] <UUID-or-localID>"); |
365 | return; | 369 | return; |
366 | } | 370 | } |
367 | 371 | ||
368 | UUID objectUuid; | 372 | UUID objectUuid; |
369 | if (!UUID.TryParse(mainParams[3], out objectUuid)) | 373 | uint localId; |
370 | { | 374 | if (!ConsoleUtil.TryParseConsoleId(m_console, mainParams[3], out objectUuid, out localId)) |
371 | m_console.OutputFormat("{0} is not a valid uuid", mainParams[3]); | ||
372 | return; | 375 | return; |
373 | } | ||
374 | 376 | ||
375 | SceneObjectPart sop = m_scene.GetSceneObjectPart(objectUuid); | 377 | SceneObjectPart sop; |
378 | if (localId == ConsoleUtil.LocalIdNotFound) | ||
379 | sop = m_scene.GetSceneObjectPart(objectUuid); | ||
380 | else | ||
381 | sop = m_scene.GetSceneObjectPart(localId); | ||
376 | 382 | ||
377 | if (sop == null) | 383 | if (sop == null) |
378 | { | 384 | { |
@@ -460,22 +466,27 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
460 | OutputSopsToConsole(searchPredicate, true); | 466 | OutputSopsToConsole(searchPredicate, true); |
461 | } | 467 | } |
462 | 468 | ||
463 | private void HandleDumpObjectByUuid(string module, string[] cmdparams) | 469 | private void HandleDumpObjectById(string module, string[] cmdparams) |
464 | { | 470 | { |
465 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) | 471 | if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene)) |
466 | return; | 472 | return; |
467 | 473 | ||
468 | if (cmdparams.Length < 4) | 474 | if (cmdparams.Length < 4) |
469 | { | 475 | { |
470 | m_console.OutputFormat("Usage: dump object uuid <uuid>"); | 476 | m_console.OutputFormat("Usage: dump object id <UUID-or-localID>"); |
471 | return; | 477 | return; |
472 | } | 478 | } |
473 | 479 | ||
474 | UUID objectUuid; | 480 | UUID objectUuid; |
475 | if (!ConsoleUtil.TryParseConsoleUuid(m_console, cmdparams[3], out objectUuid)) | 481 | uint localId; |
482 | if (!ConsoleUtil.TryParseConsoleId(m_console, cmdparams[3], out objectUuid, out localId)) | ||
476 | return; | 483 | return; |
477 | 484 | ||
478 | SceneObjectGroup so = m_scene.GetSceneObjectGroup(objectUuid); | 485 | SceneObjectGroup so; |
486 | if (localId == ConsoleUtil.LocalIdNotFound) | ||
487 | so = m_scene.GetSceneObjectGroup(objectUuid); | ||
488 | else | ||
489 | so = m_scene.GetSceneObjectGroup(localId); | ||
479 | 490 | ||
480 | if (so == null) | 491 | if (so == null) |
481 | { | 492 | { |
@@ -483,6 +494,9 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
483 | return; | 494 | return; |
484 | } | 495 | } |
485 | 496 | ||
497 | // In case we found it via local ID. | ||
498 | objectUuid = so.UUID; | ||
499 | |||
486 | string fileName = string.Format("{0}.xml", objectUuid); | 500 | string fileName = string.Format("{0}.xml", objectUuid); |
487 | 501 | ||
488 | if (!ConsoleUtil.CheckFileDoesNotExist(m_console, fileName)) | 502 | if (!ConsoleUtil.CheckFileDoesNotExist(m_console, fileName)) |
@@ -661,19 +675,24 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands | |||
661 | 675 | ||
662 | break; | 676 | break; |
663 | 677 | ||
664 | case "uuid": | 678 | case "id": |
665 | if (!UUID.TryParse(o, out match)) | 679 | UUID uuid; |
680 | uint localId; | ||
681 | if (!ConsoleUtil.TryParseConsoleId(m_console, o, out uuid, out localId)) | ||
666 | return; | 682 | return; |
667 | 683 | ||
668 | requireConfirmation = false; | 684 | requireConfirmation = false; |
669 | deletes = new List<SceneObjectGroup>(); | 685 | deletes = new List<SceneObjectGroup>(); |
670 | 686 | ||
671 | m_scene.ForEachSOG(delegate (SceneObjectGroup g) | 687 | SceneObjectGroup so; |
672 | { | 688 | if (localId == ConsoleUtil.LocalIdNotFound) |
673 | if (g.UUID == match && !g.IsAttachment) | 689 | so = m_scene.GetSceneObjectGroup(uuid); |
674 | deletes.Add(g); | 690 | else |
675 | }); | 691 | so = m_scene.GetSceneObjectGroup(localId); |
676 | 692 | ||
693 | if (!so.IsAttachment) | ||
694 | deletes.Add(so); | ||
695 | |||
677 | // if (deletes.Count == 0) | 696 | // if (deletes.Count == 0) |
678 | // m_console.OutputFormat("No objects were found with uuid {0}", match); | 697 | // m_console.OutputFormat("No objects were found with uuid {0}", match); |
679 | 698 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 5f45529..532598a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -4688,13 +4688,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
4688 | /// Get a group via its UUID | 4688 | /// Get a group via its UUID |
4689 | /// </summary> | 4689 | /// </summary> |
4690 | /// <param name="fullID"></param> | 4690 | /// <param name="fullID"></param> |
4691 | /// <returns>null if no group with that name exists</returns> | 4691 | /// <returns>null if no group with that id exists</returns> |
4692 | public SceneObjectGroup GetSceneObjectGroup(UUID fullID) | 4692 | public SceneObjectGroup GetSceneObjectGroup(UUID fullID) |
4693 | { | 4693 | { |
4694 | return m_sceneGraph.GetSceneObjectGroup(fullID); | 4694 | return m_sceneGraph.GetSceneObjectGroup(fullID); |
4695 | } | 4695 | } |
4696 | 4696 | ||
4697 | /// <summary> | 4697 | /// <summary> |
4698 | /// Get a group via its local ID | ||
4699 | /// </summary> | ||
4700 | /// <remarks>This will only return a group if the local ID matches a root part</remarks> | ||
4701 | /// <param name="localID"></param> | ||
4702 | /// <returns>null if no group with that id exists</returns> | ||
4703 | public SceneObjectGroup GetSceneObjectGroup(uint localID) | ||
4704 | { | ||
4705 | return m_sceneGraph.GetSceneObjectGroup(localID); | ||
4706 | } | ||
4707 | |||
4708 | /// <summary> | ||
4698 | /// Get a group by name from the scene (will return the first | 4709 | /// Get a group by name from the scene (will return the first |
4699 | /// found, if there are more than one prim with the same name) | 4710 | /// found, if there are more than one prim with the same name) |
4700 | /// </summary> | 4711 | /// </summary> |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 209a770..a4383fd 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -983,6 +983,30 @@ namespace OpenSim.Region.Framework.Scenes | |||
983 | } | 983 | } |
984 | 984 | ||
985 | /// <summary> | 985 | /// <summary> |
986 | /// Get a group in the scene | ||
987 | /// </summary> | ||
988 | /// <remarks> | ||
989 | /// This will only return a group if the local ID matches the root part, not other parts. | ||
990 | /// </remarks> | ||
991 | /// <param name="localID">Local id of the root part of the group</param> | ||
992 | /// <returns>null if no such group was found</returns> | ||
993 | protected internal SceneObjectGroup GetSceneObjectGroup(uint localID) | ||
994 | { | ||
995 | lock (SceneObjectGroupsByLocalPartID) | ||
996 | { | ||
997 | if (SceneObjectGroupsByLocalPartID.ContainsKey(localID)) | ||
998 | { | ||
999 | SceneObjectGroup so = SceneObjectGroupsByLocalPartID[localID]; | ||
1000 | |||
1001 | if (so.LocalId == localID) | ||
1002 | return so; | ||
1003 | } | ||
1004 | } | ||
1005 | |||
1006 | return null; | ||
1007 | } | ||
1008 | |||
1009 | /// <summary> | ||
986 | /// Get a group by name from the scene (will return the first | 1010 | /// Get a group by name from the scene (will return the first |
987 | /// found, if there are more than one prim with the same name) | 1011 | /// found, if there are more than one prim with the same name) |
988 | /// </summary> | 1012 | /// </summary> |