change eventqueue queues type, move event methods to other file (using partial class)
							parent
							
								
									6c49f16132
								
							
						
					
					
						commit
						58a4f45712
					
				|  | @ -252,7 +252,7 @@ namespace OpenSim.Groups | |||
| 
 | ||||
|             m_debugEnabled = verbose; | ||||
| 
 | ||||
|             MainConsole.Instance.Output("{0} verbose logging set to {1}", null, Name, m_debugEnabled); | ||||
|             MainConsole.Instance.Output("{0} verbose logging set to {1}", Name, m_debugEnabled); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|  | @ -599,13 +599,16 @@ namespace OpenSim.Groups | |||
|                 { | ||||
|                     if (m_debugEnabled) m_log.DebugFormat("[Groups.Messaging]: Sending chatterbox invite instant message"); | ||||
| 
 | ||||
|                     UUID fromAgent = new UUID(msg.fromAgentID); | ||||
|                     // Force? open the group session dialog??? | ||||
|                     // and simultanously deliver the message, so we don't need to do a seperate client.SendInstantMessage(msg); | ||||
|                     IEventQueue eq = activeClient.Scene.RequestModuleInterface<IEventQueue>(); | ||||
|                     eq.ChatterboxInvitation( | ||||
|                     if (eq != null) | ||||
|                     { | ||||
|                         eq.ChatterboxInvitation( | ||||
|                         GroupID | ||||
|                         , groupInfo.GroupName | ||||
|                         , new UUID(msg.fromAgentID) | ||||
|                         , fromAgent | ||||
|                         , msg.message | ||||
|                         , AgentID | ||||
|                         , msg.fromAgentName | ||||
|  | @ -620,15 +623,10 @@ namespace OpenSim.Groups | |||
|                         , OpenMetaverse.Utils.StringToBytes(groupInfo.GroupName) | ||||
|                         ); | ||||
| 
 | ||||
|                     eq.ChatterBoxSessionAgentListUpdates( | ||||
|                         new UUID(GroupID) | ||||
|                         , AgentID | ||||
|                         , new UUID(msg.toAgentID) | ||||
|                         , false //canVoiceChat | ||||
|                         , false //isModerator | ||||
|                         , false //text mute | ||||
|                         , true // Enter | ||||
|                         ); | ||||
|                         var update = new GroupChatListAgentUpdateData(AgentID); | ||||
|                         var updates = new List<GroupChatListAgentUpdateData> { update }; | ||||
|                         eq.ChatterBoxSessionAgentListUpdates(GroupID, new UUID(msg.toAgentID), updates); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | @ -663,15 +661,12 @@ namespace OpenSim.Groups | |||
|                     ChatterBoxSessionStartReplyViaCaps(remoteClient, groupInfo.GroupName, GroupID); | ||||
| 
 | ||||
|                     IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>(); | ||||
|                     queue.ChatterBoxSessionAgentListUpdates( | ||||
|                         GroupID | ||||
|                         , AgentID | ||||
|                         , new UUID(im.toAgentID) | ||||
|                         , false //canVoiceChat | ||||
|                         , false //isModerator | ||||
|                         , false //text mute | ||||
|                         , true | ||||
|                         ); | ||||
|                     if (queue != null) | ||||
|                     { | ||||
|                         var update = new GroupChatListAgentUpdateData(AgentID); | ||||
|                         var updates = new List<GroupChatListAgentUpdateData> { update }; | ||||
|                         queue.ChatterBoxSessionAgentListUpdates(GroupID, remoteClient.AgentId, updates); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|  | @ -713,11 +708,7 @@ namespace OpenSim.Groups | |||
|             bodyMap.Add("session_info", sessionMap); | ||||
| 
 | ||||
|             IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>(); | ||||
| 
 | ||||
|             if (queue != null) | ||||
|             { | ||||
|                 queue.Enqueue(queue.BuildEvent("ChatterBoxSessionStartReply", bodyMap), remoteClient.AgentId); | ||||
|             } | ||||
|             queue?.Enqueue(queue.BuildEvent("ChatterBoxSessionStartReply", bodyMap), remoteClient.AgentId); | ||||
|         } | ||||
| 
 | ||||
|         private void DebugGridInstantMessage(GridInstantMessage im) | ||||
|  |  | |||
|  | @ -0,0 +1,455 @@ | |||
| /* | ||||
|  * Copyright (c) Contributors, http://opensimulator.org/ | ||||
|  * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions are met: | ||||
|  *     * Redistributions of source code must retain the above copyright | ||||
|  *       notice, this list of conditions and the following disclaimer. | ||||
|  *     * Redistributions in binary form must reproduce the above copyright | ||||
|  *       notice, this list of conditions and the following disclaimer in the | ||||
|  *       documentation and/or other materials provided with the distribution. | ||||
|  *     * Neither the name of the OpenSimulator Project nor the | ||||
|  *       names of its contributors may be used to endorse or promote products | ||||
|  *       derived from this software without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
|  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
|  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
|  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
|  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
|  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
|  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
|  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
|  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections; | ||||
| using System.Collections.Generic; | ||||
| using System.Net; | ||||
| using System.Reflection; | ||||
| using System.Text; | ||||
| using log4net; | ||||
| using Nini.Config; | ||||
| using Mono.Addins; | ||||
| using OpenMetaverse; | ||||
| using OpenMetaverse.StructuredData; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Framework.Servers.HttpServer; | ||||
| using OpenSim.Region.Framework.Interfaces; | ||||
| using OpenSim.Region.Framework.Scenes; | ||||
| using Caps=OpenSim.Framework.Capabilities.Caps; | ||||
| 
 | ||||
| namespace OpenSim.Region.ClientStack.Linden | ||||
| { | ||||
|     public partial class EventQueueGetModule : IEventQueue, INonSharedRegionModule | ||||
|     { | ||||
|         /* this is not a event message | ||||
|                 public void DisableSimulator(ulong handle, UUID avatarID) | ||||
|                 { | ||||
|                     OSD item = EventQueueHelper.DisableSimulator(handle); | ||||
|                     Enqueue(item, avatarID); | ||||
|                 } | ||||
|         */ | ||||
| 
 | ||||
|         public StringBuilder StartEvent(string eventName) | ||||
|         { | ||||
|             StringBuilder sb = new StringBuilder(256); | ||||
|             LLSDxmlEncode.AddMap(sb); | ||||
|             LLSDxmlEncode.AddElem("message", eventName, sb); | ||||
|             LLSDxmlEncode.AddMap("body", sb); | ||||
| 
 | ||||
|             return sb; | ||||
|         } | ||||
| 
 | ||||
|         public StringBuilder StartEvent(string eventName, int cap) | ||||
|         { | ||||
|             StringBuilder sb = new StringBuilder(cap); | ||||
|             LLSDxmlEncode.AddMap(sb); | ||||
|             LLSDxmlEncode.AddElem("message", eventName, sb); | ||||
|             LLSDxmlEncode.AddMap("body", sb); | ||||
| 
 | ||||
|             return sb; | ||||
|         } | ||||
| 
 | ||||
|         public string EndEvent(StringBuilder sb) | ||||
|         { | ||||
|             LLSDxmlEncode.AddEndMap(sb); // close body | ||||
|             LLSDxmlEncode.AddEndMap(sb); // close event | ||||
|             return sb.ToString(); | ||||
|         } | ||||
| 
 | ||||
|         public byte[] EndEventToBytes(StringBuilder sb) | ||||
|         { | ||||
|             LLSDxmlEncode.AddEndMap(sb); // close body | ||||
|             LLSDxmlEncode.AddEndMap(sb); // close event | ||||
|             return Util.UTF8NBGetbytes(sb.ToString()); | ||||
|         } | ||||
| 
 | ||||
|         public virtual void EnableSimulator(ulong handle, IPEndPoint endPoint, UUID avatarID, int regionSizeX, int regionSizeY) | ||||
|         { | ||||
|             if (DebugLevel > 0) | ||||
|                 m_log.DebugFormat("{0} EnableSimulator. handle={1}, endPoint={2}, avatarID={3}", | ||||
|                     LogHeader, handle, endPoint, avatarID, regionSizeX, regionSizeY); | ||||
| 
 | ||||
|             StringBuilder sb = StartEvent("EnableSimulator"); | ||||
|             LLSDxmlEncode.AddArrayAndMap("SimulatorInfo", sb); | ||||
|                 LLSDxmlEncode.AddElem("Handle", handle, sb); | ||||
|                 LLSDxmlEncode.AddElem("IP", endPoint.Address.GetAddressBytes(), sb); | ||||
|                 LLSDxmlEncode.AddElem("Port", endPoint.Port, sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionSizeX", (uint)regionSizeX, sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionSizeY", (uint)regionSizeY, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             Enqueue(EndEventToBytes(sb), avatarID); | ||||
|         } | ||||
| 
 | ||||
|         public virtual void EstablishAgentCommunication(UUID avatarID, IPEndPoint endPoint, string capsPath, | ||||
|                                 ulong regionHandle, int regionSizeX, int regionSizeY) | ||||
|         { | ||||
|             if (DebugLevel > 0) | ||||
|                 m_log.DebugFormat("{0} EstablishAgentCommunication. handle={1}, endPoint={2}, avatarID={3}", | ||||
|                     LogHeader, regionHandle, endPoint, avatarID, regionSizeX, regionSizeY); | ||||
| 
 | ||||
|             StringBuilder sb = StartEvent("EstablishAgentCommunication"); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddElem("agent-id", avatarID, sb); | ||||
|             LLSDxmlEncode.AddElem("sim-ip-and-port", endPoint.ToString(), sb); | ||||
|             LLSDxmlEncode.AddElem("seed-capability", capsPath, sb); | ||||
|             // current viewers ignore this, also not needed its sent on enablesim | ||||
|             //LLSDxmlEncode.AddElem("region-handle", regionHandle, sb); | ||||
|             //LLSDxmlEncode.AddElem("region-size-x", (uint)regionSizeX, sb); | ||||
|             //LLSDxmlEncode.AddElem("region-size-y", (uint)regionSizeY, sb); | ||||
| 
 | ||||
|             Enqueue(EndEventToBytes(sb), avatarID); | ||||
|         } | ||||
| 
 | ||||
|         public virtual void TeleportFinishEvent(ulong regionHandle, byte simAccess, | ||||
|                                         IPEndPoint regionExternalEndPoint, | ||||
|                                         uint locationID, uint flags, string capsURL, | ||||
|                                         UUID avatarID, int regionSizeX, int regionSizeY) | ||||
|         { | ||||
|             if (DebugLevel > 0) | ||||
|                 m_log.DebugFormat("{0} TeleportFinishEvent. handle={1}, endPoint={2}, avatarID={3}", | ||||
|                     LogHeader, regionHandle, regionExternalEndPoint, avatarID, regionSizeX, 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; | ||||
| 
 | ||||
|             StringBuilder sb = StartEvent("TeleportFinish"); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddArrayAndMap("Info", sb); | ||||
|                 LLSDxmlEncode.AddElem("AgentID", avatarID, sb); | ||||
|                 LLSDxmlEncode.AddElem("LocationID", (uint)4, sb); // TODO what is this? | ||||
|                 LLSDxmlEncode.AddElem("SimIP", regionExternalEndPoint.Address.GetAddressBytes(), sb); | ||||
|                 LLSDxmlEncode.AddElem("SimPort", regionExternalEndPoint.Port, sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionHandle", regionHandle, sb); | ||||
|                 LLSDxmlEncode.AddElem("SeedCapability", capsURL, sb); | ||||
|                 LLSDxmlEncode.AddElem("SimAccess",(int)simAccess, sb); | ||||
|                 LLSDxmlEncode.AddElem("TeleportFlags", flags, sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionSizeX", (uint)regionSizeX, sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionSizeY", (uint)regionSizeY, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             Enqueue(EndEventToBytes(sb), avatarID); | ||||
|         } | ||||
| 
 | ||||
|         public virtual void CrossRegion(ulong handle, Vector3 pos, Vector3 lookAt, | ||||
|                                 IPEndPoint newRegionExternalEndPoint, | ||||
|                                 string capsURL, UUID avatarID, UUID sessionID, int regionSizeX, int regionSizeY) | ||||
|         { | ||||
|             if (DebugLevel > 0) | ||||
|                 m_log.DebugFormat("{0} CrossRegion. handle={1}, avatarID={2}, regionSize={3},{4}>", | ||||
|                     LogHeader, handle, avatarID, regionSizeX, regionSizeY); | ||||
| 
 | ||||
|             StringBuilder sb = StartEvent("CrossedRegion"); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddArrayAndMap("AgentData", sb); | ||||
|                 LLSDxmlEncode.AddElem("AgentID", avatarID, sb); | ||||
|                 LLSDxmlEncode.AddElem("SessionID", sessionID, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddArrayAndMap("Info", sb); | ||||
|                 LLSDxmlEncode.AddElem("LookAt", lookAt, sb); | ||||
|                 LLSDxmlEncode.AddElem("Position", pos, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddArrayAndMap("RegionData", sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionHandle", handle, sb); | ||||
|                 LLSDxmlEncode.AddElem("SeedCapability", capsURL, sb); | ||||
|                 LLSDxmlEncode.AddElem("SimIP", newRegionExternalEndPoint.Address.GetAddressBytes(), sb); | ||||
|                 LLSDxmlEncode.AddElem("SimPort", newRegionExternalEndPoint.Port, sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionSizeX", (uint)regionSizeX, sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionSizeY", (uint)regionSizeY, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             Enqueue(EndEventToBytes(sb), avatarID); | ||||
|         } | ||||
| 
 | ||||
|         private static string InstantMessageBody(UUID fromAgent, string message, UUID toAgent, | ||||
|             string fromName, byte dialog, uint timeStamp, bool offline, int parentEstateID, | ||||
|             Vector3 position, uint ttl, UUID transactionID, bool fromGroup, byte[] binaryBucket, | ||||
|             bool checkEstate, int godLevel, bool limitedToEstate) | ||||
|         { | ||||
|             StringBuilder sb = new StringBuilder(512); | ||||
|             LLSDxmlEncode.AddMap("instantmessage", sb); | ||||
|             LLSDxmlEncode.AddMap("message_params", sb); //messageParams | ||||
|             LLSDxmlEncode.AddElem("type", dialog, sb); | ||||
|             LLSDxmlEncode.AddElem("position", position, sb); | ||||
|             LLSDxmlEncode.AddElem("region_id", UUID.Zero, sb); | ||||
|             LLSDxmlEncode.AddElem("to_id", toAgent, sb); | ||||
|             LLSDxmlEncode.AddElem("source", 0, sb); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddMap("data", sb); //messageParams data | ||||
|             LLSDxmlEncode.AddElem("binary_bucket", binaryBucket, sb); | ||||
|             LLSDxmlEncode.AddEndMap(sb); //messageParams data | ||||
| 
 | ||||
|             LLSDxmlEncode.AddElem("message", message, sb); | ||||
|             LLSDxmlEncode.AddElem("id", transactionID, sb); | ||||
|             LLSDxmlEncode.AddElem("from_name", fromName, sb); | ||||
|             LLSDxmlEncode.AddElem("timestamp", timeStamp, sb); | ||||
|             LLSDxmlEncode.AddElem("offline", (offline ? 1 : 0), sb); | ||||
|             LLSDxmlEncode.AddElem("parent_estate_id", parentEstateID, sb); | ||||
|             LLSDxmlEncode.AddElem("ttl", (int)ttl, sb); | ||||
|             LLSDxmlEncode.AddElem("from_id", fromAgent, sb); | ||||
|             LLSDxmlEncode.AddElem("from_group", fromGroup, sb); | ||||
|             LLSDxmlEncode.AddEndMap(sb); //messageParams | ||||
| 
 | ||||
|             LLSDxmlEncode.AddMap("agent_params", sb); | ||||
|             LLSDxmlEncode.AddElem("agent_id", fromAgent, sb); | ||||
|             LLSDxmlEncode.AddElem("check_estate", checkEstate, sb); | ||||
|             LLSDxmlEncode.AddElem("god_level", godLevel, sb); | ||||
|             LLSDxmlEncode.AddElem("limited_to_estate", limitedToEstate, sb); | ||||
|             LLSDxmlEncode.AddEndMap(sb); // agent params | ||||
|             LLSDxmlEncode.AddEndMap(sb); | ||||
| 
 | ||||
|             return sb.ToString(); | ||||
|         } | ||||
| 
 | ||||
|         public void ChatterboxInvitation(UUID sessionID, string sessionName, | ||||
|                                          UUID fromAgent, string message, UUID toAgent, string fromName, byte dialog, | ||||
|                                          uint timeStamp, bool offline, int parentEstateID, Vector3 position, | ||||
|                                          uint ttl, UUID transactionID, bool fromGroup, byte[] binaryBucket) | ||||
|         { | ||||
|             StringBuilder sb = StartEvent("ChatterBoxInvitation"); | ||||
|             LLSDxmlEncode.AddElem("session_id", sessionID, sb); | ||||
|             LLSDxmlEncode.AddElem("from_name", fromName, sb); | ||||
|             LLSDxmlEncode.AddElem("session_name", sessionName, sb); | ||||
|             LLSDxmlEncode.AddElem("from_id", fromAgent, sb); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddLLSD(InstantMessageBody(fromAgent, message, toAgent, | ||||
|                 fromName, dialog, timeStamp, offline, parentEstateID, position, | ||||
|                 ttl, transactionID, fromGroup, binaryBucket, true, 0, true), sb); | ||||
| 
 | ||||
|             Enqueue(EndEventToBytes(sb), toAgent); | ||||
|         } | ||||
| 
 | ||||
|         public void ChatterBoxSessionAgentListUpdates(UUID sessionID, UUID toAgent, List<GroupChatListAgentUpdateData> updates) | ||||
|         { | ||||
|             StringBuilder sb = StartEvent("ChatterBoxSessionAgentListUpdates",1024); | ||||
|             LLSDxmlEncode.AddMap("agent_updates",sb); | ||||
|             foreach (GroupChatListAgentUpdateData up in updates) | ||||
|             { | ||||
|                 LLSDxmlEncode.AddMap(up.agentID.ToString(), sb); | ||||
|                     LLSDxmlEncode.AddMap("info", sb); | ||||
|                         LLSDxmlEncode.AddElem("can_voice_chat", up.canVoice, sb); | ||||
|                         LLSDxmlEncode.AddElem("is_moderator", up.isModerator, sb); | ||||
|                         LLSDxmlEncode.AddMap("mutes",sb); | ||||
|                             LLSDxmlEncode.AddElem("text", up.mutedText, sb); | ||||
|                         LLSDxmlEncode.AddEndMap(sb); // mutes | ||||
|                     LLSDxmlEncode.AddEndMap(sb); // info | ||||
|                     if (up.enterOrLeave) | ||||
|                         LLSDxmlEncode.AddElem("transition", "ENTER", sb); | ||||
|                     else | ||||
|                         LLSDxmlEncode.AddElem("transition", "LEAVE", sb); | ||||
|                 LLSDxmlEncode.AddEndMap(sb); //agentid | ||||
|             } | ||||
|             LLSDxmlEncode.AddEndMap(sb); // agent_updates | ||||
|             LLSDxmlEncode.AddEmptyMap("updates",sb); | ||||
|             LLSDxmlEncode.AddElem("session_id", sessionID, sb); | ||||
| 
 | ||||
|             Enqueue(EndEventToBytes(sb), toAgent); | ||||
|         } | ||||
| 
 | ||||
|         public void ChatterBoxSessionStartReply(UUID sessionID, string sessionName, int type, | ||||
|                                 bool voiceEnabled, bool voiceModerated, UUID tmpSessionID, | ||||
|                                 bool sucess, string error, | ||||
|                                 UUID toAgent) | ||||
|         { | ||||
|             StringBuilder sb = StartEvent("ChatterBoxSessionStartReply"); | ||||
|             LLSDxmlEncode.AddElem("session_id", sessionID, sb); | ||||
|             LLSDxmlEncode.AddElem("temp_session_id", tmpSessionID, sb); | ||||
|             LLSDxmlEncode.AddElem("success", sucess, sb); | ||||
|             if(sucess) | ||||
|             { | ||||
|                 LLSDxmlEncode.AddMap("session_info", sb); | ||||
|                     LLSDxmlEncode.AddMap("moderated_mode", sb); | ||||
|                         LLSDxmlEncode.AddElem("voice", voiceModerated, sb); | ||||
|                     LLSDxmlEncode.AddEndMap(sb); | ||||
|                     LLSDxmlEncode.AddElem("session_name", sessionName, sb); | ||||
|                     LLSDxmlEncode.AddElem("type", type, sb); | ||||
|                     LLSDxmlEncode.AddElem("voice_enabled", voiceEnabled, sb); | ||||
|                 LLSDxmlEncode.AddEndMap(sb); | ||||
|             } | ||||
|             else | ||||
|                 LLSDxmlEncode.AddElem("error", String.IsNullOrEmpty(error) ? "" : error, sb); | ||||
| 
 | ||||
|             Enqueue(EndEventToBytes(sb), toAgent); | ||||
|         } | ||||
| 
 | ||||
|         public void ChatterBoxForceClose(UUID toAgent, UUID sessionID, string reason) | ||||
|         { | ||||
|             StringBuilder sb = StartEvent("ForceCloseChatterBoxSession"); | ||||
|             LLSDxmlEncode.AddElem("session_id", sessionID, sb); | ||||
|             LLSDxmlEncode.AddElem("reason", reason, sb); | ||||
| 
 | ||||
|             Enqueue(EndEventToBytes(sb), toAgent); | ||||
|         } | ||||
| 
 | ||||
|         public void GroupMembershipData(UUID AgentID, GroupMembershipData[] data) | ||||
|         { | ||||
|             StringBuilder sb = StartEvent("AgentGroupDataUpdate"); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddArrayAndMap("AgentData", sb); | ||||
|             LLSDxmlEncode.AddElem("AgentID", AgentID, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             if (data.Length == 0) | ||||
|             { | ||||
|                 LLSDxmlEncode.AddEmptyArray("GroupData", sb); | ||||
|                 LLSDxmlEncode.AddEmptyArray("NewGroupData", sb); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 List<bool> lstInProfiles = new List<bool>(data.Length); | ||||
|                 LLSDxmlEncode.AddArray("GroupData", sb); | ||||
|                 foreach (GroupMembershipData m in data) | ||||
|                 { | ||||
|                     LLSDxmlEncode.AddMap(sb); | ||||
|                     LLSDxmlEncode.AddElem("GroupID", m.GroupID, sb); | ||||
|                     LLSDxmlEncode.AddElem("GroupPowers", m.GroupPowers, sb); | ||||
|                     LLSDxmlEncode.AddElem("AcceptNotices", m.AcceptNotices, sb); | ||||
|                     LLSDxmlEncode.AddElem("GroupInsigniaID", m.GroupPicture, sb); | ||||
|                     LLSDxmlEncode.AddElem("Contribution", m.Contribution, sb); | ||||
|                     LLSDxmlEncode.AddElem("GroupName", m.GroupName, sb); | ||||
|                     LLSDxmlEncode.AddEndMap(sb); | ||||
|                     lstInProfiles.Add(m.ListInProfile); | ||||
|                 } | ||||
|                 LLSDxmlEncode.AddEndArray(sb); | ||||
| 
 | ||||
|                 LLSDxmlEncode.AddArray("NewGroupData", sb); | ||||
|                 foreach(bool b in lstInProfiles) | ||||
|                 { | ||||
|                     LLSDxmlEncode.AddMap(sb); | ||||
|                     LLSDxmlEncode.AddElem("ListInProfile", b, sb); | ||||
|                     LLSDxmlEncode.AddEndMap(sb); | ||||
|                 } | ||||
|                 LLSDxmlEncode.AddEndArray(sb); | ||||
|             } | ||||
| 
 | ||||
|             Enqueue(EndEventToBytes(sb), AgentID); | ||||
|         } | ||||
| 
 | ||||
|         public void PlacesQueryReply(UUID avatarID, UUID queryID, UUID transactionID, PlacesReplyData[] replyDataArray) | ||||
|         { | ||||
|             StringBuilder sb = new StringBuilder(256); | ||||
|             LLSDxmlEncode.AddMap(sb); | ||||
|             LLSDxmlEncode.AddElem("message", "PlacesReplyMessage", sb); | ||||
|             LLSDxmlEncode.AddMap("QueryData[]", sb); LLSDxmlEncode.AddArray(sb); | ||||
|                 LLSDxmlEncode.AddArray("AgentData", sb); | ||||
|                     LLSDxmlEncode.AddMap(sb); | ||||
|                         LLSDxmlEncode.AddElem("AgentID", avatarID, sb); | ||||
|                         LLSDxmlEncode.AddElem("QueryID", queryID, sb); | ||||
|                         LLSDxmlEncode.AddElem("TransactionID", transactionID, sb); | ||||
|                     LLSDxmlEncode.AddEndMap(sb); | ||||
|                 LLSDxmlEncode.AddEndArray(sb); | ||||
| 
 | ||||
|                 LLSDxmlEncode.AddArray("QueryData", sb); | ||||
| 
 | ||||
|                 for (int i = 0; i < replyDataArray.Length; ++i) | ||||
|                 { | ||||
|                     PlacesReplyData data = replyDataArray[i]; | ||||
|                     LLSDxmlEncode.AddMap(sb); | ||||
|                         LLSDxmlEncode.AddElem("ActualArea", data.ActualArea, sb); | ||||
|                         LLSDxmlEncode.AddElem("BillableArea", data.BillableArea, sb); | ||||
|                         LLSDxmlEncode.AddElem("Description", data.Desc, sb); | ||||
|                         LLSDxmlEncode.AddElem("Dwell", data.Dwell, sb); | ||||
|                         LLSDxmlEncode.AddElem("Flags", data.Flags, sb); | ||||
|                         LLSDxmlEncode.AddElem("GlobalX", data.GlobalX, sb); | ||||
|                         LLSDxmlEncode.AddElem("GlobalY", data.GlobalY, sb); | ||||
|                         LLSDxmlEncode.AddElem("GlobalZ", data.GlobalZ, sb); | ||||
|                         LLSDxmlEncode.AddElem("Name", data.Name, sb); | ||||
|                         LLSDxmlEncode.AddElem("OwnerID", data.OwnerID, sb); | ||||
|                         LLSDxmlEncode.AddElem("SimName", data.SimName, sb); | ||||
|                         LLSDxmlEncode.AddElem("SnapShotID", data.SnapshotID, sb); | ||||
|                         LLSDxmlEncode.AddElem("ProductSku", (int)0, sb); | ||||
|                         LLSDxmlEncode.AddElem("Price", data.Price, sb); | ||||
|                     LLSDxmlEncode.AddEndMap(sb); | ||||
|                 } | ||||
|                 LLSDxmlEncode.AddEndArray(sb); | ||||
| 
 | ||||
|             Enqueue(EndEventToBytes(sb), avatarID); | ||||
|         } | ||||
| 
 | ||||
|         public void ScriptRunningEvent(UUID objectID, UUID itemID, bool running, UUID avatarID) | ||||
|         { | ||||
|             StringBuilder sb = StartEvent("ScriptRunningReply"); | ||||
|             LLSDxmlEncode.AddArrayAndMap("Script", sb); | ||||
|                 LLSDxmlEncode.AddElem("ObjectID", objectID, sb); | ||||
|                 LLSDxmlEncode.AddElem("ItemID", itemID, sb); | ||||
|                 LLSDxmlEncode.AddElem("Running", running, sb); | ||||
|                 LLSDxmlEncode.AddElem("Mono", true, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             Enqueue(EndEventToBytes(sb), avatarID); | ||||
|         } | ||||
| 
 | ||||
|         public void partPhysicsProperties(uint localID, byte physhapetype, | ||||
|                         float density, float friction, float bounce, float gravmod, UUID avatarID) | ||||
|         { | ||||
|             StringBuilder sb = StartEvent("ObjectPhysicsProperties"); | ||||
|             LLSDxmlEncode.AddArrayAndMap("ObjectData", sb); | ||||
|                 LLSDxmlEncode.AddElem("LocalID", (int)localID, sb); | ||||
|                 LLSDxmlEncode.AddElem("Density", density, sb); | ||||
|                 LLSDxmlEncode.AddElem("Friction", friction, sb); | ||||
|                 LLSDxmlEncode.AddElem("GravityMultiplier", gravmod, sb); | ||||
|                 LLSDxmlEncode.AddElem("Restitution", bounce, sb); | ||||
|                 LLSDxmlEncode.AddElem("PhysicsShapeType", (int)physhapetype, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             Enqueue(EndEventToBytes(sb), avatarID); | ||||
|         } | ||||
| 
 | ||||
|         public void WindlightRefreshEvent(int interpolate, UUID avatarID) | ||||
|         { | ||||
|             StringBuilder sb = StartEvent("WindLightRefresh"); | ||||
|             LLSDxmlEncode.AddElem("Interpolate", interpolate > 0 ? 1 : 0, sb); | ||||
|             Enqueue(EndEventToBytes(sb), avatarID); | ||||
|         } | ||||
| 
 | ||||
|         public static string KeepAliveEvent() | ||||
|         { | ||||
|             StringBuilder sb = new StringBuilder(256); | ||||
|             LLSDxmlEncode.AddMap(sb); | ||||
|             LLSDxmlEncode.AddElem("message", "FAKEEVENT", sb); | ||||
|             LLSDxmlEncode.AddMap("body", sb); | ||||
|             LLSDxmlEncode.AddEndMap(sb); // close body | ||||
|             LLSDxmlEncode.AddEndMap(sb); // close event | ||||
|             return sb.ToString(); | ||||
|         } | ||||
| 
 | ||||
|         public byte[] BuildEvent(string eventName, OSD eventBody) | ||||
|         { | ||||
|             OSDMap llsdEvent = new OSDMap(2); | ||||
|             llsdEvent.Add("message", new OSDString(eventName)); | ||||
|             llsdEvent.Add("body", eventBody); | ||||
| 
 | ||||
|             return Util.UTF8NBGetbytes(OSDParser.SerializeLLSDInnerXmlString(llsdEvent)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -35,12 +35,8 @@ using log4net; | |||
| using Nini.Config; | ||||
| using Mono.Addins; | ||||
| using OpenMetaverse; | ||||
| using OpenMetaverse.Messages.Linden; | ||||
| using OpenMetaverse.Packets; | ||||
| using OpenMetaverse.StructuredData; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Framework.Console; | ||||
| using OpenSim.Framework.Servers; | ||||
| using OpenSim.Framework.Servers.HttpServer; | ||||
| using OpenSim.Region.Framework.Interfaces; | ||||
| using OpenSim.Region.Framework.Scenes; | ||||
|  | @ -55,11 +51,15 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|     } | ||||
| 
 | ||||
|     [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "EventQueueGetModule")] | ||||
|     public class EventQueueGetModule : IEventQueue, INonSharedRegionModule | ||||
|     public partial class  EventQueueGetModule : IEventQueue, INonSharedRegionModule | ||||
|     { | ||||
|         private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||||
|         private static string LogHeader = "[EVENT QUEUE GET MODULE]"; | ||||
| 
 | ||||
|         private const int KEEPALIVE = 60; // this could be larger now, but viewers expect it on opensim | ||||
|         // we need to go back to close before viwers, or we may lose data | ||||
|         private const int VIEWERKEEPALIVE = (KEEPALIVE - 1) * 1000; // do it shorter | ||||
| 
 | ||||
|         /// <value> | ||||
|         /// Debug level. | ||||
|         /// </value> | ||||
|  | @ -69,7 +69,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
| 
 | ||||
|         private Dictionary<UUID, int> m_ids = new Dictionary<UUID, int>(); | ||||
| 
 | ||||
|         private Dictionary<UUID, Queue<OSD>> queues = new Dictionary<UUID, Queue<OSD>>(); | ||||
|         private Dictionary<UUID, Queue<byte[]>> queues = new Dictionary<UUID, Queue<byte[]>>(); | ||||
|         private Dictionary<UUID, UUID> m_AvatarQueueUUIDMapping = new Dictionary<UUID, UUID>(); | ||||
| 
 | ||||
|         #region INonSharedRegionModule methods | ||||
|  | @ -149,22 +149,19 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|             { | ||||
|                 DebugLevel = debugLevel; | ||||
|                 MainConsole.Instance.Output( | ||||
|                     "Set event queue debug level to {0} in {1}", null, DebugLevel, m_scene.RegionInfo.RegionName); | ||||
|                     "Set event queue debug level to {0} in {1}", DebugLevel, m_scene.RegionInfo.RegionName); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         protected void HandleShowEq(string module, string[] args) | ||||
|         { | ||||
|             MainConsole.Instance.Output("For scene {0}", null, m_scene.Name); | ||||
|             MainConsole.Instance.Output("Events in Scene {0} agents queues :", m_scene.Name); | ||||
| 
 | ||||
|             lock (queues) | ||||
|             { | ||||
|                 foreach (KeyValuePair<UUID, Queue<OSD>> kvp in queues) | ||||
|                 foreach (KeyValuePair<UUID, Queue<byte[]>> kvp in queues) | ||||
|                 { | ||||
|                     MainConsole.Instance.Output( | ||||
|                         "For agent {0} there are {1} messages queued for send.", | ||||
|                         null, | ||||
|                         kvp.Key, kvp.Value.Count); | ||||
|                     MainConsole.Instance.Output("    {0}  {1}", kvp.Key, kvp.Value.Count); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | @ -174,21 +171,23 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|         /// </summary> | ||||
|         /// <param name="agentId"></param> | ||||
|         /// <returns></returns> | ||||
|         private Queue<OSD> TryGetQueue(UUID agentId) | ||||
|         private Queue<byte[]> TryGetQueue(UUID agentId) | ||||
|         { | ||||
|             lock (queues) | ||||
|             { | ||||
|                 if (!queues.ContainsKey(agentId)) | ||||
|                 { | ||||
|                     if (DebugLevel > 0) | ||||
|                         m_log.DebugFormat( | ||||
|                             "[EVENTQUEUE]: Adding new queue for agent {0} in region {1}", | ||||
|                             agentId, m_scene.RegionInfo.RegionName); | ||||
|                 Queue<byte[]> queue; | ||||
|                 if (queues.TryGetValue(agentId, out queue)) | ||||
|                     return queue; | ||||
|                      | ||||
|                 if (DebugLevel > 0) | ||||
|                     m_log.DebugFormat( | ||||
|                        "[EVENTQUEUE]: Adding new queue for agent {0} in region {1}", | ||||
|                        agentId, m_scene.RegionInfo.RegionName); | ||||
| 
 | ||||
|                     queues[agentId] = new Queue<OSD>(); | ||||
|                 } | ||||
|                 queue = new Queue<byte[]>(); | ||||
|                 queues[agentId] = queue; | ||||
| 
 | ||||
|                 return queues[agentId]; | ||||
|                 return queue; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -198,31 +197,58 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|         /// </summary> | ||||
|         /// <param name="agentId"></param> | ||||
|         /// <returns></returns> | ||||
|         private Queue<OSD> GetQueue(UUID agentId) | ||||
|         private Queue<byte[]> GetQueue(UUID agentId) | ||||
|         { | ||||
|             lock (queues) | ||||
|             { | ||||
|                 if (queues.ContainsKey(agentId)) | ||||
|                 { | ||||
|                     return queues[agentId]; | ||||
|                 } | ||||
|                 else | ||||
|                     return null; | ||||
|                 if (queues.TryGetValue(agentId, out  Queue<byte[]> queue)) | ||||
|                     return queue; | ||||
|                 return null; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         #region IEventQueue Members | ||||
| 
 | ||||
|         public bool Enqueue(OSD ev, UUID avatarID) | ||||
|         //legacy  | ||||
|         public bool Enqueue(OSD data, UUID avatarID) | ||||
|         { | ||||
|             //m_log.DebugFormat("[EVENTQUEUE]: Enqueuing event for {0} in region {1}", avatarID, m_scene.RegionInfo.RegionName); | ||||
|             try | ||||
|             { | ||||
|                 Queue<OSD> queue = GetQueue(avatarID); | ||||
|                 Queue<byte[]> queue = GetQueue(avatarID); | ||||
|                 if (queue != null) | ||||
|                 { | ||||
|                     byte[] evData = Util.UTF8NBGetbytes(OSDParser.SerializeLLSDInnerXmlString(data)); | ||||
|                     lock (queue) | ||||
|                         queue.Enqueue(ev); | ||||
|                         queue.Enqueue(evData); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     m_log.WarnFormat( | ||||
|                             "[EVENTQUEUE]: (Enqueue) No queue found for agent {0} in region {1}", | ||||
|                             avatarID, m_scene.Name); | ||||
|                 } | ||||
|             } | ||||
|             catch (NullReferenceException e) | ||||
|             { | ||||
|                 m_log.Error("[EVENTQUEUE] Caught exception: " + e); | ||||
|                 return false; | ||||
|             } | ||||
|             return true; | ||||
|         } | ||||
| 
 | ||||
|         //legacy | ||||
|         /* | ||||
|         public bool Enqueue(string ev, UUID avatarID) | ||||
|         { | ||||
|             //m_log.DebugFormat("[EVENTQUEUE]: Enqueuing event for {0} in region {1}", avatarID, m_scene.RegionInfo.RegionName); | ||||
|             try | ||||
|             { | ||||
|                 Queue<byte[]> queue = GetQueue(avatarID); | ||||
|                 if (queue != null) | ||||
|                 { | ||||
|                     byte[] evData = Util.UTF8NBGetbytes(ev); | ||||
|                     lock (queue) | ||||
|                         queue.Enqueue(evData); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|  | @ -236,7 +262,33 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|                 m_log.Error("[EVENTQUEUE] Caught exception: " + e); | ||||
|                 return false; | ||||
|             } | ||||
|             return true; | ||||
|         } | ||||
|         */ | ||||
| 
 | ||||
|         public bool Enqueue(byte[] evData, UUID avatarID) | ||||
|         { | ||||
|             //m_log.DebugFormat("[EVENTQUEUE]: Enqueuing event for {0} in region {1}", avatarID, m_scene.RegionInfo.RegionName); | ||||
|             try | ||||
|             { | ||||
|                 Queue<byte[]> queue = GetQueue(avatarID); | ||||
|                 if (queue != null) | ||||
|                 { | ||||
|                     lock (queue) | ||||
|                         queue.Enqueue(evData); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     m_log.WarnFormat( | ||||
|                             "[EVENTQUEUE]: (Enqueue) No queue found for agent {0} in region {1}", | ||||
|                             avatarID, m_scene.Name); | ||||
|                 } | ||||
|             } | ||||
|             catch (NullReferenceException e) | ||||
|             { | ||||
|                 m_log.Error("[EVENTQUEUE] Caught exception: " + e); | ||||
|                 return false; | ||||
|             } | ||||
|             return true; | ||||
|         } | ||||
| 
 | ||||
|  | @ -267,7 +319,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|         /// <param name='eqgUuid'></param> | ||||
|         private string GenerateEqgCapPath(UUID eqgUuid) | ||||
|         { | ||||
|             return string.Format("/CAPS/EQG/{0}/", eqgUuid); | ||||
|             return string.Format("/CE/{0}/", eqgUuid); | ||||
|         } | ||||
| 
 | ||||
|         public void OnRegisterCaps(UUID agentID, Caps caps) | ||||
|  | @ -280,16 +332,15 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|                     agentID, caps, m_scene.RegionInfo.RegionName); | ||||
| 
 | ||||
|             UUID eventQueueGetUUID; | ||||
|             Queue<OSD> queue = null; | ||||
|             Queue<Byte[]> queue = null; | ||||
| 
 | ||||
|             lock (queues) | ||||
|             { | ||||
|                 if (queues.ContainsKey(agentID)) | ||||
|                     queue = queues[agentID]; | ||||
|                 queues.TryGetValue(agentID, out queue); | ||||
| 
 | ||||
|                 if (queue == null) | ||||
|                 { | ||||
|                     queue = new Queue<OSD>(); | ||||
|                     queue = new Queue<byte[]>(); | ||||
|                     queues[agentID] = queue; | ||||
| 
 | ||||
|                     lock (m_AvatarQueueUUIDMapping) | ||||
|  | @ -338,7 +389,6 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|                         { | ||||
|                             eventQueueGetUUID = UUID.Random(); | ||||
|                             m_AvatarQueueUUIDMapping[agentID] = eventQueueGetUUID; | ||||
|                             m_log.DebugFormat("[EVENTQUEUE]: Using random UUID!"); | ||||
|                             lock (m_ids) | ||||
|                             { | ||||
|                                 if (m_ids.ContainsKey(agentID)) | ||||
|  | @ -354,21 +404,22 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|                 } | ||||
|             } | ||||
| 
 | ||||
|         caps.RegisterPollHandler( | ||||
|             "EventQueueGet", | ||||
|                 new PollServiceEventArgs(null, GenerateEqgCapPath(eventQueueGetUUID), HasEvents, GetEvents, NoEvents, Drop, agentID, int.MaxValue)); | ||||
|             caps.RegisterPollHandler( | ||||
|                 "EventQueueGet", | ||||
|                     new PollServiceEventArgs(null, GenerateEqgCapPath(eventQueueGetUUID), HasEvents, GetEvents, NoEvents, Drop, agentID, VIEWERKEEPALIVE)); | ||||
|         } | ||||
| 
 | ||||
|         public bool HasEvents(UUID requestID, UUID agentID) | ||||
|         { | ||||
|             Queue<OSD> queue = GetQueue(agentID); | ||||
|             Queue<byte[]> queue = GetQueue(agentID); | ||||
|             if (queue != null) | ||||
|             { | ||||
|                 lock (queue) | ||||
|                 { | ||||
|                     //m_log.WarnFormat("POLLED FOR EVENTS BY {0} in {1} -- {2}", agentID, m_scene.RegionInfo.RegionName, queue.Count); | ||||
|                     return queue.Count > 0; | ||||
|                 } | ||||
| 
 | ||||
|             } | ||||
|             //m_log.WarnFormat("POLLED FOR EVENTS BY {0} unknown agent", agentID); | ||||
|             return true; | ||||
|         } | ||||
|  | @ -387,22 +438,32 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|                     ev["message"], m_scene.GetScenePresence(agentId).Name, m_scene.Name); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void Drop(UUID requestID, UUID pAgentId) | ||||
|         { | ||||
|             // do nothing, in last case http server will do it | ||||
|         } | ||||
| 
 | ||||
|         private readonly byte[] EventHeader = GenEventHeader(); | ||||
| 
 | ||||
|         private static byte[] GenEventHeader() | ||||
|         { | ||||
|             return Encoding.UTF8.GetBytes("<llsd><map><key>events</key><array>"); | ||||
|         } | ||||
| 
 | ||||
|         public Hashtable GetEvents(UUID requestID, UUID pAgentId) | ||||
|         { | ||||
|             if (DebugLevel >= 2) | ||||
|                 m_log.WarnFormat("POLLED FOR EQ MESSAGES BY {0} in {1}", pAgentId, m_scene.Name); | ||||
| 
 | ||||
|             Queue<OSD> queue = GetQueue(pAgentId); | ||||
|             Queue<byte[]> queue = GetQueue(pAgentId); | ||||
|             if (queue == null) | ||||
|                 return NoEvents(requestID, pAgentId); | ||||
|                 return NoAgent(requestID, pAgentId); | ||||
| 
 | ||||
|             OSD element = null;; | ||||
|             OSDArray array = new OSDArray(); | ||||
|             byte[] element = null; | ||||
|             List<byte[]> elements; | ||||
| 
 | ||||
|             int totalSize = 0; | ||||
|             int thisID = 0; | ||||
|             bool negativeID = false; | ||||
| 
 | ||||
|  | @ -420,6 +481,9 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|                     thisID = -thisID; | ||||
|                 } | ||||
| 
 | ||||
|                 elements = new List<byte[]>(queue.Count + 2); | ||||
|                 elements.Add(EventHeader); | ||||
| 
 | ||||
|                 while (queue.Count > 0) | ||||
|                 { | ||||
|                     element = queue.Dequeue(); | ||||
|  | @ -430,7 +494,9 @@ namespace OpenSim.Region.ClientStack.Linden | |||
| 
 | ||||
|                     if (DebugLevel > 0) | ||||
|                         LogOutboundDebugMessage(element, pAgentId); | ||||
|                     array.Add(element); | ||||
| 
 | ||||
|                     elements.Add(element); | ||||
|                     totalSize += element.Length; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|  | @ -445,280 +511,56 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|                     m_ids[pAgentId] = thisID + 1; | ||||
|             } | ||||
| 
 | ||||
|             if (array.Count == 0) | ||||
|             if (totalSize == 0) | ||||
|                 return NoEvents(requestID, pAgentId); | ||||
| 
 | ||||
|             OSDMap events = new OSDMap(); | ||||
|             events.Add("events", array); | ||||
|             events.Add("id", new OSDInteger(thisID)); | ||||
|             totalSize += EventHeader.Length; | ||||
| 
 | ||||
|             StringBuilder sb = new StringBuilder(); | ||||
|             LLSDxmlEncode.AddEndArray(sb); // events array | ||||
|                 LLSDxmlEncode.AddElem("id", thisID, sb); | ||||
|             LLSDxmlEncode.AddEndMap(sb); | ||||
|             element = Encoding.UTF8.GetBytes(LLSDxmlEncode.End(sb)); | ||||
|             elements.Add(element); | ||||
|             totalSize += element.Length; | ||||
| 
 | ||||
|             Hashtable responsedata = new Hashtable(); | ||||
|             responsedata["int_response_code"] = 200; | ||||
|             responsedata["content_type"] = "application/xml"; | ||||
| //string tt = OSDParser.SerializeLLSDXmlString(events); | ||||
|             responsedata["bin_response_data"] = Encoding.UTF8.GetBytes(OSDParser.SerializeLLSDXmlString(events)); | ||||
|             responsedata["keepaliveTimeout"] = 60; | ||||
|             //m_log.DebugFormat("[EVENTQUEUE]: sending response for {0} in region {1}: {2}", pAgentId, m_scene.RegionInfo.RegionName, responsedata["str_response_string"]); | ||||
| 
 | ||||
|             //temporary | ||||
|             byte[] finalData = new byte[totalSize]; | ||||
|             int dst = 0; | ||||
|             foreach(byte[] src in elements) | ||||
|             { | ||||
|                 Array.Copy(src, 0, finalData, dst, src.Length); | ||||
|                 dst += src.Length; | ||||
|             } | ||||
| 
 | ||||
|             responsedata["bin_response_data"] = finalData; | ||||
|             responsedata["keepaliveTimeout"] = KEEPALIVE; | ||||
| 
 | ||||
|             return responsedata; | ||||
|         } | ||||
| 
 | ||||
|         public Hashtable NoEvents(UUID requestID, UUID agentID) | ||||
|         { | ||||
|             Hashtable responsedata = new Hashtable(); | ||||
|             responsedata["int_response_code"] = 502; | ||||
|             responsedata["content_type"] = "text/plain"; | ||||
|             responsedata["str_response_string"] = "<llsd></llsd>"; | ||||
|             responsedata["error_status_text"] = "<llsd></llsd>"; | ||||
|             responsedata["keepalive"] = false; | ||||
|             Queue<byte[]> queue = GetQueue(agentID); | ||||
|             if (queue == null) | ||||
|             { | ||||
|                 responsedata["int_response_code"] = (int)HttpStatusCode.NotFound; | ||||
|                 return responsedata; | ||||
|             } | ||||
|             responsedata["int_response_code"] = (int)HttpStatusCode.BadGateway; | ||||
|             return responsedata; | ||||
|         } | ||||
| 
 | ||||
| /* this is not a event message | ||||
|         public void DisableSimulator(ulong handle, UUID avatarID) | ||||
|         public Hashtable NoAgent(UUID requestID, UUID agentID) | ||||
|         { | ||||
|             OSD item = EventQueueHelper.DisableSimulator(handle); | ||||
|             Enqueue(item, avatarID); | ||||
|         } | ||||
| */ | ||||
|         public StringBuilder StartEvent(string eventName) | ||||
|         { | ||||
|             StringBuilder sb = new StringBuilder(256); | ||||
|             LLSDxmlEncode.AddMap(sb); | ||||
|             LLSDxmlEncode.AddElem("message", eventName, sb); | ||||
|                 LLSDxmlEncode.AddMap("body", sb); | ||||
| 
 | ||||
|             return sb; | ||||
|         } | ||||
| 
 | ||||
|         public string EndEvent(StringBuilder sb) | ||||
|         { | ||||
|                 LLSDxmlEncode.AddEndMap(sb); // close body | ||||
|             LLSDxmlEncode.AddEndMap(sb); // close event | ||||
|             return sb.ToString(); | ||||
|         } | ||||
| 
 | ||||
|         public virtual void EnableSimulator(ulong handle, IPEndPoint endPoint, UUID avatarID, int regionSizeX, int regionSizeY) | ||||
|         { | ||||
|             if (DebugLevel > 0) | ||||
|                 m_log.DebugFormat("{0} EnableSimulator. handle={1}, endPoint={2}, avatarID={3}", | ||||
|                     LogHeader, handle, endPoint, avatarID, regionSizeX, regionSizeY); | ||||
| 
 | ||||
|             StringBuilder sb = StartEvent("EnableSimulator"); | ||||
|             LLSDxmlEncode.AddArrayAndMap("SimulatorInfo", sb); | ||||
|                 LLSDxmlEncode.AddElem("Handle", handle, sb); | ||||
|                 LLSDxmlEncode.AddElem("IP", endPoint.Address.GetAddressBytes(), sb); | ||||
|                 LLSDxmlEncode.AddElem("Port", endPoint.Port, sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionSizeX", (uint)regionSizeX, sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionSizeY", (uint)regionSizeY, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             OSD item = new OSDllsdxml(EndEvent(sb)); | ||||
| 
 | ||||
|             Enqueue(item, avatarID); | ||||
|         } | ||||
| 
 | ||||
|         public virtual void EstablishAgentCommunication(UUID avatarID, IPEndPoint endPoint, string capsPath, | ||||
|                                 ulong regionHandle, int regionSizeX, int regionSizeY) | ||||
|         { | ||||
|             if (DebugLevel > 0) | ||||
|                 m_log.DebugFormat("{0} EstablishAgentCommunication. handle={1}, endPoint={2}, avatarID={3}", | ||||
|                     LogHeader, regionHandle, endPoint, avatarID, regionSizeX, regionSizeY); | ||||
| 
 | ||||
|             StringBuilder sb = StartEvent("EstablishAgentCommunication"); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddElem("agent-id", avatarID, sb); | ||||
|             LLSDxmlEncode.AddElem("sim-ip-and-port", endPoint.ToString(), sb); | ||||
|             LLSDxmlEncode.AddElem("seed-capability", capsPath, sb); | ||||
|             // current viewers ignore this, also not needed its sent on enablesim | ||||
|             //LLSDxmlEncode.AddElem("region-handle", regionHandle, sb); | ||||
|             //LLSDxmlEncode.AddElem("region-size-x", (uint)regionSizeX, sb); | ||||
|             //LLSDxmlEncode.AddElem("region-size-y", (uint)regionSizeY, sb); | ||||
| 
 | ||||
|             OSD ev = new OSDllsdxml(EndEvent(sb)); | ||||
|             Enqueue(ev, avatarID); | ||||
|         } | ||||
| 
 | ||||
|         public virtual void TeleportFinishEvent(ulong regionHandle, byte simAccess, | ||||
|                                         IPEndPoint regionExternalEndPoint, | ||||
|                                         uint locationID, uint flags, string capsURL, | ||||
|                                         UUID avatarID, int regionSizeX, int regionSizeY) | ||||
|         { | ||||
|             if (DebugLevel > 0) | ||||
|                 m_log.DebugFormat("{0} TeleportFinishEvent. handle={1}, endPoint={2}, avatarID={3}", | ||||
|                     LogHeader, regionHandle, regionExternalEndPoint, avatarID, regionSizeX, 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; | ||||
| 
 | ||||
|             StringBuilder sb = StartEvent("TeleportFinish"); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddArrayAndMap("Info", sb); | ||||
|                 LLSDxmlEncode.AddElem("AgentID", avatarID, sb); | ||||
|                 LLSDxmlEncode.AddElem("LocationID", (uint)4, sb); // TODO what is this? | ||||
|                 LLSDxmlEncode.AddElem("SimIP", regionExternalEndPoint.Address.GetAddressBytes(), sb); | ||||
|                 LLSDxmlEncode.AddElem("SimPort", regionExternalEndPoint.Port, sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionHandle", regionHandle, sb); | ||||
|                 LLSDxmlEncode.AddElem("SeedCapability", capsURL, sb); | ||||
|                 LLSDxmlEncode.AddElem("SimAccess",(int)simAccess, sb); | ||||
|                 LLSDxmlEncode.AddElem("TeleportFlags", flags, sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionSizeX", (uint)regionSizeX, sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionSizeY", (uint)regionSizeY, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             OSD ev = new OSDllsdxml(EndEvent(sb)); | ||||
|             Enqueue(ev, avatarID); | ||||
|         } | ||||
| 
 | ||||
|         public virtual void CrossRegion(ulong handle, Vector3 pos, Vector3 lookAt, | ||||
|                                 IPEndPoint newRegionExternalEndPoint, | ||||
|                                 string capsURL, UUID avatarID, UUID sessionID, int regionSizeX, int regionSizeY) | ||||
|         { | ||||
|             if (DebugLevel > 0) | ||||
|                 m_log.DebugFormat("{0} CrossRegion. handle={1}, avatarID={2}, regionSize={3},{4}>", | ||||
|                     LogHeader, handle, avatarID, regionSizeX, regionSizeY); | ||||
| 
 | ||||
|             StringBuilder sb = StartEvent("CrossedRegion"); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddArrayAndMap("AgentData", sb); | ||||
|                 LLSDxmlEncode.AddElem("AgentID", avatarID, sb); | ||||
|                 LLSDxmlEncode.AddElem("SessionID", sessionID, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddArrayAndMap("Info", sb); | ||||
|                 LLSDxmlEncode.AddElem("LookAt", lookAt, sb); | ||||
|                 LLSDxmlEncode.AddElem("Position", pos, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddArrayAndMap("RegionData", sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionHandle", handle, sb); | ||||
|                 LLSDxmlEncode.AddElem("SeedCapability", capsURL, sb); | ||||
|                 LLSDxmlEncode.AddElem("SimIP", newRegionExternalEndPoint.Address.GetAddressBytes(), sb); | ||||
|                 LLSDxmlEncode.AddElem("SimPort", newRegionExternalEndPoint.Port, sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionSizeX", (uint)regionSizeX, sb); | ||||
|                 LLSDxmlEncode.AddElem("RegionSizeY", (uint)regionSizeY, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             OSD ev = new OSDllsdxml(EndEvent(sb)); | ||||
|             Enqueue(ev, avatarID); | ||||
|         } | ||||
| 
 | ||||
|         public void ChatterboxInvitation(UUID sessionID, string sessionName, | ||||
|                                          UUID fromAgent, string message, UUID toAgent, string fromName, byte dialog, | ||||
|                                          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, | ||||
|                                                              fromGroup, binaryBucket); | ||||
|             Enqueue(item, toAgent); | ||||
|             //m_log.InfoFormat("########### eq ChatterboxInvitation #############\n{0}", item); | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         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, 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 GroupMembershipData(UUID AgentID, GroupMembershipData[] data) | ||||
|         { | ||||
|             StringBuilder sb = StartEvent("AgentGroupDataUpdate"); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddArrayAndMap("AgentData", sb); | ||||
|             LLSDxmlEncode.AddElem("AgentID", AgentID, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             if (data.Length == 0) | ||||
|             { | ||||
|                 LLSDxmlEncode.AddEmptyArray("GroupData", sb); | ||||
|                 LLSDxmlEncode.AddEmptyArray("NewGroupData", sb); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 List<bool> lstInProfiles = new List<bool>(data.Length); | ||||
|                 LLSDxmlEncode.AddArray("GroupData", sb); | ||||
|                 foreach (GroupMembershipData m in data) | ||||
|                 { | ||||
|                     LLSDxmlEncode.AddMap(sb); | ||||
|                     LLSDxmlEncode.AddElem("GroupID", m.GroupID, sb); | ||||
|                     LLSDxmlEncode.AddElem("GroupPowers", m.GroupPowers, sb); | ||||
|                     LLSDxmlEncode.AddElem("AcceptNotices", m.AcceptNotices, sb); | ||||
|                     LLSDxmlEncode.AddElem("GroupInsigniaID", m.GroupPicture, sb); | ||||
|                     LLSDxmlEncode.AddElem("Contribution", m.Contribution, sb); | ||||
|                     LLSDxmlEncode.AddElem("GroupName", m.GroupName, sb); | ||||
|                     LLSDxmlEncode.AddEndMap(sb); | ||||
|                     lstInProfiles.Add(m.ListInProfile); | ||||
|                 } | ||||
|                 LLSDxmlEncode.AddEndArray(sb); | ||||
| 
 | ||||
|                 LLSDxmlEncode.AddArray("NewGroupData", sb); | ||||
|                 foreach(bool b in lstInProfiles) | ||||
|                 { | ||||
|                     LLSDxmlEncode.AddMap(sb); | ||||
|                     LLSDxmlEncode.AddElem("ListInProfile", b, sb); | ||||
|                     LLSDxmlEncode.AddEndMap(sb); | ||||
|                 } | ||||
|                 LLSDxmlEncode.AddEndArray(sb); | ||||
|             } | ||||
| 
 | ||||
|             OSD ev = new OSDllsdxml(EndEvent(sb)); | ||||
|             Enqueue(ev, AgentID); | ||||
|         } | ||||
| 
 | ||||
|         public void QueryReply(PlacesReplyPacket groupUpdate, UUID avatarID) | ||||
|         { | ||||
|             OSD item = EventQueueHelper.PlacesQuery(groupUpdate); | ||||
|             Enqueue(item, avatarID); | ||||
|         } | ||||
| 
 | ||||
|         public void ScriptRunningEvent(UUID objectID, UUID itemID, bool running, UUID avatarID) | ||||
|         { | ||||
|             StringBuilder sb = StartEvent("ScriptRunningReply"); | ||||
|             LLSDxmlEncode.AddArrayAndMap("Script", sb); | ||||
|                 LLSDxmlEncode.AddElem("ObjectID", objectID, sb); | ||||
|                 LLSDxmlEncode.AddElem("ItemID", itemID, sb); | ||||
|                 LLSDxmlEncode.AddElem("Running", running, sb); | ||||
|                 LLSDxmlEncode.AddElem("Mono", true, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             OSDllsdxml item = new OSDllsdxml(EndEvent(sb)); | ||||
|             Enqueue(item, avatarID); | ||||
|         } | ||||
| 
 | ||||
|         public void partPhysicsProperties(uint localID, byte physhapetype, | ||||
|                         float density, float friction, float bounce, float gravmod,UUID avatarID) | ||||
|         { | ||||
|             StringBuilder sb = StartEvent("ObjectPhysicsProperties"); | ||||
|             LLSDxmlEncode.AddArrayAndMap("ObjectData", sb); | ||||
|                 LLSDxmlEncode.AddElem("LocalID", (int)localID, sb); | ||||
|                 LLSDxmlEncode.AddElem("Density", density, sb); | ||||
|                 LLSDxmlEncode.AddElem("Friction", friction, sb); | ||||
|                 LLSDxmlEncode.AddElem("GravityMultiplier", gravmod, sb); | ||||
|                 LLSDxmlEncode.AddElem("Restitution", bounce, sb); | ||||
|                 LLSDxmlEncode.AddElem("PhysicsShapeType", (int)physhapetype, sb); | ||||
|             LLSDxmlEncode.AddEndMapAndArray(sb); | ||||
| 
 | ||||
|             OSDllsdxml item = new OSDllsdxml(EndEvent(sb)); | ||||
|             Enqueue(item, avatarID); | ||||
|         } | ||||
| 
 | ||||
|         public OSD BuildEvent(string eventName, OSD eventBody) | ||||
|         { | ||||
|             return EventQueueHelper.BuildEvent(eventName, eventBody); | ||||
|             Hashtable responsedata = new Hashtable(); | ||||
|             responsedata["int_response_code"] = (int)HttpStatusCode.NotFound; | ||||
|             return responsedata; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -41,232 +41,5 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|     { | ||||
|         private EventQueueHelper() {} // no construction possible, it's an utility class | ||||
| 
 | ||||
|         public static StringBuilder StartEvent(string eventName) | ||||
|         { | ||||
|             StringBuilder sb = new StringBuilder(256); | ||||
|             LLSDxmlEncode.AddMap(sb); | ||||
|             LLSDxmlEncode.AddElem("message", eventName, sb); | ||||
|             LLSDxmlEncode.AddMap("body", sb); | ||||
| 
 | ||||
|             return sb; | ||||
|         } | ||||
| 
 | ||||
|         public static string EndEvent(StringBuilder sb) | ||||
|         { | ||||
|             LLSDxmlEncode.AddEndMap(sb); // close body | ||||
|             LLSDxmlEncode.AddEndMap(sb); // close event | ||||
|             return sb.ToString(); | ||||
|         } | ||||
| 
 | ||||
|         public static OSD BuildEvent(string eventName, OSD eventBody) | ||||
|         { | ||||
|             OSDMap llsdEvent = new OSDMap(2); | ||||
|             llsdEvent.Add("message", new OSDString(eventName)); | ||||
|             llsdEvent.Add("body", eventBody); | ||||
| 
 | ||||
|             return llsdEvent; | ||||
|         } | ||||
| 
 | ||||
|         public static OSD KeepAliveEvent() | ||||
|         { | ||||
|             return BuildEvent("FAKEEVENT", new OSDMap()); | ||||
|         } | ||||
| 
 | ||||
|         public static OSD AgentParams(UUID agentID, bool checkEstate, int godLevel, bool limitedToEstate) | ||||
|         { | ||||
|             OSDMap body = new OSDMap(4); | ||||
| 
 | ||||
|             body.Add("agent_id", new OSDUUID(agentID)); | ||||
|             body.Add("check_estate", new OSDInteger(checkEstate ? 1 : 0)); | ||||
|             body.Add("god_level", new OSDInteger(godLevel)); | ||||
|             body.Add("limited_to_estate", new OSDInteger(limitedToEstate ? 1 : 0)); | ||||
| 
 | ||||
|             return body; | ||||
|         } | ||||
| 
 | ||||
|         public static OSD InstantMessageParams(UUID fromAgent, string message, UUID toAgent, | ||||
|             string fromName, byte dialog, uint timeStamp, bool offline, int parentEstateID, | ||||
|             Vector3 position, uint ttl, UUID transactionID, bool fromGroup, byte[] binaryBucket) | ||||
|         { | ||||
|             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)); | ||||
|             positionArray.Add(OSD.FromReal(position.Z)); | ||||
|             messageParams.Add("position", positionArray); | ||||
| 
 | ||||
|             messageParams.Add("region_id", new OSDUUID(UUID.Zero)); | ||||
|             messageParams.Add("to_id", new OSDUUID(toAgent)); | ||||
|             messageParams.Add("source", new OSDInteger(0)); | ||||
| 
 | ||||
|             OSDMap data = new OSDMap(1); | ||||
|             data.Add("binary_bucket", OSD.FromBinary(binaryBucket)); | ||||
|             messageParams.Add("data", data); | ||||
|             messageParams.Add("message", new OSDString(message)); | ||||
|             messageParams.Add("id", new OSDUUID(transactionID)); | ||||
|             messageParams.Add("from_name", new OSDString(fromName)); | ||||
|             messageParams.Add("timestamp", new OSDInteger((int)timeStamp)); | ||||
|             messageParams.Add("offline", new OSDInteger(offline ? 1 : 0)); | ||||
|             messageParams.Add("parent_estate_id", new OSDInteger(parentEstateID)); | ||||
|             messageParams.Add("ttl", new OSDInteger((int)ttl)); | ||||
|             messageParams.Add("from_id", new OSDUUID(fromAgent)); | ||||
|             messageParams.Add("from_group", new OSDInteger(fromGroup ? 1 : 0)); | ||||
| /* | ||||
|             StringBuilder sb = new StringBuilder(256); | ||||
|             LLSDxmlEncode.AddMap(sb); //messageParams | ||||
| 
 | ||||
|             LLSDxmlEncode.AddElem("type", dialog, sb); | ||||
|             LLSDxmlEncode.AddElem("position", position, sb); | ||||
|             LLSDxmlEncode.AddElem("region_id", UUID.Zero, sb); | ||||
|             LLSDxmlEncode.AddElem("to_id", toAgent, sb); | ||||
|             LLSDxmlEncode.AddElem("source", 0, sb); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddMap("data", sb); //messageParams data | ||||
|             LLSDxmlEncode.AddElem("binary_bucket", binaryBucket, sb); | ||||
|             LLSDxmlEncode.AddEndMap(sb); //messageParams data | ||||
| 
 | ||||
|             LLSDxmlEncode.AddElem("message", message, sb); | ||||
|             LLSDxmlEncode.AddElem("id", transactionID, sb); | ||||
|             LLSDxmlEncode.AddElem("from_name", fromName, sb); | ||||
|             LLSDxmlEncode.AddElem("timestamp", timeStamp, sb); | ||||
|             LLSDxmlEncode.AddElem("offline", (offline ? 1 : 0), sb); | ||||
|             LLSDxmlEncode.AddElem("parent_estate_id", parentEstateID, sb); | ||||
|             LLSDxmlEncode.AddElem("ttl", (int)ttl, sb); | ||||
|             LLSDxmlEncode.AddElem("from_id", fromAgent, sb); | ||||
|             LLSDxmlEncode.AddElem("from_group",fromGroup, sb); | ||||
| 
 | ||||
|             LLSDxmlEncode.AddEndMap(sb); //messageParams | ||||
|             string tt = sb.ToString(); | ||||
| */ | ||||
|             return messageParams; | ||||
|         } | ||||
| 
 | ||||
|         public static OSD InstantMessage(UUID fromAgent, string message, UUID toAgent, | ||||
|             string fromName, byte dialog, uint timeStamp, bool offline, int parentEstateID, | ||||
|             Vector3 position, uint ttl, UUID transactionID, bool fromGroup, byte[] binaryBucket, | ||||
|             bool checkEstate, int godLevel, bool limitedToEstate) | ||||
|         { | ||||
|             OSDMap im = new OSDMap(2); | ||||
|             im.Add("message_params", InstantMessageParams(fromAgent, message, toAgent, | ||||
|             fromName, dialog, timeStamp, offline, parentEstateID, | ||||
|             position, ttl, transactionID, fromGroup, binaryBucket)); | ||||
| 
 | ||||
|             im.Add("agent_params", AgentParams(fromAgent, checkEstate, godLevel, limitedToEstate)); | ||||
| 
 | ||||
|             return im; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public static OSD ChatterboxInvitation(UUID sessionID, string sessionName, | ||||
|             UUID fromAgent, string message, UUID toAgent, string fromName, byte dialog, | ||||
|             uint timeStamp, bool offline, int parentEstateID, Vector3 position, | ||||
|             uint ttl, UUID transactionID, bool fromGroup, byte[] binaryBucket) | ||||
|         { | ||||
|             OSDMap body = new OSDMap(5); | ||||
|             body.Add("session_id", new OSDUUID(sessionID)); | ||||
|             body.Add("from_name", new OSDString(fromName)); | ||||
|             body.Add("session_name", new OSDString(sessionName)); | ||||
|             body.Add("from_id", new OSDUUID(fromAgent)); | ||||
| 
 | ||||
|             body.Add("instantmessage", InstantMessage(fromAgent, message, toAgent, | ||||
|             fromName, dialog, timeStamp, offline, parentEstateID, position, | ||||
|             ttl, transactionID, fromGroup, binaryBucket, true, 0, true)); | ||||
| 
 | ||||
|             OSDMap chatterboxInvitation = new OSDMap(2); | ||||
|             chatterboxInvitation.Add("message", new OSDString("ChatterBoxInvitation")); | ||||
|             chatterboxInvitation.Add("body", body); | ||||
|             return chatterboxInvitation; | ||||
|         } | ||||
| 
 | ||||
|         public static OSD ChatterBoxSessionAgentListUpdates(UUID sessionID, | ||||
|             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()); | ||||
| 
 | ||||
|             OSDMap chatterBoxSessionAgentListUpdates = new OSDMap(); | ||||
|             chatterBoxSessionAgentListUpdates.Add("message", OSD.FromString("ChatterBoxSessionAgentListUpdates")); | ||||
|             chatterBoxSessionAgentListUpdates.Add("body", body); | ||||
| 
 | ||||
|             return chatterBoxSessionAgentListUpdates; | ||||
|         } | ||||
| 
 | ||||
|         public static OSD ChatterBoxForceClose(UUID sessionID, string reason) | ||||
|         { | ||||
|             OSDMap body = new OSDMap(2); | ||||
|             body.Add("session_id", new OSDUUID(sessionID)); | ||||
|             body.Add("reason", new OSDString(reason)); | ||||
| 
 | ||||
|             OSDMap chatterBoxForceClose = new OSDMap(2); | ||||
|             chatterBoxForceClose.Add("message", new OSDString("ForceCloseChatterBoxSession")); | ||||
|             chatterBoxForceClose.Add("body", body); | ||||
|             return chatterBoxForceClose; | ||||
|         } | ||||
| 
 | ||||
|         public static OSD PlacesQuery(PlacesReplyPacket PlacesReply) | ||||
|         { | ||||
|             OSDMap placesReply = new OSDMap(); | ||||
|             placesReply.Add("message", OSD.FromString("PlacesReplyMessage")); | ||||
| 
 | ||||
|             OSDMap body = new OSDMap(); | ||||
|             OSDArray agentData = new OSDArray(); | ||||
|             OSDMap agentDataMap = new OSDMap(); | ||||
|             agentDataMap.Add("AgentID", OSD.FromUUID(PlacesReply.AgentData.AgentID)); | ||||
|             agentDataMap.Add("QueryID", OSD.FromUUID(PlacesReply.AgentData.QueryID)); | ||||
|             agentDataMap.Add("TransactionID", OSD.FromUUID(PlacesReply.TransactionData.TransactionID)); | ||||
|             agentData.Add(agentDataMap); | ||||
|             body.Add("AgentData", agentData); | ||||
| 
 | ||||
|             OSDArray QueryData = new OSDArray(); | ||||
| 
 | ||||
|             foreach (PlacesReplyPacket.QueryDataBlock groupDataBlock in PlacesReply.QueryData) | ||||
|             { | ||||
|                 OSDMap QueryDataMap = new OSDMap(); | ||||
|                 QueryDataMap.Add("ActualArea", OSD.FromInteger(groupDataBlock.ActualArea)); | ||||
|                 QueryDataMap.Add("BillableArea", OSD.FromInteger(groupDataBlock.BillableArea)); | ||||
|                 QueryDataMap.Add("Description", OSD.FromBinary(groupDataBlock.Desc)); | ||||
|                 QueryDataMap.Add("Dwell", OSD.FromInteger((int)groupDataBlock.Dwell)); | ||||
|                 QueryDataMap.Add("Flags", OSD.FromString(Convert.ToString(groupDataBlock.Flags))); | ||||
|                 QueryDataMap.Add("GlobalX", OSD.FromInteger((int)groupDataBlock.GlobalX)); | ||||
|                 QueryDataMap.Add("GlobalY", OSD.FromInteger((int)groupDataBlock.GlobalY)); | ||||
|                 QueryDataMap.Add("GlobalZ", OSD.FromInteger((int)groupDataBlock.GlobalZ)); | ||||
|                 QueryDataMap.Add("Name", OSD.FromBinary(groupDataBlock.Name)); | ||||
|                 QueryDataMap.Add("OwnerID", OSD.FromUUID(groupDataBlock.OwnerID)); | ||||
|                 QueryDataMap.Add("SimName", OSD.FromBinary(groupDataBlock.SimName)); | ||||
|                 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); | ||||
|             placesReply.Add("QueryData[]", body); | ||||
| 
 | ||||
|             return placesReply; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -171,7 +171,7 @@ namespace OpenSim.Region.ClientStack.Linden.Tests | |||
| 
 | ||||
|             Hashtable eventsResponse = m_eqgMod.GetEvents(UUID.Zero, TestHelpers.ParseTail(0x1)); | ||||
| 
 | ||||
|             Assert.That((int)eventsResponse["int_response_code"], Is.EqualTo((int)HttpStatusCode.BadGateway)); | ||||
|             Assert.That((int)eventsResponse["int_response_code"], Is.EqualTo((int)HttpStatusCode.NotFound)); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|  | @ -195,7 +195,7 @@ namespace OpenSim.Region.ClientStack.Linden.Tests | |||
| 
 | ||||
|             Hashtable eventsResponse = m_eqgMod.GetEvents(UUID.Zero, npc.UUID); | ||||
| 
 | ||||
|             Assert.That((int)eventsResponse["int_response_code"], Is.EqualTo((int)HttpStatusCode.BadGateway)); | ||||
|             Assert.That((int)eventsResponse["int_response_code"], Is.EqualTo((int)HttpStatusCode.NotFound)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -25,6 +25,7 @@ | |||
|  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
| using System.Net; | ||||
| using OpenMetaverse; | ||||
|  | @ -35,12 +36,48 @@ using OpenSim.Framework; | |||
| 
 | ||||
| namespace OpenSim.Region.Framework.Interfaces | ||||
| { | ||||
|     public struct GroupChatListAgentUpdateData | ||||
|     { | ||||
|         public UUID agentID; | ||||
|         public bool enterOrLeave; // true means enter | ||||
|         public bool isModerator; | ||||
|         public bool mutedText; | ||||
|         public bool canVoice; | ||||
| 
 | ||||
|         public GroupChatListAgentUpdateData(UUID ID) | ||||
|         { | ||||
|             agentID = ID; | ||||
|             canVoice = false; | ||||
|             isModerator = false; | ||||
|             mutedText = false; | ||||
|             enterOrLeave = true; | ||||
|         } | ||||
| 
 | ||||
|         public GroupChatListAgentUpdateData(UUID ID, bool eOL) | ||||
|         { | ||||
|             agentID = ID; | ||||
|             canVoice = false; | ||||
|             isModerator = false; | ||||
|             mutedText = false; | ||||
|             enterOrLeave = eOL; | ||||
|         } | ||||
| 
 | ||||
|         public GroupChatListAgentUpdateData(UUID ID, bool cv, bool isMod, bool mtd, bool eOrL) | ||||
|         { | ||||
|             agentID = ID; | ||||
|             enterOrLeave = eOrL; | ||||
|             isModerator = isMod; | ||||
|             mutedText = mtd; | ||||
|             canVoice = cv; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public interface IEventQueue | ||||
|     { | ||||
|         bool Enqueue(OSD o, UUID avatarID); | ||||
|         bool Enqueue(byte[] o, UUID avatarID); | ||||
| 
 | ||||
|         // These are required to decouple Scenes from EventQueueHelper | ||||
| //        void DisableSimulator(ulong handle, UUID avatarID); | ||||
|         //        void DisableSimulator(ulong handle, UUID avatarID); | ||||
|         void EnableSimulator(ulong handle, IPEndPoint endPoint, UUID avatarID, int regionSizeX, int regionSizeY); | ||||
|         void EstablishAgentCommunication(UUID avatarID, IPEndPoint endPoint, | ||||
|                                          string capsPath, ulong regionHandle, int regionSizeX, int regionSizeY); | ||||
|  | @ -56,16 +93,20 @@ namespace OpenSim.Region.Framework.Interfaces | |||
|                                 UUID fromAgent, string message, UUID toAgent, string fromName, byte dialog, | ||||
|                                 uint timeStamp, bool offline, int parentEstateID, Vector3 position, | ||||
|                                 uint ttl, UUID transactionID, bool fromGroup, byte[] binaryBucket); | ||||
|         void ChatterBoxSessionAgentListUpdates(UUID sessionID, UUID fromAgent, UUID anotherAgent, | ||||
|                                 bool canVoiceChat, bool isModerator, bool textMute, bool isEnterorLeave); | ||||
|         void ChatterBoxSessionStartReply(UUID sessionID, string sessionName, int type, | ||||
|                                 bool voiceEnabled, bool voiceModerated, UUID tmpSessionID, | ||||
|                                 bool sucess, string error, | ||||
|                                 UUID toAgent); | ||||
|         void ChatterBoxSessionAgentListUpdates(UUID sessionID, UUID toAgent, List<GroupChatListAgentUpdateData> updates); | ||||
|         void ChatterBoxForceClose(UUID toAgent, UUID sessionID, string reason); | ||||
|         //void ParcelProperties(ParcelPropertiesMessage parcelPropertiesMessage, UUID avatarID); | ||||
|         void GroupMembershipData(UUID receiverAgent, GroupMembershipData[] data); | ||||
|         void ScriptRunningEvent(UUID objectID, UUID itemID, bool running, UUID avatarID); | ||||
|         OSD BuildEvent(string eventName, OSD eventBody); | ||||
|         byte[] BuildEvent(string eventName, OSD eventBody); | ||||
|         void partPhysicsProperties(uint localID, byte physhapetype, float density, float friction, float bounce, float gravmod, UUID avatarID); | ||||
| 
 | ||||
|         void WindlightRefreshEvent(int interpolate, UUID avatarID); | ||||
|         StringBuilder StartEvent(string eventName); | ||||
|         string EndEvent(StringBuilder sb); | ||||
|         byte[] EndEventToBytes(StringBuilder sb); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -104,17 +104,25 @@ namespace OpenSim.Tests.Common | |||
|                 Events.Clear(); | ||||
|         } | ||||
| 
 | ||||
|         public bool Enqueue(OSD o, UUID avatarID) | ||||
|         public bool Enqueue(string o, UUID avatarID) | ||||
|         { | ||||
|             AddEvent(avatarID, "Enqueue", o); | ||||
|             return true; | ||||
|         } | ||||
| /* | ||||
|         public void DisableSimulator(ulong handle, UUID avatarID) | ||||
|         public bool Enqueue(byte[] o, UUID avatarID) | ||||
|         { | ||||
|             AddEvent(avatarID, "DisableSimulator", handle); | ||||
|             return true; | ||||
|         } | ||||
| */ | ||||
|         public bool Enqueue(OSD o, UUID avatarID) | ||||
|         { | ||||
|             return true; | ||||
|         } | ||||
|         /* | ||||
|                                 public void DisableSimulator(ulong handle, UUID avatarID) | ||||
|                                 { | ||||
|                                     AddEvent(avatarID, "DisableSimulator", handle); | ||||
|                                 } | ||||
|                         */ | ||||
|         public void EnableSimulator (ulong handle, IPEndPoint endPoint, UUID avatarID, int regionSizeX, int regionSizeY) | ||||
|         { | ||||
|             AddEvent(avatarID, "EnableSimulator", handle); | ||||
|  | @ -148,9 +156,19 @@ namespace OpenSim.Tests.Common | |||
|                 timeStamp, offline, parentEstateID, position, ttl, transactionID, fromGroup, binaryBucket); | ||||
|         } | ||||
| 
 | ||||
|         public void ChatterBoxSessionAgentListUpdates (UUID sessionID, UUID fromAgent, UUID toAgent, bool canVoiceChat, bool isModerator, bool textMute , bool isEnterorLeave) | ||||
|         public void ChatterBoxSessionStartReply(UUID sessionID, string sessionName, int type, | ||||
|                                 bool voiceEnabled, bool voiceModerated, UUID tmpSessionID, | ||||
|                                 bool sucess, string error, | ||||
|                                 UUID toAgent) | ||||
|         { | ||||
|             AddEvent(toAgent, "ChatterBoxSessionAgentListUpdates", sessionID, fromAgent, canVoiceChat, isModerator, textMute, isEnterorLeave); | ||||
|             AddEvent(toAgent, "ChatterBoxSessionStartReply", sessionID, sessionName, type, | ||||
|                                 voiceEnabled, voiceModerated, tmpSessionID, | ||||
|                                 sucess, error); | ||||
|         } | ||||
| 
 | ||||
|         public void ChatterBoxSessionAgentListUpdates (UUID sessionID, UUID toAgent, List<GroupChatListAgentUpdateData> updates) | ||||
|         { | ||||
|             AddEvent(toAgent, "ChatterBoxSessionAgentListUpdates", sessionID, toAgent, updates); | ||||
|         } | ||||
| 
 | ||||
|         public void ChatterBoxForceClose (UUID toAgent, UUID sessionID, string reason) | ||||
|  | @ -174,10 +192,10 @@ namespace OpenSim.Tests.Common | |||
|             throw new System.NotImplementedException (); | ||||
|         } | ||||
| 
 | ||||
|         public OSD BuildEvent(string eventName, OSD eventBody) | ||||
|         public byte[] BuildEvent(string eventName, OSD eventBody) | ||||
|         { | ||||
|             Console.WriteLine("TWO"); | ||||
|             throw new System.NotImplementedException (); | ||||
|             Console.WriteLine("TWOoo"); | ||||
|             throw new System.NotImplementedException(); | ||||
|         } | ||||
| 
 | ||||
|         public void partPhysicsProperties (uint localID, byte physhapetype, float density, float friction, float bounce, float gravmod, UUID avatarID) | ||||
|  | @ -185,6 +203,10 @@ namespace OpenSim.Tests.Common | |||
|             AddEvent(avatarID, "partPhysicsProperties", localID, physhapetype, density, friction, bounce, gravmod); | ||||
|         } | ||||
| 
 | ||||
|         public void WindlightRefreshEvent(int interpolate, UUID avatarID) | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public StringBuilder StartEvent(string eventName) | ||||
|         { | ||||
|             return null; | ||||
|  | @ -194,5 +216,9 @@ namespace OpenSim.Tests.Common | |||
|         { | ||||
|             return ""; | ||||
|         } | ||||
| } | ||||
|         public byte[] EndEventToBytes(StringBuilder sb) | ||||
|         { | ||||
|             return new byte[0]; | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	 UbitUmarov
						UbitUmarov