From 08fde07576eca136e6ee747967a842ad0708f30a Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Mon, 6 Jul 2015 15:16:39 +0200 Subject: [PATCH] LIBOMV-990: WinProxy: No Decoder for GetObjectCost, patch by Frederick Martian --- OpenMetaverse/Messages/LindenMessages.cs | 138 +++++++++++++++++- OpenMetaverse/Messages/MessageEventDecoder.cs | 2 +- 2 files changed, 131 insertions(+), 9 deletions(-) diff --git a/OpenMetaverse/Messages/LindenMessages.cs b/OpenMetaverse/Messages/LindenMessages.cs index b82845c1..d729ea97 100644 --- a/OpenMetaverse/Messages/LindenMessages.cs +++ b/OpenMetaverse/Messages/LindenMessages.cs @@ -1757,7 +1757,7 @@ namespace OpenMetaverse.Messages.Linden HasModifiedNavmesh = map["has_modified_navmesh"]; if (map["preferences"] is OSDMap) { - var prefs = (OSDMap)map["preferences"]; + OSDMap prefs = (OSDMap)map["preferences"]; AlterNavmeshObjects = prefs["alter_navmesh_objects"]; AlterPermanentObjects = prefs["alter_permanent_objects"]; GodLevel = prefs["god_level"]; @@ -1765,7 +1765,7 @@ namespace OpenMetaverse.Messages.Linden LanguageIsPublic = prefs["language_is_public"]; if (prefs["access_prefs"] is OSDMap) { - var access = (OSDMap)prefs["access_prefs"]; + OSDMap access = (OSDMap)prefs["access_prefs"]; MaxAccess = access["max"]; } } @@ -4376,11 +4376,10 @@ namespace OpenMetaverse.Messages.Linden ret["ObjectData"] = array; return ret; - } /// - /// Deseializes the message + /// Deserializes the message /// /// Incoming data to deserialize public void Deserialize(OSDMap map) @@ -4406,6 +4405,10 @@ namespace OpenMetaverse.Messages.Linden { public OSD MaterialData; + /// + /// Deserializes the message + /// + /// Incoming data to deserialize public void Deserialize(OSDMap map) { try @@ -4435,15 +4438,132 @@ namespace OpenMetaverse.Messages.Linden MaterialData = new OSDMap(); } } - + + /// + /// Serializes the message + /// + /// Serialized OSD public OSDMap Serialize() { return new OSDMap(); } - - } + public class GetObjectCostRequest : IMessage + { + /// Object IDs for which to request cost information + public UUID[] ObjectIDs; + + /// + /// Deserializes the message + /// + /// Incoming data to deserialize + public void Deserialize(OSDMap map) + { + OSDArray array = map["object_ids"] as OSDArray; + if (array != null) + { + ObjectIDs = new UUID[array.Count]; + + for (int i = 0; i < array.Count; i++) + { + ObjectIDs[i] = array[i].AsUUID(); + } + } + else + { + ObjectIDs = new UUID[0]; + } + } + + /// + /// Serializes the message + /// + /// Serialized OSD + public OSDMap Serialize() + { + OSDMap ret = new OSDMap(); + OSDArray array = new OSDArray(); + + for (int i = 0; i < ObjectIDs.Length; i++) + { + array.Add(OSD.FromUUID(ObjectIDs[i])); + } + + ret["object_ids"] = array; + return ret; + } + } + + public class GetObjectCostMessage : IMessage + { + public UUID object_id; + public double link_cost; + public double object_cost; + public double physics_cost; + public double link_physics_cost; + + /// + /// Deserializes the message + /// + /// Incoming data to deserialize + public void Deserialize(OSDMap map) + { + if (map.Count != 1) + Logger.Log("GetObjectCostMessage returned values for more than one object! Function needs to be fixed for that!", Helpers.LogLevel.Error); + + foreach (string key in map.Keys) + { + UUID.TryParse(key, out object_id); + OSDMap values = (OSDMap)map[key]; + + link_cost = values["linked_set_resource_cost"].AsReal(); + object_cost = values["resource_cost"].AsReal(); + physics_cost = values["physics_cost"].AsReal(); + link_physics_cost = values["linked_set_physics_cost"].AsReal(); + // value["resource_limiting_type"].AsString(); + return; + } + } + + /// + /// Serializes the message + /// + /// Serialized OSD + public OSDMap Serialize() + { + OSDMap values = new OSDMap(4); + values.Add("linked_set_resource_cost", OSD.FromReal(link_cost)); + values.Add("resource_cost", OSD.FromReal(object_cost)); + values.Add("physics_cost", OSD.FromReal(physics_cost)); + values.Add("linked_set_physics_cost", OSD.FromReal(link_physics_cost)); + + OSDMap map = new OSDMap(1); + map.Add(OSD.FromUUID(object_id), values); + return map; + } + + /// + /// Detects which class handles deserialization of this message + /// + /// An containing the data + /// Object capable of decoding this message + public static IMessage GetMessageHandler(OSDMap map) + { + if (map == null) + { + return null; + } + else if (map.ContainsKey("object_ids")) + { + return new GetObjectCostRequest(); + } + else + { + return new GetObjectCostMessage(); + } + } + } #endregion Object Messages @@ -5167,7 +5287,9 @@ namespace OpenMetaverse.Messages.Linden /// OSD containting the messaage public OSDMap Serialize() { - OSDArray names = new OSDArray(2) { OldDisplayName, NewDisplayName }; + OSDArray names = new OSDArray(2); + names.Add(OldDisplayName); + names.Add(NewDisplayName); OSDMap name = new OSDMap(); name["display_name"] = names; diff --git a/OpenMetaverse/Messages/MessageEventDecoder.cs b/OpenMetaverse/Messages/MessageEventDecoder.cs index 5b53e19d..71252e4e 100644 --- a/OpenMetaverse/Messages/MessageEventDecoder.cs +++ b/OpenMetaverse/Messages/MessageEventDecoder.cs @@ -100,6 +100,7 @@ namespace OpenMetaverse.Messages case "ObjectPhysicsProperties": message = new ObjectPhysicsPropertiesMessage(); break; case "BulkUpdateInventory": message = new BulkUpdateInventoryMessage(); break; case "RenderMaterials": message = new RenderMaterialsMessage(); break; + case "GetObjectCost": message = GetObjectCostMessage.GetMessageHandler(map); break; // Capabilities TODO: // DispatchRegionInfo @@ -110,7 +111,6 @@ namespace OpenMetaverse.Messages // MapLayerGod // NewFileAgentInventory // RequestTextureDownload - // SearchStatRequest // SearchStatTracking // SendUserReport // SendUserReportWithScreenshot