From 74940c7b1dbd44dc236b6b1bf6a7d03ce8e6ea43 Mon Sep 17 00:00:00 2001 From: Jeff Ames Date: Tue, 26 Feb 2008 15:36:17 +0000 Subject: [PATCH] Update svn properties. --- .../Modules/Terrain/FloodBrushes/RaiseArea.cs | 60 +- .../Terrain/PaintBrushes/RaiseSphere.cs | 82 +-- .../Modules/VoiceChat/VoiceChatServer.cs | 686 +++++++++--------- .../Modules/VoiceChat/VoiceClient.cs | 338 ++++----- .../Modules/VoiceChat/VoicePacket.cs | 116 +-- .../Modules/VoiceChat/VoicePacketHeader.cs | 76 +- 6 files changed, 679 insertions(+), 679 deletions(-) diff --git a/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/RaiseArea.cs b/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/RaiseArea.cs index ce83a4caf4..8fd957b2da 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/RaiseArea.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/RaiseArea.cs @@ -1,30 +1,30 @@ -using System; -using System.Collections.Generic; -using System.Text; -using OpenSim.Region.Environment.Modules.Terrain; -using OpenSim.Region.Environment.Interfaces; - -namespace OpenSim.Region.Environment.Modules.Terrain.FloodBrushes -{ - class RaiseArea : ITerrainFloodEffect - { - #region ITerrainFloodEffect Members - - public void FloodEffect(ITerrainChannel map, bool[,] fillArea, double strength) - { - int x, y; - for (x = 0; x < map.Width; x++) - { - for (y = 0; y < map.Height; y++) - { - if (fillArea[x, y] == true) - { - map[x, y] += strength; - } - } - } - } - - #endregion - } -} +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Region.Environment.Modules.Terrain; +using OpenSim.Region.Environment.Interfaces; + +namespace OpenSim.Region.Environment.Modules.Terrain.FloodBrushes +{ + class RaiseArea : ITerrainFloodEffect + { + #region ITerrainFloodEffect Members + + public void FloodEffect(ITerrainChannel map, bool[,] fillArea, double strength) + { + int x, y; + for (x = 0; x < map.Width; x++) + { + for (y = 0; y < map.Height; y++) + { + if (fillArea[x, y] == true) + { + map[x, y] += strength; + } + } + } + } + + #endregion + } +} diff --git a/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/RaiseSphere.cs b/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/RaiseSphere.cs index cf95f3fb2e..be4a0b7671 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/RaiseSphere.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/RaiseSphere.cs @@ -1,41 +1,41 @@ -using System; -using System.Collections.Generic; -using System.Text; -using OpenSim.Region.Environment.Modules.Terrain; -using OpenSim.Region.Environment.Interfaces; - -namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes -{ - class RaiseSphere : ITerrainPaintableEffect - { - #region ITerrainPaintableEffect Members - - public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength) - { - int x, y; - for (x = 0; x < map.Width; x++) - { - // Skip everything unlikely to be affected - if (Math.Abs(x - rx) > strength * 1.1) - continue; - - for (y = 0; y < map.Height; y++) - { - // Skip everything unlikely to be affected - if (Math.Abs(y - ry) > strength * 1.1) - continue; - - // Calculate a sphere and add it to the heighmap - double z = strength; - z *= z; - z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); - - if (z > 0.0) - map[x, y] += z; - } - } - } - - #endregion - } -} +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Region.Environment.Modules.Terrain; +using OpenSim.Region.Environment.Interfaces; + +namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes +{ + class RaiseSphere : ITerrainPaintableEffect + { + #region ITerrainPaintableEffect Members + + public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength) + { + int x, y; + for (x = 0; x < map.Width; x++) + { + // Skip everything unlikely to be affected + if (Math.Abs(x - rx) > strength * 1.1) + continue; + + for (y = 0; y < map.Height; y++) + { + // Skip everything unlikely to be affected + if (Math.Abs(y - ry) > strength * 1.1) + continue; + + // Calculate a sphere and add it to the heighmap + double z = strength; + z *= z; + z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); + + if (z > 0.0) + map[x, y] += z; + } + } + } + + #endregion + } +} diff --git a/OpenSim/Region/Environment/Modules/VoiceChat/VoiceChatServer.cs b/OpenSim/Region/Environment/Modules/VoiceChat/VoiceChatServer.cs index 68197bb6b6..5ec0ca8992 100644 --- a/OpenSim/Region/Environment/Modules/VoiceChat/VoiceChatServer.cs +++ b/OpenSim/Region/Environment/Modules/VoiceChat/VoiceChatServer.cs @@ -1,343 +1,343 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading; -using System.Net.Sockets; -using System.Net; -using OpenSim.Region.Environment.Scenes; -using OpenSim.Framework; -using OpenSim.Region.Environment.Modules; -using OpenSim.Region.Environment.Interfaces; -using Nini; -using libsecondlife; - -namespace OpenSim.Region.Environment.Modules.VoiceChat -{ - public class VoiceChatServer : IRegionModule - { - private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); - - int m_dummySocketPort = 53134; - - Thread m_listenerThread; - Thread m_mainThread; - List m_scenes = new List(); - Socket m_server; - Socket m_selectCancel; - bool m_enabled = false; - - Dictionary m_clients = new Dictionary(); - Dictionary m_uuidToClient = new Dictionary(); - - - #region IRegionModule Members - - public void Initialise(Scene scene, Nini.Config.IConfigSource source) - { - try - { - m_enabled = source.Configs["Voice"].GetBoolean("enabled", m_enabled); - } - catch (Exception) - { } - - if (m_enabled) - { - if (!m_scenes.Contains(scene)) - m_scenes.Add(scene); - - scene.EventManager.OnNewClient += NewClient; - scene.EventManager.OnRemovePresence += RemovePresence; - } - } - - public void PostInitialise() - { - if (m_enabled != true) - return; - - try - { - CreateListeningSocket(); - } - catch (Exception) - { - m_log.Error("[VOICECHAT]: Unable to start listening"); - return; - } - - m_listenerThread = new Thread(new ThreadStart(ListenIncomingConnections)); - m_listenerThread.IsBackground = true; - m_listenerThread.Start(); - - m_mainThread = new Thread(new ThreadStart(RunVoiceChat)); - m_mainThread.IsBackground = true; - m_mainThread.Start(); - - Thread.Sleep(500); - m_selectCancel = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - m_selectCancel.Connect("localhost", m_dummySocketPort); - } - - public void Close() - { - throw new NotImplementedException(); - } - - public string Name - { - get { return "VoiceChatModule"; } - } - - public bool IsSharedModule - { - get { return true; } // I think we can share this one. - } - - #endregion - - public void NewClient(IClientAPI client) - { - m_log.Info("[VOICECHAT]: New client: " + client.AgentId); - lock (m_uuidToClient) - { - m_uuidToClient[client.AgentId] = null; - } - } - - public void RemovePresence(LLUUID uuid) - { - lock (m_uuidToClient) - { - if (m_uuidToClient.ContainsKey(uuid)) - { - if (m_uuidToClient[uuid] != null) - { - RemoveClient(m_uuidToClient[uuid].m_socket); - } - m_uuidToClient.Remove(uuid); - } - else - { - m_log.Error("[VOICECHAT]: Presence not found on RemovePresence: " + uuid); - } - } - } - - public bool AddClient(VoiceClient client, LLUUID uuid) - { - lock (m_uuidToClient) - { - if (m_uuidToClient.ContainsKey(uuid)) - { - if (m_uuidToClient[uuid] != null) { - m_log.Warn("[VOICECHAT]: Multiple login attempts for " + uuid); - return false; - } - m_uuidToClient[uuid] = client; - return true; - } - } - return false; - } - - public void RemoveClient(Socket socket) - { - m_log.Info("[VOICECHAT]: Removing client"); - lock(m_clients) - { - VoiceClient client = m_clients[socket]; - - lock(m_uuidToClient) - { - if (m_uuidToClient.ContainsKey(client.m_clientId)) - { - m_uuidToClient[client.m_clientId] = null; - } - } - - m_clients.Remove(socket); - client.m_socket.Close(); - } - } - - protected void CreateListeningSocket() - { - IPEndPoint listenEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 12000); - m_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - m_server.Bind(listenEndPoint); - m_server.Listen(50); - } - - void ListenIncomingConnections() - { - m_log.Info("[VOICECHAT]: Listening connections..."); - //ServerStatus.ReportThreadName("VoiceChat: Connection listener"); - - byte[] dummyBuffer = new byte[1]; - - while (true) - { - try - { - Socket connection = m_server.Accept(); - lock (m_clients) - { - m_clients[connection] = new VoiceClient(connection, this); - m_selectCancel.Send(dummyBuffer); - m_log.Info("[VOICECHAT]: Voicechat connection from " + connection.RemoteEndPoint.ToString()); - } - } - catch (SocketException e) - { - m_log.Error("[VOICECHAT]: During accept: " + e.ToString()); - } - } - } - - Socket ListenLoopbackSocket() - { - IPEndPoint listenEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), m_dummySocketPort); - Socket dummyListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - dummyListener.Bind(listenEndPoint); - dummyListener.Listen(1); - Socket socket = dummyListener.Accept(); - dummyListener.Close(); - return socket; - } - - void RunVoiceChat() - { - m_log.Info("[VOICECHAT]: Connection handler started..."); - //ServerStatus.ReportThreadName("VoiceChat: Connection handler"); - - //Listen a loopback socket for aborting select call - Socket dummySocket = ListenLoopbackSocket(); - - List sockets = new List(); - byte[] buffer = new byte[65536]; - - while (true) - { - if (m_clients.Count == 0) - { - Thread.Sleep(100); - continue; - } - - lock (m_clients) - { - foreach (Socket s in m_clients.Keys) - { - sockets.Add(s); - } - } - sockets.Add(dummySocket); - - try - { - Socket.Select(sockets, null, null, 200000); - } - catch (SocketException e) - { - m_log.Warn("[VOICECHAT]: " + e.Message); - } - - foreach (Socket s in sockets) - { - try - { - if (s.RemoteEndPoint != dummySocket.RemoteEndPoint) - { - ReceiveFromSocket(s, buffer); - } - else - { - //Receive data and check if there was an error with select abort socket - if (s.Receive(buffer) <= 0) - { - //Just give a warning for now - m_log.Error("[VOICECHAT]: Select abort socket was closed"); - } - } - } - catch(ObjectDisposedException e) - { - m_log.Warn("[VOICECHAT]: Connection has been already closed"); - } - catch (Exception e) - { - m_log.Error("[VOICECHAT]: Exception: " + e.Message); - - RemoveClient(s); - } - } - - sockets.Clear(); - } - } - - private void ReceiveFromSocket( Socket s, byte[] buffer ) - { - int byteCount = s.Receive(buffer); - if (byteCount <= 0) - { - m_log.Info("[VOICECHAT]: Connection lost to " + s.RemoteEndPoint); - lock (m_clients) - { - RemoveClient(s); - } - } - else - { - //ServerStatus.ReportInPacketTcp(byteCount); - lock (m_clients) - { - if (m_clients.ContainsKey(s)) - { - m_clients[s].OnDataReceived(buffer, byteCount); - } - else - { - m_log.Warn("[VOICECHAT]: Got data from " + s.RemoteEndPoint + - ", but source is not a valid voice client"); - } - } - } - } - - public LLVector3 getScenePresencePosition(LLUUID clientID) - { - foreach (Scene scene in m_scenes) - { - ScenePresence x; - if ((x = scene.GetScenePresence(clientID)) != null) - { - return x.AbsolutePosition + new LLVector3(Constants.RegionSize * scene.RegionInfo.RegionLocX, - Constants.RegionSize * scene.RegionInfo.RegionLocY, 0); - } - } - return LLVector3.Zero; - } - - public void BroadcastVoice(VoicePacket packet) - { - libsecondlife.LLVector3 origPos = getScenePresencePosition(packet.m_clientId); - - byte[] bytes = packet.GetBytes(); - foreach (VoiceClient client in m_clients.Values) - { - if (client.IsEnabled() && client.m_clientId != packet.m_clientId && - client.m_authenticated && client.IsCodecSupported(packet.m_codec)) - { - LLVector3 presenceLoc = getScenePresencePosition(client.m_clientId); - - if (presenceLoc != LLVector3.Zero && Util.GetDistanceTo(presenceLoc, origPos) < 20) - { - client.SendTo(bytes); - } - } - } - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Net.Sockets; +using System.Net; +using OpenSim.Region.Environment.Scenes; +using OpenSim.Framework; +using OpenSim.Region.Environment.Modules; +using OpenSim.Region.Environment.Interfaces; +using Nini; +using libsecondlife; + +namespace OpenSim.Region.Environment.Modules.VoiceChat +{ + public class VoiceChatServer : IRegionModule + { + private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + int m_dummySocketPort = 53134; + + Thread m_listenerThread; + Thread m_mainThread; + List m_scenes = new List(); + Socket m_server; + Socket m_selectCancel; + bool m_enabled = false; + + Dictionary m_clients = new Dictionary(); + Dictionary m_uuidToClient = new Dictionary(); + + + #region IRegionModule Members + + public void Initialise(Scene scene, Nini.Config.IConfigSource source) + { + try + { + m_enabled = source.Configs["Voice"].GetBoolean("enabled", m_enabled); + } + catch (Exception) + { } + + if (m_enabled) + { + if (!m_scenes.Contains(scene)) + m_scenes.Add(scene); + + scene.EventManager.OnNewClient += NewClient; + scene.EventManager.OnRemovePresence += RemovePresence; + } + } + + public void PostInitialise() + { + if (m_enabled != true) + return; + + try + { + CreateListeningSocket(); + } + catch (Exception) + { + m_log.Error("[VOICECHAT]: Unable to start listening"); + return; + } + + m_listenerThread = new Thread(new ThreadStart(ListenIncomingConnections)); + m_listenerThread.IsBackground = true; + m_listenerThread.Start(); + + m_mainThread = new Thread(new ThreadStart(RunVoiceChat)); + m_mainThread.IsBackground = true; + m_mainThread.Start(); + + Thread.Sleep(500); + m_selectCancel = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + m_selectCancel.Connect("localhost", m_dummySocketPort); + } + + public void Close() + { + throw new NotImplementedException(); + } + + public string Name + { + get { return "VoiceChatModule"; } + } + + public bool IsSharedModule + { + get { return true; } // I think we can share this one. + } + + #endregion + + public void NewClient(IClientAPI client) + { + m_log.Info("[VOICECHAT]: New client: " + client.AgentId); + lock (m_uuidToClient) + { + m_uuidToClient[client.AgentId] = null; + } + } + + public void RemovePresence(LLUUID uuid) + { + lock (m_uuidToClient) + { + if (m_uuidToClient.ContainsKey(uuid)) + { + if (m_uuidToClient[uuid] != null) + { + RemoveClient(m_uuidToClient[uuid].m_socket); + } + m_uuidToClient.Remove(uuid); + } + else + { + m_log.Error("[VOICECHAT]: Presence not found on RemovePresence: " + uuid); + } + } + } + + public bool AddClient(VoiceClient client, LLUUID uuid) + { + lock (m_uuidToClient) + { + if (m_uuidToClient.ContainsKey(uuid)) + { + if (m_uuidToClient[uuid] != null) { + m_log.Warn("[VOICECHAT]: Multiple login attempts for " + uuid); + return false; + } + m_uuidToClient[uuid] = client; + return true; + } + } + return false; + } + + public void RemoveClient(Socket socket) + { + m_log.Info("[VOICECHAT]: Removing client"); + lock(m_clients) + { + VoiceClient client = m_clients[socket]; + + lock(m_uuidToClient) + { + if (m_uuidToClient.ContainsKey(client.m_clientId)) + { + m_uuidToClient[client.m_clientId] = null; + } + } + + m_clients.Remove(socket); + client.m_socket.Close(); + } + } + + protected void CreateListeningSocket() + { + IPEndPoint listenEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 12000); + m_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + m_server.Bind(listenEndPoint); + m_server.Listen(50); + } + + void ListenIncomingConnections() + { + m_log.Info("[VOICECHAT]: Listening connections..."); + //ServerStatus.ReportThreadName("VoiceChat: Connection listener"); + + byte[] dummyBuffer = new byte[1]; + + while (true) + { + try + { + Socket connection = m_server.Accept(); + lock (m_clients) + { + m_clients[connection] = new VoiceClient(connection, this); + m_selectCancel.Send(dummyBuffer); + m_log.Info("[VOICECHAT]: Voicechat connection from " + connection.RemoteEndPoint.ToString()); + } + } + catch (SocketException e) + { + m_log.Error("[VOICECHAT]: During accept: " + e.ToString()); + } + } + } + + Socket ListenLoopbackSocket() + { + IPEndPoint listenEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), m_dummySocketPort); + Socket dummyListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + dummyListener.Bind(listenEndPoint); + dummyListener.Listen(1); + Socket socket = dummyListener.Accept(); + dummyListener.Close(); + return socket; + } + + void RunVoiceChat() + { + m_log.Info("[VOICECHAT]: Connection handler started..."); + //ServerStatus.ReportThreadName("VoiceChat: Connection handler"); + + //Listen a loopback socket for aborting select call + Socket dummySocket = ListenLoopbackSocket(); + + List sockets = new List(); + byte[] buffer = new byte[65536]; + + while (true) + { + if (m_clients.Count == 0) + { + Thread.Sleep(100); + continue; + } + + lock (m_clients) + { + foreach (Socket s in m_clients.Keys) + { + sockets.Add(s); + } + } + sockets.Add(dummySocket); + + try + { + Socket.Select(sockets, null, null, 200000); + } + catch (SocketException e) + { + m_log.Warn("[VOICECHAT]: " + e.Message); + } + + foreach (Socket s in sockets) + { + try + { + if (s.RemoteEndPoint != dummySocket.RemoteEndPoint) + { + ReceiveFromSocket(s, buffer); + } + else + { + //Receive data and check if there was an error with select abort socket + if (s.Receive(buffer) <= 0) + { + //Just give a warning for now + m_log.Error("[VOICECHAT]: Select abort socket was closed"); + } + } + } + catch(ObjectDisposedException e) + { + m_log.Warn("[VOICECHAT]: Connection has been already closed"); + } + catch (Exception e) + { + m_log.Error("[VOICECHAT]: Exception: " + e.Message); + + RemoveClient(s); + } + } + + sockets.Clear(); + } + } + + private void ReceiveFromSocket( Socket s, byte[] buffer ) + { + int byteCount = s.Receive(buffer); + if (byteCount <= 0) + { + m_log.Info("[VOICECHAT]: Connection lost to " + s.RemoteEndPoint); + lock (m_clients) + { + RemoveClient(s); + } + } + else + { + //ServerStatus.ReportInPacketTcp(byteCount); + lock (m_clients) + { + if (m_clients.ContainsKey(s)) + { + m_clients[s].OnDataReceived(buffer, byteCount); + } + else + { + m_log.Warn("[VOICECHAT]: Got data from " + s.RemoteEndPoint + + ", but source is not a valid voice client"); + } + } + } + } + + public LLVector3 getScenePresencePosition(LLUUID clientID) + { + foreach (Scene scene in m_scenes) + { + ScenePresence x; + if ((x = scene.GetScenePresence(clientID)) != null) + { + return x.AbsolutePosition + new LLVector3(Constants.RegionSize * scene.RegionInfo.RegionLocX, + Constants.RegionSize * scene.RegionInfo.RegionLocY, 0); + } + } + return LLVector3.Zero; + } + + public void BroadcastVoice(VoicePacket packet) + { + libsecondlife.LLVector3 origPos = getScenePresencePosition(packet.m_clientId); + + byte[] bytes = packet.GetBytes(); + foreach (VoiceClient client in m_clients.Values) + { + if (client.IsEnabled() && client.m_clientId != packet.m_clientId && + client.m_authenticated && client.IsCodecSupported(packet.m_codec)) + { + LLVector3 presenceLoc = getScenePresencePosition(client.m_clientId); + + if (presenceLoc != LLVector3.Zero && Util.GetDistanceTo(presenceLoc, origPos) < 20) + { + client.SendTo(bytes); + } + } + } + } + } +} diff --git a/OpenSim/Region/Environment/Modules/VoiceChat/VoiceClient.cs b/OpenSim/Region/Environment/Modules/VoiceChat/VoiceClient.cs index 7eb2177556..7be0dadc0a 100644 --- a/OpenSim/Region/Environment/Modules/VoiceChat/VoiceClient.cs +++ b/OpenSim/Region/Environment/Modules/VoiceChat/VoiceClient.cs @@ -1,169 +1,169 @@ -using System; -using System.IO; -using System.Collections.Generic; -using System.Text; -using System.Net.Sockets; -using OpenSim.Region.Environment.Scenes; -using libsecondlife; - -namespace OpenSim.Region.Environment.Modules.VoiceChat -{ - /** - * Represents a single voiceclient instance - **/ - public class VoiceClient - { - private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); - - public Socket m_socket; - public LLUUID m_clientId; - public bool m_authenticated = false; - - protected VoicePacketHeader m_header = null; - protected int m_headerBytesReceived = 0; - - protected int m_offset = 0; - protected int m_supportedCodecs = 0; - - protected byte[] m_buffer = null; - protected byte[] m_headerBytes = new byte[5]; - - protected bool m_enabled = true; - - protected VoiceChatServer m_server; - - public VoiceClient(Socket socket, VoiceChatServer server) - { - m_socket = socket; - m_server = server; - } - - public void OnDataReceived(byte[] data, int byteCount) - { - int offset = 0; - while (offset < byteCount) - { - if (m_header == null) - { - if (m_headerBytesReceived < 5) - { - m_headerBytes[m_headerBytesReceived++] = data[offset++]; - } - else if (m_headerBytesReceived == 5) - { - m_header = new VoicePacketHeader(); - m_header.Parse(m_headerBytes); - if (m_header.length > 65535) - { - throw new Exception("Packet size " + m_header.length + " > 65535"); - } - - m_buffer = new byte[m_header.length]; - m_offset = 0; - m_headerBytesReceived = 0; - } - } - else - { - int bytesToCopy = m_header.length-m_offset; - if (bytesToCopy > byteCount - offset) - bytesToCopy = byteCount - offset; - - Buffer.BlockCopy(data, offset, m_buffer, m_offset, bytesToCopy); - - offset += bytesToCopy; - m_offset += bytesToCopy; - - if (m_offset == m_header.length) - { - ParsePacket(m_header.type, m_buffer); - m_header = null; - } - } - } - } - - void ParsePacket(byte type, byte[] data) - { - switch (type) - { - case 0: //LOGIN - ParseLogin(data); - break; - - case 1: //AUDIODATA - if (m_authenticated) - { - VoicePacket packet = new VoicePacket(data); - packet.m_clientId = m_clientId; - m_server.BroadcastVoice(packet); - } - else - { - m_log.Warn("[VOICECHAT]: Got unauthorized audio data from " + - m_socket.RemoteEndPoint.ToString()); - m_socket.Close(); - } - break; - - case 3: //ENABLEVOIP - if (data[0] == 0) - { - m_log.Warn("[VOICECHAT]: VoiceChat has been disabled for " + m_clientId); - m_enabled = false; - } - else - { - m_log.Warn("[VOICECHAT]: VoiceChat has been enabled for " + m_clientId); - m_enabled = true; - } - break; - - - default: - throw new Exception("Invalid packet received"); - } - } - - void ParseLogin(byte[] data) - { - m_clientId = new LLUUID(data, 0); - - m_supportedCodecs = data[16]; - m_supportedCodecs |= data[17] << 8; - m_supportedCodecs |= data[18] << 16; - m_supportedCodecs |= data[19] << 24; - - if (m_server.AddClient(this, m_clientId)) - { - m_log.Info("[VOICECHAT]: Client authenticated succesfully: " + m_clientId); - m_authenticated = true; - } - else - { - throw new Exception("Unable to authenticate with id " + m_clientId); - } - } - - public bool IsEnabled() - { - return m_enabled; - } - - public bool IsCodecSupported(int codec) - { - if ((m_supportedCodecs & codec) != 0) - return true; - - return false; - } - - public void SendTo(byte[] data) - { - if (m_authenticated) - { - //ServerStatus.ReportOutPacketTcp(m_socket.Send(data)); - } - } - } -} +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; +using System.Net.Sockets; +using OpenSim.Region.Environment.Scenes; +using libsecondlife; + +namespace OpenSim.Region.Environment.Modules.VoiceChat +{ + /** + * Represents a single voiceclient instance + **/ + public class VoiceClient + { + private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + public Socket m_socket; + public LLUUID m_clientId; + public bool m_authenticated = false; + + protected VoicePacketHeader m_header = null; + protected int m_headerBytesReceived = 0; + + protected int m_offset = 0; + protected int m_supportedCodecs = 0; + + protected byte[] m_buffer = null; + protected byte[] m_headerBytes = new byte[5]; + + protected bool m_enabled = true; + + protected VoiceChatServer m_server; + + public VoiceClient(Socket socket, VoiceChatServer server) + { + m_socket = socket; + m_server = server; + } + + public void OnDataReceived(byte[] data, int byteCount) + { + int offset = 0; + while (offset < byteCount) + { + if (m_header == null) + { + if (m_headerBytesReceived < 5) + { + m_headerBytes[m_headerBytesReceived++] = data[offset++]; + } + else if (m_headerBytesReceived == 5) + { + m_header = new VoicePacketHeader(); + m_header.Parse(m_headerBytes); + if (m_header.length > 65535) + { + throw new Exception("Packet size " + m_header.length + " > 65535"); + } + + m_buffer = new byte[m_header.length]; + m_offset = 0; + m_headerBytesReceived = 0; + } + } + else + { + int bytesToCopy = m_header.length-m_offset; + if (bytesToCopy > byteCount - offset) + bytesToCopy = byteCount - offset; + + Buffer.BlockCopy(data, offset, m_buffer, m_offset, bytesToCopy); + + offset += bytesToCopy; + m_offset += bytesToCopy; + + if (m_offset == m_header.length) + { + ParsePacket(m_header.type, m_buffer); + m_header = null; + } + } + } + } + + void ParsePacket(byte type, byte[] data) + { + switch (type) + { + case 0: //LOGIN + ParseLogin(data); + break; + + case 1: //AUDIODATA + if (m_authenticated) + { + VoicePacket packet = new VoicePacket(data); + packet.m_clientId = m_clientId; + m_server.BroadcastVoice(packet); + } + else + { + m_log.Warn("[VOICECHAT]: Got unauthorized audio data from " + + m_socket.RemoteEndPoint.ToString()); + m_socket.Close(); + } + break; + + case 3: //ENABLEVOIP + if (data[0] == 0) + { + m_log.Warn("[VOICECHAT]: VoiceChat has been disabled for " + m_clientId); + m_enabled = false; + } + else + { + m_log.Warn("[VOICECHAT]: VoiceChat has been enabled for " + m_clientId); + m_enabled = true; + } + break; + + + default: + throw new Exception("Invalid packet received"); + } + } + + void ParseLogin(byte[] data) + { + m_clientId = new LLUUID(data, 0); + + m_supportedCodecs = data[16]; + m_supportedCodecs |= data[17] << 8; + m_supportedCodecs |= data[18] << 16; + m_supportedCodecs |= data[19] << 24; + + if (m_server.AddClient(this, m_clientId)) + { + m_log.Info("[VOICECHAT]: Client authenticated succesfully: " + m_clientId); + m_authenticated = true; + } + else + { + throw new Exception("Unable to authenticate with id " + m_clientId); + } + } + + public bool IsEnabled() + { + return m_enabled; + } + + public bool IsCodecSupported(int codec) + { + if ((m_supportedCodecs & codec) != 0) + return true; + + return false; + } + + public void SendTo(byte[] data) + { + if (m_authenticated) + { + //ServerStatus.ReportOutPacketTcp(m_socket.Send(data)); + } + } + } +} diff --git a/OpenSim/Region/Environment/Modules/VoiceChat/VoicePacket.cs b/OpenSim/Region/Environment/Modules/VoiceChat/VoicePacket.cs index e92fa43a61..db62f45d6b 100644 --- a/OpenSim/Region/Environment/Modules/VoiceChat/VoicePacket.cs +++ b/OpenSim/Region/Environment/Modules/VoiceChat/VoicePacket.cs @@ -1,58 +1,58 @@ -using System; -using System.Collections.Generic; -using System.Text; -using libsecondlife; - -namespace OpenSim.Region.Environment.Modules.VoiceChat -{ - public enum VoiceCodec - { - None = 0, - PCM8 = 1 << 0, - PCM16 = 1 << 1, - PCM32 = 1 << 2, - Speex = 1 << 3, - } - - public class VoicePacket - { - public LLUUID m_clientId; - byte[] m_audioData; - public int m_codec; - - public VoicePacket(byte[] data) - { - int pos = 0; - m_codec = data[pos++]; - m_codec |= data[pos++] << 8; - m_codec |= data[pos++] << 16; - m_codec |= data[pos++] << 24; - - m_audioData = new byte[data.Length - pos]; - Buffer.BlockCopy(data, pos, m_audioData, 0, data.Length - pos); - } - - public byte[] GetBytes() - { - VoicePacketHeader header = new VoicePacketHeader(); - byte[] bytes = new byte[5+16+4+m_audioData.Length]; - - header.length = bytes.Length-5; - - //ToClient packets are type 2 - header.type = 2; - - int pos = 0; - header.CopyTo(bytes, pos); pos += 5; - m_clientId.GetBytes().CopyTo(bytes, pos); pos += 16; - - bytes[pos++] = (byte)((m_codec) % 256); - bytes[pos++] = (byte)((m_codec << 8) % 256); - bytes[pos++] = (byte)((m_codec << 16) % 256); - bytes[pos++] = (byte)((m_codec << 24) % 256); - - m_audioData.CopyTo(bytes, pos); - return bytes; - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using libsecondlife; + +namespace OpenSim.Region.Environment.Modules.VoiceChat +{ + public enum VoiceCodec + { + None = 0, + PCM8 = 1 << 0, + PCM16 = 1 << 1, + PCM32 = 1 << 2, + Speex = 1 << 3, + } + + public class VoicePacket + { + public LLUUID m_clientId; + byte[] m_audioData; + public int m_codec; + + public VoicePacket(byte[] data) + { + int pos = 0; + m_codec = data[pos++]; + m_codec |= data[pos++] << 8; + m_codec |= data[pos++] << 16; + m_codec |= data[pos++] << 24; + + m_audioData = new byte[data.Length - pos]; + Buffer.BlockCopy(data, pos, m_audioData, 0, data.Length - pos); + } + + public byte[] GetBytes() + { + VoicePacketHeader header = new VoicePacketHeader(); + byte[] bytes = new byte[5+16+4+m_audioData.Length]; + + header.length = bytes.Length-5; + + //ToClient packets are type 2 + header.type = 2; + + int pos = 0; + header.CopyTo(bytes, pos); pos += 5; + m_clientId.GetBytes().CopyTo(bytes, pos); pos += 16; + + bytes[pos++] = (byte)((m_codec) % 256); + bytes[pos++] = (byte)((m_codec << 8) % 256); + bytes[pos++] = (byte)((m_codec << 16) % 256); + bytes[pos++] = (byte)((m_codec << 24) % 256); + + m_audioData.CopyTo(bytes, pos); + return bytes; + } + } +} diff --git a/OpenSim/Region/Environment/Modules/VoiceChat/VoicePacketHeader.cs b/OpenSim/Region/Environment/Modules/VoiceChat/VoicePacketHeader.cs index 2f9ec55a8b..19b2e7bd9c 100644 --- a/OpenSim/Region/Environment/Modules/VoiceChat/VoicePacketHeader.cs +++ b/OpenSim/Region/Environment/Modules/VoiceChat/VoicePacketHeader.cs @@ -1,38 +1,38 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace OpenSim.Region.Environment.Modules.VoiceChat -{ - public class VoicePacketHeader - { - public byte type; - public int length; - - public void Parse(byte[] data) - { - int offset = 0; - type = data[offset++]; - - length = data[offset++]; - length |= data[offset++] << 8; - length |= data[offset++] << 16; - length |= data[offset++] << 24; - } - - public void CopyTo(byte[] data, int offset) - { - data[offset + 0] = type; - - data[offset + 1] = (byte)(length & 0x000000FF); - data[offset + 2] = (byte)((length & 0x0000FF00) >> 8); - data[offset + 3] = (byte)((length & 0x00FF0000) >> 16); - data[offset + 4] = (byte)((length & 0xFF000000) >> 24); - } - - public int GetLength() - { - return 5; - } - } -} +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Region.Environment.Modules.VoiceChat +{ + public class VoicePacketHeader + { + public byte type; + public int length; + + public void Parse(byte[] data) + { + int offset = 0; + type = data[offset++]; + + length = data[offset++]; + length |= data[offset++] << 8; + length |= data[offset++] << 16; + length |= data[offset++] << 24; + } + + public void CopyTo(byte[] data, int offset) + { + data[offset + 0] = type; + + data[offset + 1] = (byte)(length & 0x000000FF); + data[offset + 2] = (byte)((length & 0x0000FF00) >> 8); + data[offset + 3] = (byte)((length & 0x00FF0000) >> 16); + data[offset + 4] = (byte)((length & 0xFF000000) >> 24); + } + + public int GetLength() + { + return 5; + } + } +}