From 5e4d6cab00cb29cd088ab7b62ab13aff103b64cb Mon Sep 17 00:00:00 2001 From: onefang Date: Sun, 19 May 2019 21:24:15 +1000 Subject: Dump OpenSim 0.9.0.1 into it's own branch. --- .../Linden/Caps/EventQueue/EventQueueGetModule.cs | 521 +++++++-------------- .../Linden/Caps/EventQueue/EventQueueHelper.cs | 110 +++-- .../Caps/EventQueue/Tests/EventQueueTests.cs | 14 +- 3 files changed, 239 insertions(+), 406 deletions(-) (limited to 'OpenSim/Region/ClientStack/Linden/Caps/EventQueue') diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs index 9b9f6a7..7c9a1c4 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs @@ -74,13 +74,12 @@ namespace OpenSim.Region.ClientStack.Linden private const int SERVER_EQ_TIME_NO_EVENTS = VIEWER_TIMEOUT - (10 * 1000); protected Scene m_scene; - + private Dictionary m_ids = new Dictionary(); private Dictionary> queues = new Dictionary>(); - private Dictionary m_QueueUUIDAvatarMapping = new Dictionary(); private Dictionary m_AvatarQueueUUIDMapping = new Dictionary(); - + #region INonSharedRegionModule methods public virtual void Initialise(IConfigSource config) { @@ -171,7 +170,7 @@ namespace OpenSim.Region.ClientStack.Linden foreach (KeyValuePair> kvp in queues) { MainConsole.Instance.OutputFormat( - "For agent {0} there are {1} messages queued for send.", + "For agent {0} there are {1} messages queued for send.", kvp.Key, kvp.Value.Count); } } @@ -190,7 +189,7 @@ namespace OpenSim.Region.ClientStack.Linden { if (DebugLevel > 0) m_log.DebugFormat( - "[EVENTQUEUE]: Adding new queue for agent {0} in region {1}", + "[EVENTQUEUE]: Adding new queue for agent {0} in region {1}", agentId, m_scene.RegionInfo.RegionName); queues[agentId] = new Queue(); @@ -201,6 +200,7 @@ namespace OpenSim.Region.ClientStack.Linden } /// + /// May return a null queue /// /// @@ -231,26 +231,20 @@ namespace OpenSim.Region.ClientStack.Linden lock (queue) queue.Enqueue(ev); } - else if (DebugLevel > 0) + else { - ScenePresence sp = m_scene.GetScenePresence(avatarID); - - // This assumes that an NPC should never have a queue. - if (sp != null && sp.PresenceType != PresenceType.Npc) - { OSDMap evMap = (OSDMap)ev; m_log.WarnFormat( - "[EVENTQUEUE]: (Enqueue) No queue found for agent {0} {1} when placing message {2} in region {3}", - sp.Name, sp.UUID, evMap["message"], m_scene.Name); - } + "[EVENTQUEUE]: (Enqueue) No queue found for agent {0} when placing message {1} in region {2}", + avatarID, evMap["message"], m_scene.Name); } - } + } catch (NullReferenceException e) { m_log.Error("[EVENTQUEUE] Caught exception: " + e); return false; } - + return true; } @@ -263,28 +257,13 @@ namespace OpenSim.Region.ClientStack.Linden lock (queues) queues.Remove(agentID); - List removeitems = new List(); lock (m_AvatarQueueUUIDMapping) m_AvatarQueueUUIDMapping.Remove(agentID); - UUID searchval = UUID.Zero; - - removeitems.Clear(); - - lock (m_QueueUUIDAvatarMapping) + lock (m_ids) { - foreach (UUID ky in m_QueueUUIDAvatarMapping.Keys) - { - searchval = m_QueueUUIDAvatarMapping[ky]; - - if (searchval == agentID) - { - removeitems.Add(ky); - } - } - - foreach (UUID ky in removeitems) - m_QueueUUIDAvatarMapping.Remove(ky); + if (!m_ids.ContainsKey(agentID)) + m_ids.Remove(agentID); } // m_log.DebugFormat("[EVENTQUEUE]: Deleted queues for {0} in region {1}", agentID, m_scene.RegionInfo.RegionName); @@ -309,55 +288,95 @@ namespace OpenSim.Region.ClientStack.Linden "[EVENTQUEUE]: OnRegisterCaps: agentID {0} caps {1} region {2}", agentID, caps, m_scene.RegionInfo.RegionName); - // Let's instantiate a Queue for this agent right now - TryGetQueue(agentID); - UUID eventQueueGetUUID; + Queue queue; + Random rnd = new Random(Environment.TickCount); + int nrnd = rnd.Next(30000000); + if (nrnd < 0) + nrnd = -nrnd; - lock (m_AvatarQueueUUIDMapping) + lock (queues) { - // Reuse open queues. The client does! - if (m_AvatarQueueUUIDMapping.ContainsKey(agentID)) + if (queues.ContainsKey(agentID)) + queue = queues[agentID]; + else + queue = null; + + if (queue == null) { - //m_log.DebugFormat("[EVENTQUEUE]: Found Existing UUID!"); - eventQueueGetUUID = m_AvatarQueueUUIDMapping[agentID]; + queue = new Queue(); + queues[agentID] = queue; + + // push markers to handle old responses still waiting + // this will cost at most viewer getting two forced noevents + // even being a new queue better be safe + queue.Enqueue(null); + queue.Enqueue(null); // one should be enough + + lock (m_AvatarQueueUUIDMapping) + { + eventQueueGetUUID = UUID.Random(); + if (m_AvatarQueueUUIDMapping.ContainsKey(agentID)) + { + // oops this should not happen ? + m_log.DebugFormat("[EVENTQUEUE]: Found Existing UUID without a queue"); + eventQueueGetUUID = m_AvatarQueueUUIDMapping[agentID]; + } + m_AvatarQueueUUIDMapping.Add(agentID, eventQueueGetUUID); + } + lock (m_ids) + { + if (!m_ids.ContainsKey(agentID)) + m_ids.Add(agentID, nrnd); + else + m_ids[agentID] = nrnd; + } } else { - eventQueueGetUUID = UUID.Random(); - //m_log.DebugFormat("[EVENTQUEUE]: Using random UUID!"); + // push markers to handle old responses still waiting + // this will cost at most viewer getting two forced noevents + // even being a new queue better be safe + queue.Enqueue(null); + queue.Enqueue(null); // one should be enough + + // reuse or not to reuse TODO FIX + lock (m_AvatarQueueUUIDMapping) + { + // Reuse open queues. The client does! + // Its reuse caps path not queues those are been reused already + if (m_AvatarQueueUUIDMapping.ContainsKey(agentID)) + { + m_log.DebugFormat("[EVENTQUEUE]: Found Existing UUID!"); + eventQueueGetUUID = m_AvatarQueueUUIDMapping[agentID]; + } + else + { + eventQueueGetUUID = UUID.Random(); + m_AvatarQueueUUIDMapping.Add(agentID, eventQueueGetUUID); + m_log.DebugFormat("[EVENTQUEUE]: Using random UUID!"); + } + } + lock (m_ids) + { + // change to negative numbers so they are changed at end of sending first marker + // old data on a queue may be sent on a response for a new caps + // but at least will be sent with coerent IDs + if (!m_ids.ContainsKey(agentID)) + m_ids.Add(agentID, -nrnd); // should not happen + else + m_ids[agentID] = -m_ids[agentID]; + } } } - lock (m_QueueUUIDAvatarMapping) - { - if (!m_QueueUUIDAvatarMapping.ContainsKey(eventQueueGetUUID)) - m_QueueUUIDAvatarMapping.Add(eventQueueGetUUID, agentID); - } - - lock (m_AvatarQueueUUIDMapping) - { - if (!m_AvatarQueueUUIDMapping.ContainsKey(agentID)) - m_AvatarQueueUUIDMapping.Add(agentID, eventQueueGetUUID); - } - caps.RegisterPollHandler( "EventQueueGet", new PollServiceEventArgs(null, GenerateEqgCapPath(eventQueueGetUUID), HasEvents, GetEvents, NoEvents, agentID, SERVER_EQ_TIME_NO_EVENTS)); - - Random rnd = new Random(Environment.TickCount); - lock (m_ids) - { - if (!m_ids.ContainsKey(agentID)) - m_ids.Add(agentID, rnd.Next(30000000)); - } } public bool HasEvents(UUID requestID, UUID agentID) { - // Don't use this, because of race conditions at agent closing time - //Queue queue = TryGetQueue(agentID); - Queue queue = GetQueue(agentID); if (queue != null) lock (queue) @@ -366,7 +385,8 @@ namespace OpenSim.Region.ClientStack.Linden return queue.Count > 0; } - return false; + //m_log.WarnFormat("POLLED FOR EVENTS BY {0} unknown agent", agentID); + return true; } /// @@ -383,6 +403,10 @@ namespace OpenSim.Region.ClientStack.Linden ev["message"], m_scene.GetScenePresence(agentId).Name, m_scene.Name); } } + public void Drop(UUID requestID, UUID pAgentId) + { + // do nothing for now, hope client close will do it + } public Hashtable GetEvents(UUID requestID, UUID pAgentId) { @@ -395,55 +419,65 @@ namespace OpenSim.Region.ClientStack.Linden return NoEvents(requestID, pAgentId); } - OSD element; + OSD element = null;; + OSDArray array = new OSDArray(); + int thisID = 0; + bool negativeID = false; + lock (queue) { if (queue.Count == 0) return NoEvents(requestID, pAgentId); - element = queue.Dequeue(); // 15s timeout - } - - int thisID = 0; - lock (m_ids) - thisID = m_ids[pAgentId]; - OSDArray array = new OSDArray(); - if (element == null) // didn't have an event in 15s - { - // Send it a fake event to keep the client polling! It doesn't like 502s like the proxys say! - array.Add(EventQueueHelper.KeepAliveEvent()); - //m_log.DebugFormat("[EVENTQUEUE]: adding fake event for {0} in region {1}", pAgentId, m_scene.RegionInfo.RegionName); - } - else - { - if (DebugLevel > 0) - LogOutboundDebugMessage(element, pAgentId); + lock (m_ids) + thisID = m_ids[pAgentId]; - array.Add(element); + if (thisID < 0) + { + negativeID = true; + thisID = -thisID; + } - lock (queue) + while (queue.Count > 0) { - while (queue.Count > 0) - { - element = queue.Dequeue(); + element = queue.Dequeue(); + // add elements until a marker is found + // so they get into a response + if (element == null) + break; + if (DebugLevel > 0) + LogOutboundDebugMessage(element, pAgentId); + array.Add(element); + thisID++; + } + } - if (DebugLevel > 0) - LogOutboundDebugMessage(element, pAgentId); + OSDMap events = null; - array.Add(element); - thisID++; - } - } + if (array.Count > 0) + { + events = new OSDMap(); + events.Add("events", array); + events.Add("id", new OSDInteger(thisID)); } - OSDMap events = new OSDMap(); - events.Add("events", array); + if (negativeID && element == null) + { + Random rnd = new Random(Environment.TickCount); + thisID = rnd.Next(30000000); + if (thisID < 0) + thisID = -thisID; + } - events.Add("id", new OSDInteger(thisID)); lock (m_ids) { m_ids[pAgentId] = thisID + 1; } + + // if there where no elements before a marker send a NoEvents + if (array.Count == 0) + return NoEvents(requestID, pAgentId); + Hashtable responsedata = new Hashtable(); responsedata["int_response_code"] = 200; responsedata["content_type"] = "application/xml"; @@ -461,266 +495,18 @@ namespace OpenSim.Region.ClientStack.Linden responsedata["content_type"] = "text/plain"; responsedata["keepalive"] = false; responsedata["reusecontext"] = false; - responsedata["str_response_string"] = "Upstream error: "; - responsedata["error_status_text"] = "Upstream error:"; + responsedata["str_response_string"] = ""; + responsedata["error_status_text"] = ""; responsedata["http_protocol_version"] = "HTTP/1.0"; return responsedata; } - -// public Hashtable ProcessQueue(Hashtable request, UUID agentID, Caps caps) -// { -// // TODO: this has to be redone to not busy-wait (and block the thread), -// // TODO: as soon as we have a non-blocking way to handle HTTP-requests. -// -//// if (m_log.IsDebugEnabled) -//// { -//// String debug = "[EVENTQUEUE]: Got request for agent {0} in region {1} from thread {2}: [ "; -//// foreach (object key in request.Keys) -//// { -//// debug += key.ToString() + "=" + request[key].ToString() + " "; -//// } -//// m_log.DebugFormat(debug + " ]", agentID, m_scene.RegionInfo.RegionName, System.Threading.Thread.CurrentThread.Name); -//// } -// -// Queue queue = TryGetQueue(agentID); -// OSD element; -// -// lock (queue) -// element = queue.Dequeue(); // 15s timeout -// -// Hashtable responsedata = new Hashtable(); -// -// int thisID = 0; -// lock (m_ids) -// thisID = m_ids[agentID]; -// -// if (element == null) -// { -// //m_log.ErrorFormat("[EVENTQUEUE]: Nothing to process in " + m_scene.RegionInfo.RegionName); -// if (thisID == -1) // close-request -// { -// m_log.ErrorFormat("[EVENTQUEUE]: 404 in " + m_scene.RegionInfo.RegionName); -// responsedata["int_response_code"] = 404; //501; //410; //404; -// responsedata["content_type"] = "text/plain"; -// responsedata["keepalive"] = false; -// responsedata["str_response_string"] = "Closed EQG"; -// return responsedata; -// } -// responsedata["int_response_code"] = 502; -// responsedata["content_type"] = "text/plain"; -// responsedata["keepalive"] = false; -// responsedata["str_response_string"] = "Upstream error: "; -// responsedata["error_status_text"] = "Upstream error:"; -// responsedata["http_protocol_version"] = "HTTP/1.0"; -// return responsedata; -// } -// -// OSDArray array = new OSDArray(); -// if (element == null) // didn't have an event in 15s -// { -// // Send it a fake event to keep the client polling! It doesn't like 502s like the proxys say! -// array.Add(EventQueueHelper.KeepAliveEvent()); -// //m_log.DebugFormat("[EVENTQUEUE]: adding fake event for {0} in region {1}", agentID, m_scene.RegionInfo.RegionName); -// } -// else -// { -// array.Add(element); -// -// if (element is OSDMap) -// { -// OSDMap ev = (OSDMap)element; -// m_log.DebugFormat( -// "[EVENT QUEUE GET MODULE]: Eq OUT {0} to {1}", -// ev["message"], m_scene.GetScenePresence(agentID).Name); -// } -// -// lock (queue) -// { -// while (queue.Count > 0) -// { -// element = queue.Dequeue(); -// -// if (element is OSDMap) -// { -// OSDMap ev = (OSDMap)element; -// m_log.DebugFormat( -// "[EVENT QUEUE GET MODULE]: Eq OUT {0} to {1}", -// ev["message"], m_scene.GetScenePresence(agentID).Name); -// } -// -// array.Add(element); -// thisID++; -// } -// } -// } -// -// OSDMap events = new OSDMap(); -// events.Add("events", array); -// -// events.Add("id", new OSDInteger(thisID)); -// lock (m_ids) -// { -// m_ids[agentID] = thisID + 1; -// } -// -// responsedata["int_response_code"] = 200; -// responsedata["content_type"] = "application/xml"; -// responsedata["keepalive"] = false; -// responsedata["str_response_string"] = OSDParser.SerializeLLSDXmlString(events); -// -// m_log.DebugFormat("[EVENTQUEUE]: sending response for {0} in region {1}: {2}", agentID, m_scene.RegionInfo.RegionName, responsedata["str_response_string"]); -// -// return responsedata; -// } - -// public Hashtable EventQueuePath2(Hashtable request) -// { -// string capuuid = (string)request["uri"]; //path.Replace("/CAPS/EQG/",""); -// // pull off the last "/" in the path. -// Hashtable responsedata = new Hashtable(); -// capuuid = capuuid.Substring(0, capuuid.Length - 1); -// capuuid = capuuid.Replace("/CAPS/EQG/", ""); -// UUID AvatarID = UUID.Zero; -// UUID capUUID = UUID.Zero; -// -// // parse the path and search for the avatar with it registered -// if (UUID.TryParse(capuuid, out capUUID)) -// { -// lock (m_QueueUUIDAvatarMapping) -// { -// if (m_QueueUUIDAvatarMapping.ContainsKey(capUUID)) -// { -// AvatarID = m_QueueUUIDAvatarMapping[capUUID]; -// } -// } -// -// if (AvatarID != UUID.Zero) -// { -// return ProcessQueue(request, AvatarID, m_scene.CapsModule.GetCapsForUser(AvatarID)); -// } -// else -// { -// responsedata["int_response_code"] = 404; -// responsedata["content_type"] = "text/plain"; -// responsedata["keepalive"] = false; -// responsedata["str_response_string"] = "Not Found"; -// responsedata["error_status_text"] = "Not Found"; -// responsedata["http_protocol_version"] = "HTTP/1.0"; -// return responsedata; -// // return 404 -// } -// } -// else -// { -// responsedata["int_response_code"] = 404; -// responsedata["content_type"] = "text/plain"; -// responsedata["keepalive"] = false; -// responsedata["str_response_string"] = "Not Found"; -// responsedata["error_status_text"] = "Not Found"; -// responsedata["http_protocol_version"] = "HTTP/1.0"; -// return responsedata; -// // return 404 -// } -// } - - public OSD EventQueueFallBack(string path, OSD request, string endpoint) - { - // This is a fallback element to keep the client from loosing EventQueueGet - // Why does CAPS fail sometimes!? - m_log.Warn("[EVENTQUEUE]: In the Fallback handler! We lost the Queue in the rest handler!"); - string capuuid = path.Replace("/CAPS/EQG/",""); - capuuid = capuuid.Substring(0, capuuid.Length - 1); - -// UUID AvatarID = UUID.Zero; - UUID capUUID = UUID.Zero; - if (UUID.TryParse(capuuid, out capUUID)) - { -/* Don't remove this yet code cleaners! - * Still testing this! - * - lock (m_QueueUUIDAvatarMapping) - { - if (m_QueueUUIDAvatarMapping.ContainsKey(capUUID)) - { - AvatarID = m_QueueUUIDAvatarMapping[capUUID]; - } - } - - - if (AvatarID != UUID.Zero) - { - // Repair the CAP! - //OpenSim.Framework.Capabilities.Caps caps = m_scene.GetCapsHandlerForUser(AvatarID); - //string capsBase = "/CAPS/EQG/"; - //caps.RegisterHandler("EventQueueGet", - //new RestHTTPHandler("POST", capsBase + capUUID.ToString() + "/", - //delegate(Hashtable m_dhttpMethod) - //{ - // return ProcessQueue(m_dhttpMethod, AvatarID, caps); - //})); - // start new ID sequence. - Random rnd = new Random(System.Environment.TickCount); - lock (m_ids) - { - if (!m_ids.ContainsKey(AvatarID)) - m_ids.Add(AvatarID, rnd.Next(30000000)); - } - - - int thisID = 0; - lock (m_ids) - thisID = m_ids[AvatarID]; - - BlockingLLSDQueue queue = GetQueue(AvatarID); - OSDArray array = new OSDArray(); - LLSD element = queue.Dequeue(15000); // 15s timeout - if (element == null) - { - - array.Add(EventQueueHelper.KeepAliveEvent()); - } - else - { - array.Add(element); - while (queue.Count() > 0) - { - array.Add(queue.Dequeue(1)); - thisID++; - } - } - OSDMap events = new OSDMap(); - events.Add("events", array); - - events.Add("id", new LLSDInteger(thisID)); - - lock (m_ids) - { - m_ids[AvatarID] = thisID + 1; - } - - return events; - } - else - { - return new LLSD(); - } -* -*/ - } - else - { - //return new LLSD(); - } - - return new OSDString("shutdown404!"); - } - +/* this is not a event message public void DisableSimulator(ulong handle, UUID avatarID) { OSD item = EventQueueHelper.DisableSimulator(handle); Enqueue(item, avatarID); } - +*/ public virtual void EnableSimulator(ulong handle, IPEndPoint endPoint, UUID avatarID, int regionSizeX, int regionSizeY) { if (DebugLevel > 0) @@ -732,7 +518,7 @@ namespace OpenSim.Region.ClientStack.Linden } public virtual void EstablishAgentCommunication(UUID avatarID, IPEndPoint endPoint, string capsPath, - ulong regionHandle, int regionSizeX, int regionSizeY) + ulong regionHandle, int regionSizeX, int regionSizeY) { if (DebugLevel > 0) m_log.DebugFormat("{0} EstablishAgentCommunication. handle={1}, endPoint={2}, avatarID={3}", @@ -742,9 +528,9 @@ namespace OpenSim.Region.ClientStack.Linden Enqueue(item, avatarID); } - public virtual void TeleportFinishEvent(ulong regionHandle, byte simAccess, + public virtual void TeleportFinishEvent(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, - uint locationID, uint flags, string capsURL, + uint locationID, uint flags, string capsURL, UUID avatarID, int regionSizeX, int regionSizeY) { if (DebugLevel > 0) @@ -774,33 +560,40 @@ namespace OpenSim.Region.ClientStack.Linden uint timeStamp, bool offline, int parentEstateID, Vector3 position, uint ttl, UUID transactionID, bool fromGroup, byte[] binaryBucket) { - OSD item = EventQueueHelper.ChatterboxInvitation(sessionID, sessionName, fromAgent, message, toAgent, fromName, dialog, - timeStamp, offline, parentEstateID, position, ttl, transactionID, + OSD item = EventQueueHelper.ChatterboxInvitation(sessionID, sessionName, fromAgent, message, toAgent, fromName, dialog, + timeStamp, offline, parentEstateID, position, ttl, transactionID, fromGroup, binaryBucket); Enqueue(item, toAgent); //m_log.InfoFormat("########### eq ChatterboxInvitation #############\n{0}", item); } - public void ChatterBoxSessionAgentListUpdates(UUID sessionID, UUID fromAgent, UUID anotherAgent, bool canVoiceChat, - bool isModerator, bool textMute) + public void ChatterBoxSessionAgentListUpdates(UUID sessionID, UUID fromAgent, UUID toAgent, bool canVoiceChat, + bool isModerator, bool textMute, bool isEnterorLeave) { OSD item = EventQueueHelper.ChatterBoxSessionAgentListUpdates(sessionID, fromAgent, canVoiceChat, - isModerator, textMute); - Enqueue(item, fromAgent); + isModerator, textMute, isEnterorLeave); + Enqueue(item, toAgent); //m_log.InfoFormat("########### eq ChatterBoxSessionAgentListUpdates #############\n{0}", item); } + public void ChatterBoxForceClose(UUID toAgent, UUID sessionID, string reason) + { + OSD item = EventQueueHelper.ChatterBoxForceClose(sessionID, reason); + + Enqueue(item, toAgent); + } + public void ParcelProperties(ParcelPropertiesMessage parcelPropertiesMessage, UUID avatarID) { OSD item = EventQueueHelper.ParcelProperties(parcelPropertiesMessage); Enqueue(item, avatarID); } - public void GroupMembership(AgentGroupDataUpdatePacket groupUpdate, UUID avatarID) + public void GroupMembershipData(UUID receiverAgent, GroupMembershipData[] data) { - OSD item = EventQueueHelper.GroupMembership(groupUpdate); - Enqueue(item, avatarID); + OSD item = EventQueueHelper.GroupMembershipData(receiverAgent, data); + Enqueue(item, receiverAgent); } public void QueryReply(PlacesReplyPacket groupUpdate, UUID avatarID) @@ -827,4 +620,4 @@ namespace OpenSim.Region.ClientStack.Linden Enqueue(item, avatarID); } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueHelper.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueHelper.cs index 384af74..461f776 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueHelper.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueHelper.cs @@ -32,6 +32,8 @@ using OpenMetaverse.Packets; using OpenMetaverse.StructuredData; using OpenMetaverse.Messages.Linden; +using OpenSim.Framework; + namespace OpenSim.Region.ClientStack.Linden { public class EventQueueHelper @@ -76,9 +78,9 @@ namespace OpenSim.Region.ClientStack.Linden llsdSimInfo.Add("Handle", new OSDBinary(ulongToByteArray(handle))); llsdSimInfo.Add("IP", new OSDBinary(endPoint.Address.GetAddressBytes())); - llsdSimInfo.Add("Port", new OSDInteger(endPoint.Port)); - llsdSimInfo.Add("RegionSizeX", OSD.FromUInteger((uint) regionSizeX)); - llsdSimInfo.Add("RegionSizeY", OSD.FromUInteger((uint) regionSizeY)); + llsdSimInfo.Add("Port", OSD.FromInteger(endPoint.Port)); + llsdSimInfo.Add("RegionSizeX", OSD.FromUInteger((uint)regionSizeX)); + llsdSimInfo.Add("RegionSizeY", OSD.FromUInteger((uint)regionSizeY)); OSDArray arr = new OSDArray(1); arr.Add(llsdSimInfo); @@ -88,7 +90,7 @@ namespace OpenSim.Region.ClientStack.Linden return BuildEvent("EnableSimulator", llsdBody); } - +/* public static OSD DisableSimulator(ulong handle) { //OSDMap llsdSimInfo = new OSDMap(1); @@ -103,7 +105,7 @@ namespace OpenSim.Region.ClientStack.Linden return BuildEvent("DisableSimulator", llsdBody); } - +*/ public static OSD CrossRegion(ulong handle, Vector3 pos, Vector3 lookAt, IPEndPoint newRegionExternalEndPoint, string capsURL, UUID agentID, UUID sessionID, @@ -157,6 +159,12 @@ namespace OpenSim.Region.ClientStack.Linden uint locationID, uint flags, string capsURL, UUID agentID, int regionSizeX, int regionSizeY) { + // not sure why flags get overwritten here + if ((flags & (uint)TeleportFlags.IsFlying) != 0) + flags = (uint)TeleportFlags.ViaLocation | (uint)TeleportFlags.IsFlying; + else + flags = (uint)TeleportFlags.ViaLocation; + OSDMap info = new OSDMap(); info.Add("AgentID", OSD.FromUUID(agentID)); info.Add("LocationID", OSD.FromInteger(4)); // TODO what is this? @@ -165,7 +173,8 @@ namespace OpenSim.Region.ClientStack.Linden info.Add("SimAccess", OSD.FromInteger(simAccess)); info.Add("SimIP", OSD.FromBinary(regionExternalEndPoint.Address.GetAddressBytes())); info.Add("SimPort", OSD.FromInteger(regionExternalEndPoint.Port)); - info.Add("TeleportFlags", OSD.FromULong(1L << 4)); // AgentManager.TeleportFlags.ViaLocation +// info.Add("TeleportFlags", OSD.FromULong(1L << 4)); // AgentManager.TeleportFlags.ViaLocation + info.Add("TeleportFlags", OSD.FromUInteger(flags)); info.Add("RegionSizeX", OSD.FromUInteger((uint)regionSizeX)); info.Add("RegionSizeY", OSD.FromUInteger((uint)regionSizeY)); @@ -185,13 +194,13 @@ namespace OpenSim.Region.ClientStack.Linden script.Add("ItemID", OSD.FromUUID(itemID)); script.Add("Running", OSD.FromBoolean(running)); script.Add("Mono", OSD.FromBoolean(mono)); - + OSDArray scriptArr = new OSDArray(); scriptArr.Add(script); - + OSDMap body = new OSDMap(); body.Add("Script", scriptArr); - + return BuildEvent("ScriptRunningReply", body); } @@ -204,8 +213,8 @@ namespace OpenSim.Region.ClientStack.Linden {"sim-ip-and-port", new OSDString(simIpAndPort)}, {"seed-capability", new OSDString(seedcap)}, {"region-handle", OSD.FromULong(regionHandle)}, - {"region-size-x", OSD.FromInteger(regionSizeX)}, - {"region-size-y", OSD.FromInteger(regionSizeY)} + {"region-size-x", OSD.FromUInteger((uint)regionSizeX)}, + {"region-size-y", OSD.FromUInteger((uint)regionSizeY)} }; return BuildEvent("EstablishAgentCommunication", body); @@ -234,7 +243,7 @@ namespace OpenSim.Region.ClientStack.Linden { OSDMap messageParams = new OSDMap(15); messageParams.Add("type", new OSDInteger((int)dialog)); - + OSDArray positionArray = new OSDArray(3); positionArray.Add(OSD.FromReal(position.X)); positionArray.Add(OSD.FromReal(position.Y)); @@ -299,20 +308,29 @@ namespace OpenSim.Region.ClientStack.Linden } public static OSD ChatterBoxSessionAgentListUpdates(UUID sessionID, - UUID agentID, bool canVoiceChat, bool isModerator, bool textMute) + UUID agentID, bool canVoiceChat, bool isModerator, bool textMute, bool isEnterorLeave) { OSDMap body = new OSDMap(); OSDMap agentUpdates = new OSDMap(); OSDMap infoDetail = new OSDMap(); OSDMap mutes = new OSDMap(); + // this should be a list of agents and parameters + // foreach agent mutes.Add("text", OSD.FromBoolean(textMute)); infoDetail.Add("can_voice_chat", OSD.FromBoolean(canVoiceChat)); infoDetail.Add("is_moderator", OSD.FromBoolean(isModerator)); infoDetail.Add("mutes", mutes); OSDMap info = new OSDMap(); info.Add("info", infoDetail); + if(isEnterorLeave) + info.Add("transition",OSD.FromString("ENTER")); + else + info.Add("transition",OSD.FromString("LEAVE")); agentUpdates.Add(agentID.ToString(), info); + + // foreach end + body.Add("agent_updates", agentUpdates); body.Add("session_id", OSD.FromUUID(sessionID)); body.Add("updates", new OSD()); @@ -324,40 +342,54 @@ namespace OpenSim.Region.ClientStack.Linden return chatterBoxSessionAgentListUpdates; } - public static OSD GroupMembership(AgentGroupDataUpdatePacket groupUpdatePacket) + public static OSD ChatterBoxForceClose(UUID sessionID, string reason) { - OSDMap groupUpdate = new OSDMap(); - groupUpdate.Add("message", OSD.FromString("AgentGroupDataUpdate")); + OSDMap body = new OSDMap(2); + body.Add("session_id", new OSDUUID(sessionID)); + body.Add("reason", new OSDString(reason)); - OSDMap body = new OSDMap(); - OSDArray agentData = new OSDArray(); - OSDMap agentDataMap = new OSDMap(); - agentDataMap.Add("AgentID", OSD.FromUUID(groupUpdatePacket.AgentData.AgentID)); - agentData.Add(agentDataMap); - body.Add("AgentData", agentData); + OSDMap chatterBoxForceClose = new OSDMap(2); + chatterBoxForceClose.Add("message", new OSDString("ForceCloseChatterBoxSession")); + chatterBoxForceClose.Add("body", body); + return chatterBoxForceClose; + } - OSDArray groupData = new OSDArray(); + public static OSD GroupMembershipData(UUID receiverAgent, GroupMembershipData[] data) + { + OSDArray AgentData = new OSDArray(1); + OSDMap AgentDataMap = new OSDMap(1); + AgentDataMap.Add("AgentID", OSD.FromUUID(receiverAgent)); + AgentData.Add(AgentDataMap); - foreach (AgentGroupDataUpdatePacket.GroupDataBlock groupDataBlock in groupUpdatePacket.GroupData) + OSDArray GroupData = new OSDArray(data.Length); + OSDArray NewGroupData = new OSDArray(data.Length); + + foreach (GroupMembershipData membership in data) { - OSDMap groupDataMap = new OSDMap(); - groupDataMap.Add("ListInProfile", OSD.FromBoolean(false)); - groupDataMap.Add("GroupID", OSD.FromUUID(groupDataBlock.GroupID)); - groupDataMap.Add("GroupInsigniaID", OSD.FromUUID(groupDataBlock.GroupInsigniaID)); - groupDataMap.Add("Contribution", OSD.FromInteger(groupDataBlock.Contribution)); - groupDataMap.Add("GroupPowers", OSD.FromBinary(ulongToByteArray(groupDataBlock.GroupPowers))); - groupDataMap.Add("GroupName", OSD.FromString(Utils.BytesToString(groupDataBlock.GroupName))); - groupDataMap.Add("AcceptNotices", OSD.FromBoolean(groupDataBlock.AcceptNotices)); + OSDMap GroupDataMap = new OSDMap(6); + OSDMap NewGroupDataMap = new OSDMap(1); + + GroupDataMap.Add("GroupID", OSD.FromUUID(membership.GroupID)); + GroupDataMap.Add("GroupPowers", OSD.FromULong(membership.GroupPowers)); + GroupDataMap.Add("AcceptNotices", OSD.FromBoolean(membership.AcceptNotices)); + GroupDataMap.Add("GroupInsigniaID", OSD.FromUUID(membership.GroupPicture)); + GroupDataMap.Add("Contribution", OSD.FromInteger(membership.Contribution)); + GroupDataMap.Add("GroupName", OSD.FromString(membership.GroupName)); + NewGroupDataMap.Add("ListInProfile", OSD.FromBoolean(membership.ListInProfile)); + + GroupData.Add(GroupDataMap); + NewGroupData.Add(NewGroupDataMap); + } - groupData.Add(groupDataMap); + OSDMap llDataStruct = new OSDMap(3); + llDataStruct.Add("AgentData", AgentData); + llDataStruct.Add("GroupData", GroupData); + llDataStruct.Add("NewGroupData", NewGroupData); - } - body.Add("GroupData", groupData); - groupUpdate.Add("body", body); + return BuildEvent("AgentGroupDataUpdate", llDataStruct); - return groupUpdate; } - + public static OSD PlacesQuery(PlacesReplyPacket PlacesReply) { OSDMap placesReply = new OSDMap(); @@ -391,7 +423,7 @@ namespace OpenSim.Region.ClientStack.Linden QueryDataMap.Add("SnapShotID", OSD.FromUUID(groupDataBlock.SnapshotID)); QueryDataMap.Add("ProductSku", OSD.FromInteger(0)); QueryDataMap.Add("Price", OSD.FromInteger(groupDataBlock.Price)); - + QueryData.Add(QueryDataMap); } body.Add("QueryData", QueryData); diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs index 16a902d..ee3f4f1 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs @@ -71,7 +71,6 @@ namespace OpenSim.Region.ClientStack.Linden.Tests IConfigSource config = new IniConfigSource(); config.AddConfig("Startup"); - config.Configs["Startup"].Set("EventQueue", "true"); CapabilitiesModule capsModule = new CapabilitiesModule(); m_eqgMod = new EventQueueGetModule(); @@ -126,6 +125,15 @@ namespace OpenSim.Region.ClientStack.Linden.Tests Hashtable eventsResponse = m_eqgMod.GetEvents(UUID.Zero, sp.UUID); + // initial queue as null events + eventsResponse = m_eqgMod.GetEvents(UUID.Zero, sp.UUID); + if((int)eventsResponse["int_response_code"] != (int)HttpStatusCode.OK) + { + eventsResponse = m_eqgMod.GetEvents(UUID.Zero, sp.UUID); + if((int)eventsResponse["int_response_code"] != (int)HttpStatusCode.OK) + eventsResponse = m_eqgMod.GetEvents(UUID.Zero, sp.UUID); + } + Assert.That((int)eventsResponse["int_response_code"], Is.EqualTo((int)HttpStatusCode.OK)); // Console.WriteLine("Response [{0}]", (string)eventsResponse["str_response_string"]); @@ -172,7 +180,7 @@ namespace OpenSim.Region.ClientStack.Linden.Tests TestHelpers.InMethod(); // TestHelpers.EnableLogging(); - UUID npcId + UUID npcId = m_npcMod.CreateNPC( "John", "Smith", new Vector3(128, 128, 30), UUID.Zero, true, m_scene, new AvatarAppearance()); @@ -187,4 +195,4 @@ namespace OpenSim.Region.ClientStack.Linden.Tests Assert.That((int)eventsResponse["int_response_code"], Is.EqualTo((int)HttpStatusCode.BadGateway)); } } -} \ No newline at end of file +} -- cgit v1.1