diff --git a/OpenMetaverse/Capabilities/EventQueueServer.cs b/OpenMetaverse/Capabilities/EventQueueServer.cs index ea1cfccc..6b4f9f35 100644 --- a/OpenMetaverse/Capabilities/EventQueueServer.cs +++ b/OpenMetaverse/Capabilities/EventQueueServer.cs @@ -27,13 +27,23 @@ using System; using System.Net; -#if !PocketPC - namespace OpenMetaverse.Capabilities { public class EventQueueServer { + public EventQueueServer(HttpServer server, string path) + { + HttpRequestSignature signature = new HttpRequestSignature(); + signature.Method = "post"; + signature.ContentType = String.Empty; + signature.Path = path; + HttpServer.HttpRequestCallback callback = new HttpServer.HttpRequestCallback(EventQueueHandler); + HttpServer.HttpRequestHandler handler = new HttpServer.HttpRequestHandler(signature, callback); + server.AddHandler(handler); + } + + protected void EventQueueHandler(HttpRequestSignature signature, ref HttpListenerContext context) + { + } } } - -#endif diff --git a/OpenMetaverse/Capabilities/HttpServer.cs b/OpenMetaverse/Capabilities/HttpServer.cs index 221ae406..07191b46 100644 --- a/OpenMetaverse/Capabilities/HttpServer.cs +++ b/OpenMetaverse/Capabilities/HttpServer.cs @@ -32,7 +32,7 @@ namespace OpenMetaverse.Capabilities { public class HttpServer { - public delegate void HttpRequestCallback(ref HttpListenerContext context); + public delegate void HttpRequestCallback(HttpRequestSignature signature, ref HttpListenerContext context); public struct HttpRequestHandler : IEquatable { @@ -153,7 +153,7 @@ namespace OpenMetaverse.Capabilities // Request signature matched, handle it try { - handler.Callback(ref context); + handler.Callback(signature, ref context); } catch (Exception e) { diff --git a/OpenMetaverse/NameValue.cs b/OpenMetaverse/NameValue.cs index 3a686975..24d1db4a 100644 --- a/OpenMetaverse/NameValue.cs +++ b/OpenMetaverse/NameValue.cs @@ -26,6 +26,7 @@ using System; using System.Collections.Generic; +using System.Text; namespace OpenMetaverse { @@ -35,6 +36,8 @@ namespace OpenMetaverse /// public struct NameValue { + #region Enums + /// Type of the value public enum ValueType { @@ -91,6 +94,8 @@ namespace OpenMetaverse DataSimViewer } + #endregion Enums + /// public string Name; @@ -111,7 +116,6 @@ namespace OpenMetaverse "S32", "VEC3", "U32", - "CAMERA", // Obsolete "ASSET", "U64" }; @@ -128,6 +132,13 @@ namespace OpenMetaverse "SV", // Sim Viewer "DSV" // Data Sim Viewer }; + private static readonly char[] Separators = new char[] + { + ' ', + '\n', + '\t', + '\r' + }; /// /// Constructor that takes all the fields as parameters @@ -153,10 +164,9 @@ namespace OpenMetaverse public NameValue(string data) { int i; - char[] seps = new char[]{ ' ', '\n', '\t', '\r' }; // Name - i = data.IndexOfAny(seps); + i = data.IndexOfAny(Separators); if (i < 1) { Name = String.Empty; @@ -170,21 +180,21 @@ namespace OpenMetaverse data = data.Substring(i + 1); // Type - i = data.IndexOfAny(seps); + i = data.IndexOfAny(Separators); if (i > 0) { Type = GetValueType(data.Substring(0, i)); data = data.Substring(i + 1); // Class - i = data.IndexOfAny(seps); + i = data.IndexOfAny(Separators); if (i > 0) { Class = GetClassType(data.Substring(0, i)); data = data.Substring(i + 1); // Sendto - i = data.IndexOfAny(seps); + i = data.IndexOfAny(Separators); if (i > 0) { Sendto = GetSendtoType(data.Substring(0, 1)); @@ -201,6 +211,28 @@ namespace OpenMetaverse SetValue(data); } + public static string NameValuesToString(NameValue[] values) + { + if (values == null || values.Length == 0) + return String.Empty; + + StringBuilder output = new StringBuilder(); + + for (int i = 0; i < values.Length; i++) + { + NameValue value = values[i]; + + if (value.Value != null) + { + string newLine = (i < values.Length - 1) ? "\n" : String.Empty; + output.AppendFormat("{0} {1} {2} {3} {4}{5}", value.Name, TypeStrings[(int)value.Type], + ClassStrings[(int)value.Class], SendtoStrings[(int)value.Sendto], value.Value.ToString(), newLine); + } + } + + return output.ToString(); + } + private void SetValue(string value) { switch (Type) diff --git a/Programs/Simian/Extensions/Movement.cs b/Programs/Simian/Extensions/Movement.cs index 868f55eb..bc8d21d0 100644 --- a/Programs/Simian/Extensions/Movement.cs +++ b/Programs/Simian/Extensions/Movement.cs @@ -139,7 +139,7 @@ namespace Simian.Extensions update.ObjectData[0].JointType = (byte)0; update.ObjectData[0].Material = (byte)3; update.ObjectData[0].MediaURL = new byte[0]; - update.ObjectData[0].NameValue = Utils.StringToBytes(agent.Avatar.Name); + update.ObjectData[0].NameValue = Utils.StringToBytes(NameValue.NameValuesToString(agent.Avatar.NameValues)); update.ObjectData[0].ObjectData = objectData; update.ObjectData[0].OwnerID = UUID.Zero; update.ObjectData[0].ParentID = 0; diff --git a/Programs/Simian/Extensions/SceneManager.cs b/Programs/Simian/Extensions/SceneManager.cs index 466309ad..62eeeb91 100644 --- a/Programs/Simian/Extensions/SceneManager.cs +++ b/Programs/Simian/Extensions/SceneManager.cs @@ -41,19 +41,17 @@ namespace Simian // Create a representation for this agent Avatar avatar = new Avatar(); avatar.ID = agent.AgentID; - avatar.NameValues = agent.Avatar.NameValues; avatar.LocalID = (uint)Interlocked.Increment(ref currentLocalID); avatar.Position = new Vector3(128f, 128f, 25f); avatar.Rotation = Quaternion.Identity; avatar.Scale = new Vector3(1f, 1f, 3f); + // Set the avatar name NameValue[] name = new NameValue[2]; - name[0] = new NameValue(); - name[0].Name = "FirstName"; - name[0].Value = agent.FirstName; - name[1] = new NameValue(); - name[1].Name = "LastName"; - name[1].Value = agent.LastName; + name[0] = new NameValue("FirstName", NameValue.ValueType.String, NameValue.ClassType.ReadWrite, + NameValue.SendtoType.SimViewer, agent.FirstName); + name[1] = new NameValue("LastName", NameValue.ValueType.String, NameValue.ClassType.ReadWrite, + NameValue.SendtoType.SimViewer, agent.LastName); avatar.NameValues = name; // Link this avatar up with the corresponding agent @@ -78,15 +76,22 @@ namespace Simian void AgentWearablesRequestHandler(Packet packet, Agent agent) { - /*AgentWearablesUpdatePacket update = new AgentWearablesUpdatePacket(); + AgentWearablesUpdatePacket update = new AgentWearablesUpdatePacket(); update.AgentData.AgentID = agent.AgentID; update.AgentData.SessionID = agent.SessionID; // Technically this should be per-agent, but if the only requirement is that it // increments this is easier update.AgentData.SerialNum = (uint)Interlocked.Increment(ref currentWearablesSerialNum); - update.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[0]; + update.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[4]; + for (int i = 0; i < 4; i++) + { + update.WearableData[i] = new AgentWearablesUpdatePacket.WearableDataBlock(); + update.WearableData[i].AssetID = UUID.Zero; + update.WearableData[i].ItemID = UUID.Zero; + update.WearableData[i].WearableType = 42; // HACK + } - agent.SendPacket(update);*/ + agent.SendPacket(update); } void LoadTerrain(string mapFile) diff --git a/Programs/Simian/Simian.cs b/Programs/Simian/Simian.cs index 20f7521e..6e874c6d 100644 --- a/Programs/Simian/Simian.cs +++ b/Programs/Simian/Simian.cs @@ -129,13 +129,13 @@ namespace Simian HttpServer.Start(); } - void LoginWebpageHeadHandler(ref HttpListenerContext context) + void LoginWebpageHeadHandler(HttpRequestSignature signature, ref HttpListenerContext context) { context.Response.StatusCode = (int)HttpStatusCode.OK; context.Response.StatusDescription = "OK"; } - void LoginWebpageGetHandler(ref HttpListenerContext context) + void LoginWebpageGetHandler(HttpRequestSignature signature, ref HttpListenerContext context) { string pageContent = "Simian

Welcome to Simian

"; byte[] pageData = Encoding.UTF8.GetBytes(pageContent); @@ -143,7 +143,7 @@ namespace Simian context.Response.Close(); } - void LoginXmlRpcPostHandler(ref HttpListenerContext context) + void LoginXmlRpcPostHandler(HttpRequestSignature signature, ref HttpListenerContext context) { string firstName = String.Empty, @@ -230,7 +230,7 @@ namespace Simian } } - void LoginLLSDPostHandler(ref HttpListenerContext context) + void LoginLLSDPostHandler(HttpRequestSignature signature, ref HttpListenerContext context) { string body = String.Empty;