From cd45234e7da8ea0dda5e012701751de521b18e55 Mon Sep 17 00:00:00 2001 From: Jim Radford Date: Mon, 9 Nov 2009 07:25:10 +0000 Subject: [PATCH] * Adds Variant to MapLayerMessage for making the actual Request * Fixes Decoder exception being thrown due to duplicate message events for AgentData.Flags being used multiple places in the message template but having different underlying types. git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@3221 52acb1d6-8a22-11de-b505-999d5b087335 --- OpenMetaverse/Messages/LindenMessages.cs | 80 +++++++++++++++++-- OpenMetaverse/Messages/MessageEventDecoder.cs | 2 +- 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/OpenMetaverse/Messages/LindenMessages.cs b/OpenMetaverse/Messages/LindenMessages.cs index c149bc1d..fe745237 100644 --- a/OpenMetaverse/Messages/LindenMessages.cs +++ b/OpenMetaverse/Messages/LindenMessages.cs @@ -2205,16 +2205,50 @@ namespace OpenMetaverse.Messages.Linden #region Grid/Maps - /// - /// A message sent from the simulator to the viewer which contains an array of map images and their grid coordinates - /// - public class MapLayerMessage : IMessage + /// Base class for Map Layers via Capabilities + public abstract class MapLayerMessageBase { /// public int Flags; /// - /// A n object containing map location details + /// Serialize the object + /// + /// An containing the objects data + public abstract OSDMap Serialize(); + + /// + /// Deserialize the message + /// + /// An containing the data + public abstract void Deserialize(OSDMap map); + } + + /// + /// Sent by an agent to the capabilities server to request map layers + /// + public class MapLayerRequestVariant : MapLayerMessageBase + { + public override OSDMap Serialize() + { + OSDMap map = new OSDMap(1); + map["Flags"] = OSD.FromInteger(Flags); + return map; + } + + public override void Deserialize(OSDMap map) + { + Flags = map["Flags"].AsInteger(); + } + } + + /// + /// A message sent from the simulator to the viewer which contains an array of map images and their grid coordinates + /// + public class MapLayerReplyVariant : MapLayerMessageBase + { + /// + /// An object containing map location details /// public class LayerData { @@ -2237,7 +2271,7 @@ namespace OpenMetaverse.Messages.Linden /// Serialize the object /// /// An containing the objects data - public OSDMap Serialize() + public override OSDMap Serialize() { OSDMap map = new OSDMap(2); OSDMap agentMap = new OSDMap(1); @@ -2267,7 +2301,7 @@ namespace OpenMetaverse.Messages.Linden /// Deserialize the message /// /// An containing the data - public void Deserialize(OSDMap map) + public override void Deserialize(OSDMap map) { OSDMap agentMap = (OSDMap)map["AgentData"]; Flags = agentMap["Flags"].AsInteger(); @@ -2292,6 +2326,38 @@ namespace OpenMetaverse.Messages.Linden } } + public class MapLayerMessage : IMessage + { + /// Object containing request or response + public MapLayerMessageBase Request; + + /// + /// Serialize the object + /// + /// An containing the objects data + public OSDMap Serialize() + { + return Request.Serialize(); + } + + /// + /// Deserialize the message + /// + /// An containing the data + public void Deserialize(OSDMap map) + { + if (map.ContainsKey("LayerData")) + Request = new MapLayerReplyVariant(); + else if (map.ContainsKey("Flags")) + Request = new MapLayerRequestVariant(); + else + Logger.Log("Unable to deserialize MapLayerMessage: No message handler exists", Helpers.LogLevel.Warning); + + if (Request != null) + Request.Deserialize(map); + } + } + #endregion #region Session/Communication diff --git a/OpenMetaverse/Messages/MessageEventDecoder.cs b/OpenMetaverse/Messages/MessageEventDecoder.cs index 73770d6a..9c868ad3 100644 --- a/OpenMetaverse/Messages/MessageEventDecoder.cs +++ b/OpenMetaverse/Messages/MessageEventDecoder.cs @@ -119,7 +119,7 @@ namespace OpenMetaverse.Messages } catch (Exception e) { - Logger.Log("Exception while tring to Deserialize " + eventName + ":" + e.Message + ": " + e.StackTrace, Helpers.LogLevel.Error); + Logger.Log("Exception while tring to Deserialize " + eventName + ":" + e.Message + ": " + e.StackTrace, Helpers.LogLevel.Error); } return null;