diff options
author | Teravus Ovares | 2008-08-25 07:35:17 +0000 |
---|---|---|
committer | Teravus Ovares | 2008-08-25 07:35:17 +0000 |
commit | 2912aafe259727351eb9405532e45aa3501b7e9a (patch) | |
tree | 34774a49306ae19a6682580d41927fcfb222ea6e /OpenSim/Region/ClientStack | |
parent | Mantis#2043. Thank you kindly, Ralphos for a patch that addresses: (diff) | |
download | opensim-SC-2912aafe259727351eb9405532e45aa3501b7e9a.zip opensim-SC-2912aafe259727351eb9405532e45aa3501b7e9a.tar.gz opensim-SC-2912aafe259727351eb9405532e45aa3501b7e9a.tar.bz2 opensim-SC-2912aafe259727351eb9405532e45aa3501b7e9a.tar.xz |
* This commit incorporates the heart of the OpenGridProtocol patch that is currently on Forge in a nice, friendly modular format.
* There are a lot of changes and this is quite experimental. It's off by default, but you can turn it on by examining the bottom of the opensim.ini.example for the proper OpenSim.ini settings. Remember, you still need an agent domain..
* Furthermore, it isn't quite right when it comes to teleporting to remote regions (place_avatar)
Diffstat (limited to 'OpenSim/Region/ClientStack')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/KillPacket.cs | 42 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 48 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs | 6 |
3 files changed, 86 insertions, 10 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/KillPacket.cs b/OpenSim/Region/ClientStack/LindenUDP/KillPacket.cs new file mode 100644 index 0000000..dfdabc8 --- /dev/null +++ b/OpenSim/Region/ClientStack/LindenUDP/KillPacket.cs | |||
@@ -0,0 +1,42 @@ | |||
1 | using System; | ||
2 | using System.Collections.Generic; | ||
3 | using System.Text; | ||
4 | using libsecondlife.Packets; | ||
5 | |||
6 | namespace OpenSim.Region.ClientStack.LindenUDP | ||
7 | { | ||
8 | class KillPacket : Packet | ||
9 | { | ||
10 | private Header header; | ||
11 | public override void FromBytes(Header header, byte[] bytes, ref int i, ref int packetEnd, byte[] zeroBuffer) | ||
12 | { | ||
13 | |||
14 | } | ||
15 | |||
16 | public override void FromBytes(byte[] bytes, ref int i, ref int packetEnd, byte[] zeroBuffer) | ||
17 | { | ||
18 | |||
19 | } | ||
20 | |||
21 | public override Header Header { get { return header; } set { header = value; }} | ||
22 | |||
23 | public override byte[] ToBytes() | ||
24 | { | ||
25 | return new byte[0]; | ||
26 | } | ||
27 | public KillPacket() | ||
28 | { | ||
29 | Header = new LowHeader(); | ||
30 | Header.ID = 65531; | ||
31 | Header.Reliable = true; | ||
32 | } | ||
33 | |||
34 | public override PacketType Type | ||
35 | { | ||
36 | get | ||
37 | { | ||
38 | return PacketType.UseCircuitCode; | ||
39 | } | ||
40 | } | ||
41 | } | ||
42 | } | ||
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 7c531f3..8214045 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -92,6 +92,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
92 | 92 | ||
93 | private Dictionary<string, LLUUID> m_defaultAnimations = new Dictionary<string, LLUUID>(); | 93 | private Dictionary<string, LLUUID> m_defaultAnimations = new Dictionary<string, LLUUID>(); |
94 | 94 | ||
95 | private bool m_SendLogoutPacketWhenClosing = true; | ||
96 | |||
95 | /* protected variables */ | 97 | /* protected variables */ |
96 | 98 | ||
97 | protected static Dictionary<PacketType, PacketMethod> PacketHandlers = | 99 | protected static Dictionary<PacketType, PacketMethod> PacketHandlers = |
@@ -368,6 +370,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
368 | set { m_IsActive = value; } | 370 | set { m_IsActive = value; } |
369 | } | 371 | } |
370 | 372 | ||
373 | public bool SendLogoutPacketWhenClosing | ||
374 | { | ||
375 | set { m_SendLogoutPacketWhenClosing = value; } | ||
376 | } | ||
377 | |||
371 | /* METHODS */ | 378 | /* METHODS */ |
372 | 379 | ||
373 | public LLClientView(EndPoint remoteEP, IScene scene, AssetCache assetCache, LLPacketServer packServer, | 380 | public LLClientView(EndPoint remoteEP, IScene scene, AssetCache assetCache, LLPacketServer packServer, |
@@ -451,7 +458,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
451 | if (!(shutdownCircuit)) | 458 | if (!(shutdownCircuit)) |
452 | { | 459 | { |
453 | GC.Collect(); | 460 | GC.Collect(); |
454 | m_clientThread.Abort(); | 461 | |
462 | // Sends a KillPacket object, with which, the | ||
463 | // blockingqueue dequeues and sees it's a killpacket | ||
464 | // and terminates within the context of the client thread. | ||
465 | // This ensures that it's done from within the context | ||
466 | // of the client thread regardless of where Close() is called. | ||
467 | KillEndDone(); | ||
455 | } | 468 | } |
456 | } | 469 | } |
457 | 470 | ||
@@ -752,7 +765,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
752 | ClientLoop(); | 765 | ClientLoop(); |
753 | } | 766 | } |
754 | } | 767 | } |
755 | catch (Exception e) | 768 | catch (System.Exception e) |
756 | { | 769 | { |
757 | if (e is ThreadAbortException) | 770 | if (e is ThreadAbortException) |
758 | throw e; | 771 | throw e; |
@@ -3740,6 +3753,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3740 | m_PacketHandler.InPacket((Packet) NewPack); | 3753 | m_PacketHandler.InPacket((Packet) NewPack); |
3741 | } | 3754 | } |
3742 | 3755 | ||
3756 | |||
3743 | /// <summary> | 3757 | /// <summary> |
3744 | /// The dreaded OutPacket. This should only be called from within | 3758 | /// The dreaded OutPacket. This should only be called from within |
3745 | /// the ClientStack itself right now | 3759 | /// the ClientStack itself right now |
@@ -6093,15 +6107,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
6093 | 6107 | ||
6094 | public void SendLogoutPacket() | 6108 | public void SendLogoutPacket() |
6095 | { | 6109 | { |
6096 | LogoutReplyPacket logReply = (LogoutReplyPacket)PacketPool.Instance.GetPacket(PacketType.LogoutReply); | 6110 | // I know this is a bit of a hack, however there are times when you don't |
6097 | // TODO: don't create new blocks if recycling an old packet | 6111 | // want to send this, but still need to do the rest of the shutdown process |
6098 | logReply.AgentData.AgentID = AgentId; | 6112 | // this method gets called from the packet server.. which makes it practically |
6099 | logReply.AgentData.SessionID = SessionId; | 6113 | // impossible to do any other way. |
6100 | logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1]; | ||
6101 | logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock(); | ||
6102 | logReply.InventoryData[0].ItemID = LLUUID.Zero; | ||
6103 | 6114 | ||
6104 | OutPacket(logReply, ThrottleOutPacketType.Task); | 6115 | if (m_SendLogoutPacketWhenClosing) |
6116 | { | ||
6117 | LogoutReplyPacket logReply = (LogoutReplyPacket)PacketPool.Instance.GetPacket(PacketType.LogoutReply); | ||
6118 | // TODO: don't create new blocks if recycling an old packet | ||
6119 | logReply.AgentData.AgentID = AgentId; | ||
6120 | logReply.AgentData.SessionID = SessionId; | ||
6121 | logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1]; | ||
6122 | logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock(); | ||
6123 | logReply.InventoryData[0].ItemID = LLUUID.Zero; | ||
6124 | |||
6125 | OutPacket(logReply, ThrottleOutPacketType.Task); | ||
6126 | } | ||
6105 | } | 6127 | } |
6106 | 6128 | ||
6107 | public void SendHealth(float health) | 6129 | public void SendHealth(float health) |
@@ -6443,5 +6465,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
6443 | 6465 | ||
6444 | OutPacket(reply, ThrottleOutPacketType.Land); | 6466 | OutPacket(reply, ThrottleOutPacketType.Land); |
6445 | } | 6467 | } |
6468 | |||
6469 | public void KillEndDone() | ||
6470 | { | ||
6471 | KillPacket kp = new KillPacket(); | ||
6472 | OutPacket(kp, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority); | ||
6473 | } | ||
6446 | } | 6474 | } |
6447 | } | 6475 | } |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs b/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs index 209ec36..830074a 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs | |||
@@ -30,6 +30,7 @@ using System.Collections; | |||
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Net; | 31 | using System.Net; |
32 | using System.Net.Sockets; | 32 | using System.Net.Sockets; |
33 | using System.Threading; | ||
33 | using System.Timers; | 34 | using System.Timers; |
34 | using System.Reflection; | 35 | using System.Reflection; |
35 | using libsecondlife; | 36 | using libsecondlife; |
@@ -233,6 +234,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
233 | // to. Packet drop notifies will not be triggered in this | 234 | // to. Packet drop notifies will not be triggered in this |
234 | // configuration! | 235 | // configuration! |
235 | // | 236 | // |
237 | |||
236 | if ((m_SynchronizeClient != null) && (!m_Client.IsActive)) | 238 | if ((m_SynchronizeClient != null) && (!m_Client.IsActive)) |
237 | { | 239 | { |
238 | if (m_SynchronizeClient(m_Client.Scene, packet, | 240 | if (m_SynchronizeClient(m_Client.Scene, packet, |
@@ -744,6 +746,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
744 | } | 746 | } |
745 | } | 747 | } |
746 | 748 | ||
749 | // If we sent a killpacket | ||
750 | if (packet is KillPacket) | ||
751 | Thread.CurrentThread.Abort(); | ||
752 | |||
747 | // Actually make the byte array and send it | 753 | // Actually make the byte array and send it |
748 | byte[] sendbuffer = packet.ToBytes(); | 754 | byte[] sendbuffer = packet.ToBytes(); |
749 | 755 | ||