From 70d9cec3b5064d874f8b9622804c964beeac5f0d Mon Sep 17 00:00:00 2001 From: lbsa71 Date: Tue, 18 Sep 2007 13:29:16 +0000 Subject: * Yet some more connectivity restructuring * We now have CloseAllAgents( circuit ) and CloseAllCircuits( agentId ) for great justice ( but alas, still only closing on one single scene - be brave! ) * Login and ConnectionClosed now eventified and moveified awayified * Killed off unused NullClientAPI * Now the client is almost only responsible for its own closing. ( I will get that scene out of there ) * Lookin' good! --- OpenSim/Region/ClientStack/ClientView.API.cs | 4 ++- .../ClientStack/ClientView.PacketHandlers.cs | 17 +++------ .../Region/ClientStack/ClientView.PacketQueue.cs | 12 +++++-- OpenSim/Region/ClientStack/ClientView.cs | 14 ++++---- OpenSim/Region/ClientStack/PacketServer.cs | 41 +++++++++++++++------- OpenSim/Region/ClientStack/UDPServer.cs | 16 +++++---- 6 files changed, 61 insertions(+), 43 deletions(-) (limited to 'OpenSim/Region/ClientStack') diff --git a/OpenSim/Region/ClientStack/ClientView.API.cs b/OpenSim/Region/ClientStack/ClientView.API.cs index a15a964..253807c 100644 --- a/OpenSim/Region/ClientStack/ClientView.API.cs +++ b/OpenSim/Region/ClientStack/ClientView.API.cs @@ -42,6 +42,8 @@ namespace OpenSim.Region.ClientStack { partial class ClientView { + public event Action OnLogout; + public event Action OnConnectionClosed; public event ViewerEffectEventHandler OnViewerEffect; public event ImprovedInstantMessage OnInstantMessage; public event ChatFromViewer OnChatFromViewer; @@ -373,7 +375,7 @@ namespace OpenSim.Region.ClientStack agentData.AgentID = this.AgentId; agentData.SessionID = this.m_sessionId; agentData.SecureSessionID = this.SecureSessionID; - agentData.circuitcode = this.CircuitCode; + agentData.circuitcode = this.m_circuitCode; agentData.child = false; agentData.firstname = this.firstName; agentData.lastname = this.lastName; diff --git a/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs b/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs index 65ad431..643b158 100644 --- a/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs +++ b/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs @@ -56,19 +56,12 @@ namespace OpenSim.Region.ClientStack protected virtual bool Logout(IClientAPI client, Packet packet) { - // TODO: Refactor out this into an OnLogout so the ClientManager can close all clients. - MainLog.Instance.Verbose("OpenSimClient.cs:ProcessInPacket() - Got a logout request"); - //send reply to let the client logout - LogoutReplyPacket logReply = new LogoutReplyPacket(); - logReply.AgentData.AgentID = this.AgentId; - logReply.AgentData.SessionID = this.m_sessionId; - logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1]; - logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock(); - logReply.InventoryData[0].ItemID = LLUUID.Zero; - OutPacket(logReply); - // - this.Close(); + + if( OnLogout != null ) + { + OnLogout(client); + } return true; } diff --git a/OpenSim/Region/ClientStack/ClientView.PacketQueue.cs b/OpenSim/Region/ClientStack/ClientView.PacketQueue.cs index 05c2869..bfcb19f 100644 --- a/OpenSim/Region/ClientStack/ClientView.PacketQueue.cs +++ b/OpenSim/Region/ClientStack/ClientView.PacketQueue.cs @@ -51,11 +51,17 @@ namespace OpenSim.Region.ClientStack protected const int RESEND_TIMEOUT = 4000; protected const int MAX_SEQUENCE = 0xFFFFFF; - public uint CircuitCode; + private uint m_circuitCode; public EndPoint userEP; protected PacketServer m_networkServer; + public uint CircuitCode + { + get { return m_circuitCode; } + set { m_circuitCode = value; } + } + protected virtual void ProcessOutPacket(Packet Pack) { // Keep track of when this packet was sent out @@ -142,11 +148,11 @@ namespace OpenSim.Region.ClientStack if (Pack.Header.Zerocoded) { int packetsize = Helpers.ZeroEncode(sendbuffer, sendbuffer.Length, ZeroOutBuffer); - m_networkServer.SendPacketTo(ZeroOutBuffer, packetsize, SocketFlags.None, CircuitCode);//userEP); + m_networkServer.SendPacketTo(ZeroOutBuffer, packetsize, SocketFlags.None, m_circuitCode);//userEP); } else { - m_networkServer.SendPacketTo(sendbuffer, sendbuffer.Length, SocketFlags.None, CircuitCode); //userEP); + m_networkServer.SendPacketTo(sendbuffer, sendbuffer.Length, SocketFlags.None, m_circuitCode); //userEP); } } catch (Exception) diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs index f8ac1d8..2341b7b 100644 --- a/OpenSim/Region/ClientStack/ClientView.cs +++ b/OpenSim/Region/ClientStack/ClientView.cs @@ -133,8 +133,6 @@ namespace OpenSim.Region.ClientStack m_scene.RemoveClient(this.AgentId); - m_clientManager.Remove(this.CircuitCode); // TODO: Move out and delete ref to clientmanager. - m_networkServer.RemoveClientCircuit(this.CircuitCode); this.ClientThread.Abort(); } @@ -215,7 +213,7 @@ namespace OpenSim.Region.ClientStack } else { info = packet.Type.ToString(); } - Console.WriteLine(CircuitCode + ":" + direction + ": " + info); + Console.WriteLine(m_circuitCode + ":" + direction + ": " + info); } } @@ -252,8 +250,10 @@ namespace OpenSim.Region.ClientStack probesWithNoIngressPackets++; if (probesWithNoIngressPackets > 30) { - // Refactor out this into an OnConnectionClosed so the ClientManager can clean up - this.Close(); + if( OnConnectionClosed != null ) + { + OnConnectionClosed(this); + } } else { @@ -283,7 +283,7 @@ namespace OpenSim.Region.ClientStack protected virtual void AuthUser() { - // AuthenticateResponse sessionInfo = m_gridServer.AuthenticateSession(cirpack.CircuitCode.m_sessionId, cirpack.CircuitCode.ID, cirpack.CircuitCode.Code); + // AuthenticateResponse sessionInfo = m_gridServer.AuthenticateSession(cirpack.m_circuitCode.m_sessionId, cirpack.m_circuitCode.ID, cirpack.m_circuitCode.Code); AuthenticateResponse sessionInfo = this.m_authenticateSessionsHandler.AuthenticateSession(cirpack.CircuitCode.SessionID, cirpack.CircuitCode.ID, cirpack.CircuitCode.Code); if (!sessionInfo.Authorised) { @@ -297,7 +297,7 @@ namespace OpenSim.Region.ClientStack //session is authorised m_agentId = cirpack.CircuitCode.ID; this.m_sessionId = cirpack.CircuitCode.SessionID; - this.CircuitCode = cirpack.CircuitCode.Code; + this.m_circuitCode = cirpack.CircuitCode.Code; this.firstName = sessionInfo.LoginInfo.First; this.lastName = sessionInfo.LoginInfo.Last; diff --git a/OpenSim/Region/ClientStack/PacketServer.cs b/OpenSim/Region/ClientStack/PacketServer.cs index bceeeb3..28f25bd 100644 --- a/OpenSim/Region/ClientStack/PacketServer.cs +++ b/OpenSim/Region/ClientStack/PacketServer.cs @@ -33,14 +33,15 @@ using OpenSim.Framework; using OpenSim.Framework.Types; using OpenSim.Framework.Interfaces; using OpenSim.Framework.Communications.Caches; +using libsecondlife; namespace OpenSim.Region.ClientStack { public class PacketServer { - private ClientStackNetworkHandler _networkHandler; + private ClientStackNetworkHandler m_networkHandler; private IScene _localScene; - private ClientManager m_clientManager = new ClientManager(); + private readonly ClientManager m_clientManager = new ClientManager(); public ClientManager ClientManager { get { return m_clientManager; } @@ -48,8 +49,8 @@ namespace OpenSim.Region.ClientStack public PacketServer(ClientStackNetworkHandler networkHandler) { - _networkHandler = networkHandler; - _networkHandler.RegisterPacketServer(this); + m_networkHandler = networkHandler; + m_networkHandler.RegisterPacketServer(this); } public IScene LocalScene @@ -70,11 +71,6 @@ namespace OpenSim.Region.ClientStack m_clientManager.InPacket(circuitCode, packet); } - public virtual void ConnectionClosed(uint circuitCode) - { - m_clientManager.ConnectionClosed(circuitCode); - } - /// /// /// @@ -145,10 +141,24 @@ namespace OpenSim.Region.ClientStack this.m_clientManager.Add(useCircuit.CircuitCode.Code, newuser); newuser.OnViewerEffect += m_clientManager.ViewerEffectHandler; + newuser.OnLogout += LogoutHandler; + newuser.OnConnectionClosed += CloseClient; return true; } + public void LogoutHandler(IClientAPI client) + { + LogoutReplyPacket logReply = new LogoutReplyPacket(); + logReply.AgentData.AgentID = client.AgentId; + logReply.AgentData.SessionID = client.SessionId; + logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1]; + logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock(); + logReply.InventoryData[0].ItemID = LLUUID.Zero; + client.OutPacket(logReply); + + CloseClient( client ); + } /// @@ -160,17 +170,22 @@ namespace OpenSim.Region.ClientStack /// public virtual void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode) { - this._networkHandler.SendPacketTo(buffer, size, flags, circuitcode); + this.m_networkHandler.SendPacketTo(buffer, size, flags, circuitcode); } /// /// /// /// - public virtual void RemoveClientCircuit(uint circuitcode) + public virtual void CloseCircuit(uint circuitcode) + { + m_networkHandler.RemoveClientCircuit( circuitcode ); + m_clientManager.CloseAllAgents( circuitcode ); + } + + public virtual void CloseClient( IClientAPI client ) { - this._networkHandler.RemoveClientCircuit(circuitcode); - this.m_clientManager.Remove(circuitcode); + CloseCircuit( client.CircuitCode ); } } } diff --git a/OpenSim/Region/ClientStack/UDPServer.cs b/OpenSim/Region/ClientStack/UDPServer.cs index efc9c87..b0b529c 100644 --- a/OpenSim/Region/ClientStack/UDPServer.cs +++ b/OpenSim/Region/ClientStack/UDPServer.cs @@ -49,7 +49,7 @@ namespace OpenSim.Region.ClientStack protected IPEndPoint ipeSender; protected EndPoint epSender; protected AsyncCallback ReceivedData; - protected PacketServer _packetServer; + protected PacketServer m_packetServer; protected int listenPort; protected IScene m_localScene; @@ -61,11 +61,11 @@ namespace OpenSim.Region.ClientStack { get { - return _packetServer; + return m_packetServer; } set { - _packetServer = value; + m_packetServer = value; } } @@ -74,7 +74,7 @@ namespace OpenSim.Region.ClientStack set { this.m_localScene = value; - this._packetServer.LocalScene = this.m_localScene; + this.m_packetServer.LocalScene = this.m_localScene; } } @@ -111,7 +111,9 @@ namespace OpenSim.Region.ClientStack catch (System.Net.Sockets.SocketException) { Console.WriteLine("Remote host Closed connection"); - this._packetServer.ConnectionClosed(this.clientCircuits[epSender]); + + this.m_packetServer.CloseCircuit(this.clientCircuits[epSender]); + ipeSender = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0); epSender = (EndPoint)ipeSender; Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null); @@ -126,7 +128,7 @@ namespace OpenSim.Region.ClientStack if (this.clientCircuits.ContainsKey(epSender)) { //if so then send packet to the packetserver - this._packetServer.InPacket(this.clientCircuits[epSender], packet); + this.m_packetServer.InPacket(this.clientCircuits[epSender], packet); } else if (packet.Type == PacketType.UseCircuitCode) { @@ -170,7 +172,7 @@ namespace OpenSim.Region.ClientStack public virtual void RegisterPacketServer(PacketServer server) { - this._packetServer = server; + this.m_packetServer = server; } public virtual void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode)//EndPoint packetSender) -- cgit v1.1