diff --git a/OpenMetaverse/Caps.cs b/OpenMetaverse/Caps.cs index e984910f..c79a83c1 100644 --- a/OpenMetaverse/Caps.cs +++ b/OpenMetaverse/Caps.cs @@ -28,6 +28,7 @@ using System; using System.Collections.Generic; using System.Text; using System.Threading; +using OpenMetaverse.Packets; using OpenMetaverse.StructuredData; using OpenMetaverse.Interfaces; using OpenMetaverse.Http; @@ -127,13 +128,19 @@ namespace OpenMetaverse // Create a request list OSDArray req = new OSDArray(); + // This list can be updated by using the following command to obtain a current list of capabilities the official linden viewer supports: + // wget -q -O - http://svn.secondlife.com/svn/linden/trunk/indra/newview/llviewerregion.cpp | grep 'capabilityNames.append' | sed 's/^[ \t]*//;s/capabilityNames.append("/req.Add("/' req.Add("ChatSessionRequest"); req.Add("CopyInventoryFromNotecard"); req.Add("DispatchRegionInfo"); req.Add("EstateChangeInfo"); req.Add("EventQueueGet"); - req.Add("FetchInventoryDescendents"); + req.Add("FetchInventory"); + req.Add("WebFetchInventoryDescendents"); + req.Add("FetchLib"); + req.Add("FetchLibDescendents"); req.Add("GroupProposalBallot"); + req.Add("HomeLocation"); req.Add("MapLayer"); req.Add("MapLayerGod"); req.Add("NewFileAgentInventory"); @@ -149,14 +156,17 @@ namespace OpenMetaverse req.Add("SendUserReportWithScreenshot"); req.Add("ServerReleaseNotes"); req.Add("StartGroupProposal"); + req.Add("UntrustedSimulatorMessage"); + req.Add("UpdateAgentInformation"); + req.Add("UpdateAgentLanguage"); req.Add("UpdateGestureAgentInventory"); req.Add("UpdateNotecardAgentInventory"); req.Add("UpdateScriptAgent"); req.Add("UpdateGestureTaskInventory"); req.Add("UpdateNotecardTaskInventory"); req.Add("UpdateScriptTask"); + req.Add("UploadBakedTexture"); req.Add("ViewerStartAuction"); - req.Add("UntrustedSimulatorMessage"); req.Add("ViewerStats"); _SeedRequest = new CapsClient(new Uri(_SeedCapsURI)); @@ -197,6 +207,11 @@ namespace OpenMetaverse Simulator.Client.Network.RaiseConnectedEvent(Simulator); } + /// + /// Process any incoming events, check to see if we have a message created for the event, + /// + /// + /// private void EventQueueEventHandler(string eventName, OSDMap body) { IMessage message = DecodeEvent(eventName, body); @@ -209,7 +224,29 @@ namespace OpenMetaverse } else { - Logger.Log("No Message class exists for event " + eventName + ". Unable to decode", Helpers.LogLevel.Warning); + Logger.Log("No Message handler exists for event " + eventName + ". Unable to decode. Will try Generic Handler next", Helpers.LogLevel.Warning); + Logger.Log("Please report this information to http://jira.openmv.org/: \n" + body, Helpers.LogLevel.Debug); + + // try generic decoder next which takes a caps event and tries to match it to an existing packet + if (body.Type == OSDType.Map) + { + OSDMap map = (OSDMap)body; + Packet packet = Packet.BuildPacket(eventName, map); + if (packet != null) + { + NetworkManager.IncomingPacket incomingPacket; + incomingPacket.Simulator = Simulator; + incomingPacket.Packet = packet; + + Logger.DebugLog("Serializing " + packet.Type.ToString() + " capability with generic handler", Simulator.Client); + + Simulator.Client.Network.PacketInbox.Enqueue(incomingPacket); + } + else + { + Logger.Log("No Packet or Message handler exists for " + eventName, Helpers.LogLevel.Warning); + } + } } } } diff --git a/OpenMetaverse/EventDictionary.cs b/OpenMetaverse/EventDictionary.cs index 7ec09578..922dad23 100644 --- a/OpenMetaverse/EventDictionary.cs +++ b/OpenMetaverse/EventDictionary.cs @@ -236,7 +236,7 @@ namespace OpenMetaverse } /// - /// Register an event handler + /// Register an new event handler for a capabilities event sent via the EventQueue /// /// Use String.Empty to fire this event on every CAPS event /// Capability event name to register the @@ -254,7 +254,7 @@ namespace OpenMetaverse } /// - /// + /// Unregister a previously registered capabilities handler /// /// Capability event name unregister the /// handler for @@ -290,24 +290,6 @@ namespace OpenMetaverse } } - // Generic parser next - //if (body.Type == StructuredData.OSDType.Map) - //{ - // StructuredData.OSDMap map = (StructuredData.OSDMap)body; - // Packet packet = Packet.BuildPacket(capsEvent, map); - // if (packet != null) - // { - // NetworkManager.IncomingPacket incomingPacket; - // incomingPacket.Simulator = simulator; - // incomingPacket.Packet = packet; - - // Logger.DebugLog("Serializing " + packet.Type.ToString() + " capability with generic handler", Client); - - // Client.Network.PacketInbox.Enqueue(incomingPacket); - // specialHandler = true; - // } - //} - // Explicit handler next if (_EventTable.TryGetValue(capsEvent, out callback) && callback != null) { @@ -346,25 +328,6 @@ namespace OpenMetaverse ThreadPool.QueueUserWorkItem(_ThreadPoolCallback, wrapper); } } - - // Generic parser next, don't generic parse events we've manually registered for - //if (body.Type == StructuredData.OSDType.Map && !_EventTable.ContainsKey(capsEvent)) - //{ - // StructuredData.OSDMap map = (StructuredData.OSDMap)body; - // Packet packet = Packet.BuildPacket(capsEvent, map); - - // if (packet != null) - // { - // NetworkManager.IncomingPacket incomingPacket; - // incomingPacket.Simulator = simulator; - // incomingPacket.Packet = packet; - - // Logger.DebugLog("Serializing " + packet.Type.ToString() + " capability with generic handler", Client); - - // Client.Network.PacketInbox.Enqueue(incomingPacket); - // specialHandler = true; - // } - //} // Explicit handler next if (_EventTable.TryGetValue(capsEvent, out callback) && callback != null) diff --git a/OpenMetaverse/Messages/LindenMessages.cs b/OpenMetaverse/Messages/LindenMessages.cs index c7608b22..4f531792 100644 --- a/OpenMetaverse/Messages/LindenMessages.cs +++ b/OpenMetaverse/Messages/LindenMessages.cs @@ -224,6 +224,61 @@ namespace OpenMetaverse.Messages.Linden } } + /// + /// A message sent to the client which indicates a teleport request has failed + /// and contains some information on why it failed + /// + public class TeleportFailedMessage : IMessage + { + /// + public string ExtraParams; + /// A string key of the reason the teleport failed e.g. CouldntTPCloser + /// Which could be used to look up a value in a dictionary or enum + public string MessageKey; + /// The of the Agent + public UUID AgentID; + /// A string human readable message containing the reason + /// An example: Could not teleport closer to destination + public string Reason; + + /// + /// Serialize the message object into an OSD map + /// + /// An containing the serialized message object + public OSDMap Serialize() + { + OSDMap map = new OSDMap(2); + + OSDMap alertInfoMap = new OSDMap(2); + alertInfoMap["ExtraParams"] = OSD.FromString(ExtraParams); + alertInfoMap["Message"] = OSD.FromString(MessageKey); + map["AlertInfo"] = alertInfoMap; + + OSDMap infoMap = new OSDMap(2); + infoMap["AgentID"] = OSD.FromUUID(AgentID); + infoMap["Reason"] = OSD.FromString(Reason); + map["Info"] = infoMap; + + return map; + + } + + /// + /// Deserialize an OSDMap into a message object + /// + /// + public void Deserialize(OSDMap map) + { + OSDMap alertInfoMap = (OSDMap)map["AlertInfo"]; + ExtraParams = alertInfoMap["ExtraParams"].AsString(); + MessageKey = alertInfoMap["Message"].AsString(); + + OSDMap infoMap = (OSDMap) map["Info"]; + AgentID = infoMap["AgentID"].AsUUID(); + Reason = infoMap["Reason"].AsString(); + } + } + public class LandStatReplyMessage : IMessage { diff --git a/OpenMetaverse/Messages/MessageEventDecoder.cs b/OpenMetaverse/Messages/MessageEventDecoder.cs index 5c156f47..ea18716f 100644 --- a/OpenMetaverse/Messages/MessageEventDecoder.cs +++ b/OpenMetaverse/Messages/MessageEventDecoder.cs @@ -77,6 +77,8 @@ namespace OpenMetaverse case "ViewerStats": message = new ViewerStatsMessage(); break; case "EventQueueGet": message = new EventQueueGetMessage(); break; case "CrossedRegion": message = new CrossedRegionMessage(); break; + case "TelportFailed": message = new TeleportFailedMessage(); break; + // Capabilities TODO: // DispatchRegionInfo