diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | 155 |
1 files changed, 115 insertions, 40 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 6e53951..16c0d25 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | |||
@@ -38,9 +38,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
38 | { | 38 | { |
39 | public partial class Scene | 39 | public partial class Scene |
40 | { | 40 | { |
41 | 41 | public void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, | |
42 | protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, | 42 | UUID fromID, bool fromAgent, bool broadcast, UUID destination) |
43 | UUID fromID, UUID targetID, bool fromAgent, bool broadcast) | ||
44 | { | 43 | { |
45 | OSChatMessage args = new OSChatMessage(); | 44 | OSChatMessage args = new OSChatMessage(); |
46 | 45 | ||
@@ -50,6 +49,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
50 | args.Position = fromPos; | 49 | args.Position = fromPos; |
51 | args.SenderUUID = fromID; | 50 | args.SenderUUID = fromID; |
52 | args.Scene = this; | 51 | args.Scene = this; |
52 | args.Destination = destination; | ||
53 | 53 | ||
54 | if (fromAgent) | 54 | if (fromAgent) |
55 | { | 55 | { |
@@ -64,18 +64,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
64 | } | 64 | } |
65 | 65 | ||
66 | args.From = fromName; | 66 | args.From = fromName; |
67 | args.TargetUUID = targetID; | 67 | //args. |
68 | 68 | ||
69 | if (broadcast) | 69 | if (broadcast) |
70 | EventManager.TriggerOnChatBroadcast(this, args); | 70 | EventManager.TriggerOnChatBroadcast(this, args); |
71 | else | 71 | else |
72 | EventManager.TriggerOnChatFromWorld(this, args); | 72 | EventManager.TriggerOnChatFromWorld(this, args); |
73 | } | 73 | } |
74 | 74 | ||
75 | protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, | 75 | protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, |
76 | UUID fromID, bool fromAgent, bool broadcast) | 76 | UUID fromID, bool fromAgent, bool broadcast) |
77 | { | 77 | { |
78 | SimChat(message, type, channel, fromPos, fromName, fromID, UUID.Zero, fromAgent, broadcast); | 78 | SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, broadcast, UUID.Zero); |
79 | } | 79 | } |
80 | 80 | ||
81 | /// <summary> | 81 | /// <summary> |
@@ -115,19 +115,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
115 | { | 115 | { |
116 | SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true); | 116 | SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true); |
117 | } | 117 | } |
118 | /// <summary> | ||
119 | /// | ||
120 | /// </summary> | ||
121 | /// <param name="message"></param> | ||
122 | /// <param name="type"></param> | ||
123 | /// <param name="fromPos"></param> | ||
124 | /// <param name="fromName"></param> | ||
125 | /// <param name="fromAgentID"></param> | ||
126 | /// <param name="targetID"></param> | ||
127 | public void SimChatToAgent(UUID targetID, byte[] message, Vector3 fromPos, string fromName, UUID fromID, bool fromAgent) | ||
128 | { | ||
129 | SimChat(message, ChatTypeEnum.Say, 0, fromPos, fromName, fromID, targetID, fromAgent, false); | ||
130 | } | ||
131 | 118 | ||
132 | /// <summary> | 119 | /// <summary> |
133 | /// Invoked when the client requests a prim. | 120 | /// Invoked when the client requests a prim. |
@@ -149,27 +136,47 @@ namespace OpenSim.Region.Framework.Scenes | |||
149 | /// <param name="remoteClient"></param> | 136 | /// <param name="remoteClient"></param> |
150 | public void SelectPrim(uint primLocalID, IClientAPI remoteClient) | 137 | public void SelectPrim(uint primLocalID, IClientAPI remoteClient) |
151 | { | 138 | { |
139 | /* | ||
140 | SceneObjectPart part = GetSceneObjectPart(primLocalID); | ||
141 | |||
142 | if (null == part) | ||
143 | return; | ||
144 | |||
145 | if (part.IsRoot) | ||
146 | { | ||
147 | SceneObjectGroup sog = part.ParentGroup; | ||
148 | sog.SendPropertiesToClient(remoteClient); | ||
149 | |||
150 | // A prim is only tainted if it's allowed to be edited by the person clicking it. | ||
151 | if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId) | ||
152 | || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId)) | ||
153 | { | ||
154 | sog.IsSelected = true; | ||
155 | EventManager.TriggerParcelPrimCountTainted(); | ||
156 | } | ||
157 | } | ||
158 | else | ||
159 | { | ||
160 | part.SendPropertiesToClient(remoteClient); | ||
161 | } | ||
162 | */ | ||
152 | SceneObjectPart part = GetSceneObjectPart(primLocalID); | 163 | SceneObjectPart part = GetSceneObjectPart(primLocalID); |
153 | 164 | ||
154 | if (null == part) | 165 | if (null == part) |
155 | return; | 166 | return; |
156 | 167 | ||
157 | if (part.IsRoot) | 168 | SceneObjectGroup sog = part.ParentGroup; |
158 | { | 169 | if (sog == null) |
159 | SceneObjectGroup sog = part.ParentGroup; | 170 | return; |
160 | sog.SendPropertiesToClient(remoteClient); | ||
161 | sog.IsSelected = true; | ||
162 | 171 | ||
163 | // A prim is only tainted if it's allowed to be edited by the person clicking it. | 172 | part.SendPropertiesToClient(remoteClient); |
164 | if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId) | 173 | |
165 | || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId)) | 174 | // A prim is only tainted if it's allowed to be edited by the person clicking it. |
166 | { | 175 | if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId) |
167 | EventManager.TriggerParcelPrimCountTainted(); | 176 | || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId)) |
168 | } | ||
169 | } | ||
170 | else | ||
171 | { | 177 | { |
172 | part.SendPropertiesToClient(remoteClient); | 178 | part.IsSelected = true; |
179 | EventManager.TriggerParcelPrimCountTainted(); | ||
173 | } | 180 | } |
174 | } | 181 | } |
175 | 182 | ||
@@ -222,7 +229,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
222 | SceneObjectPart part = GetSceneObjectPart(primLocalID); | 229 | SceneObjectPart part = GetSceneObjectPart(primLocalID); |
223 | if (part == null) | 230 | if (part == null) |
224 | return; | 231 | return; |
225 | 232 | /* | |
226 | // A deselect packet contains all the local prims being deselected. However, since selection is still | 233 | // A deselect packet contains all the local prims being deselected. However, since selection is still |
227 | // group based we only want the root prim to trigger a full update - otherwise on objects with many prims | 234 | // group based we only want the root prim to trigger a full update - otherwise on objects with many prims |
228 | // we end up sending many duplicate ObjectUpdates | 235 | // we end up sending many duplicate ObjectUpdates |
@@ -235,7 +242,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
235 | // handled by group, but by prim. Legacy cruft. | 242 | // handled by group, but by prim. Legacy cruft. |
236 | // TODO: Make selection flagging per prim! | 243 | // TODO: Make selection flagging per prim! |
237 | // | 244 | // |
238 | part.ParentGroup.IsSelected = false; | 245 | if (Permissions.CanEditObject(part.ParentGroup.UUID, remoteClient.AgentId) |
246 | || Permissions.CanMoveObject(part.ParentGroup.UUID, remoteClient.AgentId)) | ||
247 | part.ParentGroup.IsSelected = false; | ||
239 | 248 | ||
240 | if (part.ParentGroup.IsAttachment) | 249 | if (part.ParentGroup.IsAttachment) |
241 | isAttachment = true; | 250 | isAttachment = true; |
@@ -255,6 +264,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
255 | part.UUID, remoteClient.AgentId)) | 264 | part.UUID, remoteClient.AgentId)) |
256 | EventManager.TriggerParcelPrimCountTainted(); | 265 | EventManager.TriggerParcelPrimCountTainted(); |
257 | } | 266 | } |
267 | */ | ||
268 | |||
269 | bool oldgprSelect = part.ParentGroup.IsSelected; | ||
270 | |||
271 | // This is wrong, wrong, wrong. Selection should not be | ||
272 | // handled by group, but by prim. Legacy cruft. | ||
273 | // TODO: Make selection flagging per prim! | ||
274 | // | ||
275 | if (Permissions.CanEditObject(part.ParentGroup.UUID, remoteClient.AgentId) | ||
276 | || Permissions.CanMoveObject(part.ParentGroup.UUID, remoteClient.AgentId)) | ||
277 | { | ||
278 | part.IsSelected = false; | ||
279 | if (!part.ParentGroup.IsAttachment && oldgprSelect != part.ParentGroup.IsSelected) | ||
280 | EventManager.TriggerParcelPrimCountTainted(); | ||
281 | } | ||
282 | |||
258 | } | 283 | } |
259 | 284 | ||
260 | public virtual void ProcessMoneyTransferRequest(UUID source, UUID destination, int amount, | 285 | public virtual void ProcessMoneyTransferRequest(UUID source, UUID destination, int amount, |
@@ -397,6 +422,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
397 | ); | 422 | ); |
398 | } | 423 | } |
399 | 424 | ||
425 | private class DescendentsRequestData | ||
426 | { | ||
427 | public IClientAPI RemoteClient; | ||
428 | public UUID FolderID; | ||
429 | public UUID OwnerID; | ||
430 | public bool FetchFolders; | ||
431 | public bool FetchItems; | ||
432 | public int SortOrder; | ||
433 | } | ||
434 | |||
435 | private Queue<DescendentsRequestData> m_descendentsRequestQueue = new Queue<DescendentsRequestData>(); | ||
436 | private Object m_descendentsRequestLock = new Object(); | ||
437 | private bool m_descendentsRequestProcessing = false; | ||
438 | |||
400 | /// <summary> | 439 | /// <summary> |
401 | /// Tell the client about the various child items and folders contained in the requested folder. | 440 | /// Tell the client about the various child items and folders contained in the requested folder. |
402 | /// </summary> | 441 | /// </summary> |
@@ -433,17 +472,38 @@ namespace OpenSim.Region.Framework.Scenes | |||
433 | } | 472 | } |
434 | } | 473 | } |
435 | 474 | ||
436 | // We're going to send the reply async, because there may be | 475 | lock (m_descendentsRequestLock) |
437 | // an enormous quantity of packets -- basically the entire inventory! | 476 | { |
438 | // We don't want to block the client thread while all that is happening. | 477 | if (!m_descendentsRequestProcessing) |
439 | SendInventoryDelegate d = SendInventoryAsync; | 478 | { |
440 | d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d); | 479 | m_descendentsRequestProcessing = true; |
480 | |||
481 | // We're going to send the reply async, because there may be | ||
482 | // an enormous quantity of packets -- basically the entire inventory! | ||
483 | // We don't want to block the client thread while all that is happening. | ||
484 | SendInventoryDelegate d = SendInventoryAsync; | ||
485 | d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d); | ||
486 | |||
487 | return; | ||
488 | } | ||
489 | |||
490 | DescendentsRequestData req = new DescendentsRequestData(); | ||
491 | req.RemoteClient = remoteClient; | ||
492 | req.FolderID = folderID; | ||
493 | req.OwnerID = ownerID; | ||
494 | req.FetchFolders = fetchFolders; | ||
495 | req.FetchItems = fetchItems; | ||
496 | req.SortOrder = sortOrder; | ||
497 | |||
498 | m_descendentsRequestQueue.Enqueue(req); | ||
499 | } | ||
441 | } | 500 | } |
442 | 501 | ||
443 | delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder); | 502 | delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder); |
444 | 503 | ||
445 | void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder) | 504 | void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder) |
446 | { | 505 | { |
506 | Thread.Sleep(20); | ||
447 | SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems); | 507 | SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems); |
448 | } | 508 | } |
449 | 509 | ||
@@ -451,6 +511,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
451 | { | 511 | { |
452 | SendInventoryDelegate d = (SendInventoryDelegate)iar.AsyncState; | 512 | SendInventoryDelegate d = (SendInventoryDelegate)iar.AsyncState; |
453 | d.EndInvoke(iar); | 513 | d.EndInvoke(iar); |
514 | |||
515 | lock (m_descendentsRequestLock) | ||
516 | { | ||
517 | if (m_descendentsRequestQueue.Count > 0) | ||
518 | { | ||
519 | DescendentsRequestData req = m_descendentsRequestQueue.Dequeue(); | ||
520 | |||
521 | d = SendInventoryAsync; | ||
522 | d.BeginInvoke(req.RemoteClient, req.FolderID, req.OwnerID, req.FetchFolders, req.FetchItems, req.SortOrder, SendInventoryComplete, d); | ||
523 | |||
524 | return; | ||
525 | } | ||
526 | |||
527 | m_descendentsRequestProcessing = false; | ||
528 | } | ||
454 | } | 529 | } |
455 | 530 | ||
456 | /// <summary> | 531 | /// <summary> |