aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs150
1 files changed, 113 insertions, 37 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
index df43271..ce6415a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -50,7 +50,7 @@ namespace OpenSim.Region.Framework.Scenes
50 /// <param name='targetID'></param> 50 /// <param name='targetID'></param>
51 /// <param name='fromAgent'></param> 51 /// <param name='fromAgent'></param>
52 /// <param name='broadcast'></param> 52 /// <param name='broadcast'></param>
53 protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, 53 public void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName,
54 UUID fromID, UUID targetID, bool fromAgent, bool broadcast) 54 UUID fromID, UUID targetID, bool fromAgent, bool broadcast)
55 { 55 {
56 OSChatMessage args = new OSChatMessage(); 56 OSChatMessage args = new OSChatMessage();
@@ -61,6 +61,7 @@ namespace OpenSim.Region.Framework.Scenes
61 args.Position = fromPos; 61 args.Position = fromPos;
62 args.SenderUUID = fromID; 62 args.SenderUUID = fromID;
63 args.Scene = this; 63 args.Scene = this;
64 args.Destination = targetID;
64 65
65 if (fromAgent) 66 if (fromAgent)
66 { 67 {
@@ -75,7 +76,7 @@ namespace OpenSim.Region.Framework.Scenes
75 } 76 }
76 77
77 args.From = fromName; 78 args.From = fromName;
78 args.TargetUUID = targetID; 79 //args.
79 80
80// m_log.DebugFormat( 81// m_log.DebugFormat(
81// "[SCENE]: Sending message {0} on channel {1}, type {2} from {3}, broadcast {4}", 82// "[SCENE]: Sending message {0} on channel {1}, type {2} from {3}, broadcast {4}",
@@ -86,7 +87,7 @@ namespace OpenSim.Region.Framework.Scenes
86 else 87 else
87 EventManager.TriggerOnChatFromWorld(this, args); 88 EventManager.TriggerOnChatFromWorld(this, args);
88 } 89 }
89 90
90 protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, 91 protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName,
91 UUID fromID, bool fromAgent, bool broadcast) 92 UUID fromID, bool fromAgent, bool broadcast)
92 { 93 {
@@ -130,19 +131,6 @@ namespace OpenSim.Region.Framework.Scenes
130 { 131 {
131 SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true); 132 SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true);
132 } 133 }
133 /// <summary>
134 ///
135 /// </summary>
136 /// <param name="message"></param>
137 /// <param name="type"></param>
138 /// <param name="fromPos"></param>
139 /// <param name="fromName"></param>
140 /// <param name="fromAgentID"></param>
141 /// <param name="targetID"></param>
142 public void SimChatToAgent(UUID targetID, byte[] message, Vector3 fromPos, string fromName, UUID fromID, bool fromAgent)
143 {
144 SimChat(message, ChatTypeEnum.Say, 0, fromPos, fromName, fromID, targetID, fromAgent, false);
145 }
146 134
147 /// <summary> 135 /// <summary>
148 /// Invoked when the client requests a prim. 136 /// Invoked when the client requests a prim.
@@ -164,27 +152,47 @@ namespace OpenSim.Region.Framework.Scenes
164 /// <param name="remoteClient"></param> 152 /// <param name="remoteClient"></param>
165 public void SelectPrim(uint primLocalID, IClientAPI remoteClient) 153 public void SelectPrim(uint primLocalID, IClientAPI remoteClient)
166 { 154 {
155 /*
156 SceneObjectPart part = GetSceneObjectPart(primLocalID);
157
158 if (null == part)
159 return;
160
161 if (part.IsRoot)
162 {
163 SceneObjectGroup sog = part.ParentGroup;
164 sog.SendPropertiesToClient(remoteClient);
165
166 // A prim is only tainted if it's allowed to be edited by the person clicking it.
167 if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId)
168 || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId))
169 {
170 sog.IsSelected = true;
171 EventManager.TriggerParcelPrimCountTainted();
172 }
173 }
174 else
175 {
176 part.SendPropertiesToClient(remoteClient);
177 }
178 */
167 SceneObjectPart part = GetSceneObjectPart(primLocalID); 179 SceneObjectPart part = GetSceneObjectPart(primLocalID);
168 180
169 if (null == part) 181 if (null == part)
170 return; 182 return;
171 183
172 if (part.IsRoot) 184 SceneObjectGroup sog = part.ParentGroup;
173 { 185 if (sog == null)
174 SceneObjectGroup sog = part.ParentGroup; 186 return;
175 sog.SendPropertiesToClient(remoteClient);
176 sog.IsSelected = true;
177 187
178 // A prim is only tainted if it's allowed to be edited by the person clicking it. 188 part.SendPropertiesToClient(remoteClient);
179 if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId) 189
180 || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId)) 190 // A prim is only tainted if it's allowed to be edited by the person clicking it.
181 { 191 if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId)
182 EventManager.TriggerParcelPrimCountTainted(); 192 || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId))
183 }
184 }
185 else
186 { 193 {
187 part.SendPropertiesToClient(remoteClient); 194 part.IsSelected = true;
195 EventManager.TriggerParcelPrimCountTainted();
188 } 196 }
189 } 197 }
190 198
@@ -237,7 +245,7 @@ namespace OpenSim.Region.Framework.Scenes
237 SceneObjectPart part = GetSceneObjectPart(primLocalID); 245 SceneObjectPart part = GetSceneObjectPart(primLocalID);
238 if (part == null) 246 if (part == null)
239 return; 247 return;
240 248 /*
241 // A deselect packet contains all the local prims being deselected. However, since selection is still 249 // A deselect packet contains all the local prims being deselected. However, since selection is still
242 // group based we only want the root prim to trigger a full update - otherwise on objects with many prims 250 // group based we only want the root prim to trigger a full update - otherwise on objects with many prims
243 // we end up sending many duplicate ObjectUpdates 251 // we end up sending many duplicate ObjectUpdates
@@ -250,7 +258,9 @@ namespace OpenSim.Region.Framework.Scenes
250 // handled by group, but by prim. Legacy cruft. 258 // handled by group, but by prim. Legacy cruft.
251 // TODO: Make selection flagging per prim! 259 // TODO: Make selection flagging per prim!
252 // 260 //
253 part.ParentGroup.IsSelected = false; 261 if (Permissions.CanEditObject(part.ParentGroup.UUID, remoteClient.AgentId)
262 || Permissions.CanMoveObject(part.ParentGroup.UUID, remoteClient.AgentId))
263 part.ParentGroup.IsSelected = false;
254 264
255 if (part.ParentGroup.IsAttachment) 265 if (part.ParentGroup.IsAttachment)
256 isAttachment = true; 266 isAttachment = true;
@@ -270,6 +280,22 @@ namespace OpenSim.Region.Framework.Scenes
270 part.UUID, remoteClient.AgentId)) 280 part.UUID, remoteClient.AgentId))
271 EventManager.TriggerParcelPrimCountTainted(); 281 EventManager.TriggerParcelPrimCountTainted();
272 } 282 }
283 */
284
285 bool oldgprSelect = part.ParentGroup.IsSelected;
286
287 // This is wrong, wrong, wrong. Selection should not be
288 // handled by group, but by prim. Legacy cruft.
289 // TODO: Make selection flagging per prim!
290 //
291 if (Permissions.CanEditObject(part.ParentGroup.UUID, remoteClient.AgentId)
292 || Permissions.CanMoveObject(part.ParentGroup.UUID, remoteClient.AgentId))
293 {
294 part.IsSelected = false;
295 if (!part.ParentGroup.IsAttachment && oldgprSelect != part.ParentGroup.IsSelected)
296 EventManager.TriggerParcelPrimCountTainted();
297 }
298
273 } 299 }
274 300
275 public virtual void ProcessMoneyTransferRequest(UUID source, UUID destination, int amount, 301 public virtual void ProcessMoneyTransferRequest(UUID source, UUID destination, int amount,
@@ -412,6 +438,20 @@ namespace OpenSim.Region.Framework.Scenes
412 ); 438 );
413 } 439 }
414 440
441 private class DescendentsRequestData
442 {
443 public IClientAPI RemoteClient;
444 public UUID FolderID;
445 public UUID OwnerID;
446 public bool FetchFolders;
447 public bool FetchItems;
448 public int SortOrder;
449 }
450
451 private Queue<DescendentsRequestData> m_descendentsRequestQueue = new Queue<DescendentsRequestData>();
452 private Object m_descendentsRequestLock = new Object();
453 private bool m_descendentsRequestProcessing = false;
454
415 /// <summary> 455 /// <summary>
416 /// Tell the client about the various child items and folders contained in the requested folder. 456 /// Tell the client about the various child items and folders contained in the requested folder.
417 /// </summary> 457 /// </summary>
@@ -448,17 +488,38 @@ namespace OpenSim.Region.Framework.Scenes
448 } 488 }
449 } 489 }
450 490
451 // We're going to send the reply async, because there may be 491 lock (m_descendentsRequestLock)
452 // an enormous quantity of packets -- basically the entire inventory! 492 {
453 // We don't want to block the client thread while all that is happening. 493 if (!m_descendentsRequestProcessing)
454 SendInventoryDelegate d = SendInventoryAsync; 494 {
455 d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d); 495 m_descendentsRequestProcessing = true;
496
497 // We're going to send the reply async, because there may be
498 // an enormous quantity of packets -- basically the entire inventory!
499 // We don't want to block the client thread while all that is happening.
500 SendInventoryDelegate d = SendInventoryAsync;
501 d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d);
502
503 return;
504 }
505
506 DescendentsRequestData req = new DescendentsRequestData();
507 req.RemoteClient = remoteClient;
508 req.FolderID = folderID;
509 req.OwnerID = ownerID;
510 req.FetchFolders = fetchFolders;
511 req.FetchItems = fetchItems;
512 req.SortOrder = sortOrder;
513
514 m_descendentsRequestQueue.Enqueue(req);
515 }
456 } 516 }
457 517
458 delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder); 518 delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder);
459 519
460 void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder) 520 void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder)
461 { 521 {
522 Thread.Sleep(20);
462 SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems); 523 SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems);
463 } 524 }
464 525
@@ -466,6 +527,21 @@ namespace OpenSim.Region.Framework.Scenes
466 { 527 {
467 SendInventoryDelegate d = (SendInventoryDelegate)iar.AsyncState; 528 SendInventoryDelegate d = (SendInventoryDelegate)iar.AsyncState;
468 d.EndInvoke(iar); 529 d.EndInvoke(iar);
530
531 lock (m_descendentsRequestLock)
532 {
533 if (m_descendentsRequestQueue.Count > 0)
534 {
535 DescendentsRequestData req = m_descendentsRequestQueue.Dequeue();
536
537 d = SendInventoryAsync;
538 d.BeginInvoke(req.RemoteClient, req.FolderID, req.OwnerID, req.FetchFolders, req.FetchItems, req.SortOrder, SendInventoryComplete, d);
539
540 return;
541 }
542
543 m_descendentsRequestProcessing = false;
544 }
469 } 545 }
470 546
471 /// <summary> 547 /// <summary>