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