// Wrap the client events so the server owner can catch them. protected override void DataReceivedHandle(ClientConnection sender, IncomingMessageEventArgs e) { // If client already authenticated. if (authenticatedConnections.ContainsKey(sender.RemoteEndPoint)) { switch ((PacketType)e.PacketType) { case PacketType.AudioSegment: authenticatedConnections[sender.RemoteEndPoint].ContinueStream(); break; case PacketType.RequestList: GeneralEvent.Invoke(this, new GeneralEventArgs(authenticatedConnections[sender.RemoteEndPoint].Username, sender.RemoteEndPoint, ("Requested a new track list."))); authenticatedConnections[sender.RemoteEndPoint].RequestUpdateList(); break; case PacketType.StartAudioStream: byte[] requestReply = null; BeginStreamingAudio(sender.RemoteEndPoint, e.Message, out requestReply); SendData(sender.RemoteEndPoint, requestReply, (byte)PacketType.StartAudioStream); break; case PacketType.StopAudioStream: authenticatedConnections[sender.RemoteEndPoint].EndStreaming(); break; case PacketType.UnknownPacket: GeneralEvent.Invoke(this, new GeneralEventArgs(authenticatedConnections[sender.RemoteEndPoint].Username, sender.RemoteEndPoint, "Made a request to close the connection.")); DropClient(sender.RemoteEndPoint); break; default: GeneralEvent.Invoke(this, new GeneralEventArgs(authenticatedConnections[sender.RemoteEndPoint].Username, sender.RemoteEndPoint, ("Made a request with packet type " + ((PacketType)e.PacketType).ToString() + " which is invalid for this context."))); break; } } else { // See if the client is trying to authenticate or register. byte[] send = null; switch ((PacketType)e.PacketType) { case PacketType.Authenticate: // Authenticate this client. AuthenticateClient(sender.RemoteEndPoint, e.Message, out send); SendData(sender.RemoteEndPoint, send, (byte)PacketType.Authenticate); break; case PacketType.Register: // Register new credentials. RegisterNewUser(sender.RemoteEndPoint, e.Message, out send); SendData(sender.RemoteEndPoint, send, (byte)PacketType.Register); break; case PacketType.UnknownPacket: GeneralEvent.Invoke(this, new GeneralEventArgs(null, sender.RemoteEndPoint, "Made a request to close the connection.")); DropClient(sender.RemoteEndPoint); break; default: GeneralEvent.Invoke(this, new GeneralEventArgs(null, sender.RemoteEndPoint, ("Made a request with packet type " + ((PacketType)e.PacketType).ToString() + " which is invalid for this context."))); break; } if (send != null) { sender.SendDataPacket(ref send, e.PacketType); } // Reply with the same header and some data. } }