From cdd3ef857c296a3aee88eea0386d166222684c04 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 25 Jan 2018 08:02:45 +0000 Subject: [PATCH] a few changes to encoder and a few more uses --- OpenSim/Framework/LLSDxmlEncode.cs | 44 ++++-- .../Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 128 ++++++++++-------- 2 files changed, 110 insertions(+), 62 deletions(-) diff --git a/OpenSim/Framework/LLSDxmlEncode.cs b/OpenSim/Framework/LLSDxmlEncode.cs index afa02146ac..e095363426 100644 --- a/OpenSim/Framework/LLSDxmlEncode.cs +++ b/OpenSim/Framework/LLSDxmlEncode.cs @@ -40,7 +40,7 @@ namespace OpenSim.Framework { static readonly DateTime depoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); - public static void AddStartHeader(StringBuilder sb, bool addxmlversion = false) + public static void AddStart(StringBuilder sb, bool addxmlversion = false) { if(addxmlversion) sb.Append(""); // legacy llsd xml name still valid @@ -48,13 +48,13 @@ namespace OpenSim.Framework sb.Append(""); } - public static void AddEndHeader(StringBuilder sb) + public static void AddEnd(StringBuilder sb) { sb.Append(""); } // map == a list of key value pairs - public static void AddStartMap(StringBuilder sb) + public static void AddMap(StringBuilder sb) { sb.Append(""); } @@ -70,7 +70,7 @@ namespace OpenSim.Framework } // array == a list values - public static void AddStartArray(StringBuilder sb) + public static void AddArray(StringBuilder sb) { sb.Append(""); } @@ -99,6 +99,18 @@ namespace OpenSim.Framework sb.Append(""); } + public static void AddElem(byte e, StringBuilder sb) + { + if(e == 0) + sb.Append(""); + else + { + sb.Append(""); + sb.Append(e.ToString()); + sb.Append(""); + } + } + public static void AddElem(int e, StringBuilder sb) { if(e == 0) @@ -171,7 +183,7 @@ namespace OpenSim.Framework } } - public static void AddURIElem(Uri e, StringBuilder sb) + public static void AddElem(Uri e, StringBuilder sb) { if(e == null) { @@ -218,7 +230,7 @@ namespace OpenSim.Framework //************ key value ******************* // assumes name is a valid llsd key - public static void AddStartMap(string name, StringBuilder sb) + public static void AddMap(string name, StringBuilder sb) { sb.Append(""); sb.Append(name); @@ -233,7 +245,7 @@ namespace OpenSim.Framework } // array == a list values - public static void AddStartArray(string name, StringBuilder sb) + public static void AddArray(string name, StringBuilder sb) { sb.Append(""); sb.Append(name); @@ -267,6 +279,22 @@ namespace OpenSim.Framework sb.Append(""); } + public static void AddElem(string name, byte e, StringBuilder sb) + { + sb.Append(""); + sb.Append(name); + sb.Append(""); + + if(e == 0) + sb.Append(""); + else + { + sb.Append(""); + sb.Append(e.ToString()); + sb.Append(""); + } + } + public static void AddElem(string name, int e, StringBuilder sb) { sb.Append(""); @@ -363,7 +391,7 @@ namespace OpenSim.Framework } } - public static void AddURIElem(string name, Uri e, StringBuilder sb) + public static void AddElem(string name, Uri e, StringBuilder sb) { sb.Append(""); sb.Append(name); diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 85e5ec3395..5c5d2b971a 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -1376,30 +1376,37 @@ namespace OpenSim.Region.ClientStack.Linden IOSHttpResponse httpResponse) { OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request); - OSDMap resp = new OSDMap(); OSDArray object_ids = (OSDArray)req["object_ids"]; - for (int i = 0 ; i < object_ids.Count ; i++) + StringBuilder lsl = new StringBuilder(256); + LLSDxmlEncode.AddStart(lsl); + if(object_ids.Count == 0) + LLSDxmlEncode.AddEmpyMap(lsl); + else { - UUID uuid = object_ids[i].AsUUID(); - - SceneObjectPart obj = m_Scene.GetSceneObjectPart(uuid); - if (obj != null) + LLSDxmlEncode.AddMap(lsl); + for (int i = 0 ; i < object_ids.Count ; i++) { - OSDMap object_data = new OSDMap(); + UUID uuid = object_ids[i].AsUUID(); - object_data["PhysicsShapeType"] = obj.PhysicsShapeType; - object_data["Density"] = obj.Density; - object_data["Friction"] = obj.Friction; - object_data["Restitution"] = obj.Restitution; - object_data["GravityMultiplier"] = obj.GravityModifier; + SceneObjectPart obj = m_Scene.GetSceneObjectPart(uuid); + if (obj != null) + { + LLSDxmlEncode.AddMap(uuid.ToString(),lsl); - resp[uuid.ToString()] = object_data; + LLSDxmlEncode.AddElem("PhysicsShapeType", obj.PhysicsShapeType, lsl); + LLSDxmlEncode.AddElem("Density", obj.Density, lsl); + LLSDxmlEncode.AddElem("Friction", obj.Friction, lsl); + LLSDxmlEncode.AddElem("Restitution", obj.Restitution, lsl); + LLSDxmlEncode.AddElem("GravityMultiplier", obj.GravityModifier, lsl); + + LLSDxmlEncode.AddEndMap(lsl); + } + LLSDxmlEncode.AddEndMap(lsl); } } - - string response = OSDParser.SerializeLLSDXmlString(resp); - return response; + LLSDxmlEncode.AddEnd(lsl); + return lsl.ToString(); } public string GetObjectCost(string request, string path, @@ -1407,47 +1414,60 @@ namespace OpenSim.Region.ClientStack.Linden IOSHttpResponse httpResponse) { OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request); - OSDMap resp = new OSDMap(); - OSDArray object_ids = (OSDArray)req["object_ids"]; - for (int i = 0; i < object_ids.Count; i++) + StringBuilder lsl = new StringBuilder(512); + LLSDxmlEncode.AddStart(lsl); + if(object_ids.Count == 0) + LLSDxmlEncode.AddEmpyMap(lsl); + else { - UUID uuid = object_ids[i].AsUUID(); - - SceneObjectPart part = m_Scene.GetSceneObjectPart(uuid); - SceneObjectGroup grp = null; - if (part != null) - grp = part.ParentGroup; - if (grp != null) + bool haveone = false; + LLSDxmlEncode.AddMap(lsl); + for (int i = 0; i < object_ids.Count; i++) { - float linksetCost; - float linksetPhysCost; - float partCost; - float partPhysCost; + UUID uuid = object_ids[i].AsUUID(); - grp.GetResourcesCosts(part,out linksetCost,out linksetPhysCost,out partCost,out partPhysCost); + SceneObjectPart part = m_Scene.GetSceneObjectPart(uuid); + SceneObjectGroup grp = null; + if (part != null) + grp = part.ParentGroup; + if (grp != null) + { + haveone = true; + float linksetCost; + float linksetPhysCost; + float partCost; + float partPhysCost; - OSDMap object_data = new OSDMap(); - object_data["linked_set_resource_cost"] = linksetCost; - object_data["resource_cost"] = partCost; - object_data["physics_cost"] = partPhysCost; - object_data["linked_set_physics_cost"] = linksetPhysCost; - object_data["resource_limiting_type"] = "legacy"; - resp[uuid.ToString()] = object_data; + grp.GetResourcesCosts(part,out linksetCost,out linksetPhysCost,out partCost,out partPhysCost); + + LLSDxmlEncode.AddMap(uuid.ToString(), lsl); + + LLSDxmlEncode.AddElem("linked_set_resource_cost", linksetCost, lsl); + LLSDxmlEncode.AddElem("resource_cost", partCost, lsl); + LLSDxmlEncode.AddElem("physics_cost", partPhysCost, lsl); + LLSDxmlEncode.AddElem("linked_set_physics_cost", linksetPhysCost, lsl); + LLSDxmlEncode.AddElem("resource_limiting_type", "legacy", lsl); + + LLSDxmlEncode.AddEndMap(lsl); + } } + if(!haveone) + { + LLSDxmlEncode.AddMap(UUID.Zero.ToString(), lsl); + LLSDxmlEncode.AddElem("linked_set_resource_cost", 0, lsl); + LLSDxmlEncode.AddElem("resource_cost", 0, lsl); + LLSDxmlEncode.AddElem("physics_cost", 0, lsl); + LLSDxmlEncode.AddElem("linked_set_physics_cost", 0, lsl); + LLSDxmlEncode.AddElem("resource_limiting_type", "legacy", lsl); + LLSDxmlEncode.AddEndMap(lsl); + } + LLSDxmlEncode.AddEndMap(lsl); } - if(resp.Count == 0) - { - OSDMap object_data = new OSDMap(); - object_data["linked_set_resource_cost"] = 0; - object_data["resource_cost"] = 0; - object_data["physics_cost"] = 0; - object_data["linked_set_physics_cost"] = 0; - resp[UUID.Zero.ToString()] = object_data; - } - string response = OSDParser.SerializeLLSDXmlString(resp); - return response; + + LLSDxmlEncode.AddEnd(lsl); + return lsl.ToString(); } public string ResourceCostSelected(string request, string path, @@ -1825,13 +1845,13 @@ namespace OpenSim.Region.ClientStack.Linden Dictionary names = m_UserManager.GetUsersNames(ids); StringBuilder lsl = new StringBuilder(names.Count * 256 + 256); - LLSDxmlEncode.AddStartHeader(lsl); - LLSDxmlEncode.AddStartMap(lsl); + LLSDxmlEncode.AddStart(lsl); + LLSDxmlEncode.AddMap(lsl); if(names.Count == 0) LLSDxmlEncode.AddEmpyArray("agents", lsl); else { - LLSDxmlEncode.AddStartArray("agents", lsl); + LLSDxmlEncode.AddArray("agents", lsl); foreach (KeyValuePair kvp in names) { @@ -1846,7 +1866,7 @@ namespace OpenSim.Region.ClientStack.Linden if(parts[0] == "Unknown") continue; - LLSDxmlEncode.AddStartMap(lsl); + LLSDxmlEncode.AddMap(lsl); LLSDxmlEncode.AddElem("display_name_next_update", DateTime.UtcNow.AddDays(8), lsl); LLSDxmlEncode.AddElem("display_name_expires", DateTime.UtcNow.AddMonths(1), lsl); LLSDxmlEncode.AddElem("display_name", kvp.Value, lsl); @@ -1861,7 +1881,7 @@ namespace OpenSim.Region.ClientStack.Linden } LLSDxmlEncode.AddEndMap(lsl); - LLSDxmlEncode.AddEndHeader(lsl); + LLSDxmlEncode.AddEnd(lsl); // Full content request httpResponse.StatusCode = (int)System.Net.HttpStatusCode.OK;