// Handle received data
        public void HandleComData(ComDataToServer comData, NetworkClient client)
        {
            // Work message
            if (comData.isWorkMessage == true)
            {
                Console.WriteLine("WORK MESSAGE!!!");
                WorkCompleteEvent(comData.workStatus.start, comData.workStatus.end, comData.workStatus.passFound, client.name);
            }

            string name = "NoName";

            if (comData.name != "" && comData.name != null)
            {
                name = comData.name;
            }

            // Chat messages
            if (comData.message != "" && comData.message != null)
            {
                NewMessageEvent(comData.message, name);
            }

            // Password message
            if (comData.password != "" && comData.password != null)
            {
                PasswordFoundEvent(comData.password);
            }
        }
        // Process received data
        private void ProcessClientCommand(NetworkClient client, ComDataToServer comData)
        {
            // Handle the data
            HandleComData(comData, client);

            // Adding this to catch name changes, consider finding a better way to do it, so updates does not happen as often.
            ClientsChangedEvent();
        }
        // Input received
        public async Task ReceiveInput()
        {
            IsActive      = true;
            networkStream = socket.GetStream();

            using (var reader = new StreamReader(networkStream))
            {
                while (IsActive)
                {
                    try
                    {
                        var content = await reader.ReadLineAsync();

                        // If content is null, that means the connection has been gracefully disconnected
                        if (content == null)
                        {
                            Console.WriteLine("Server: Marking client as disconnected.");
                            MarkAsDisconnected();
                            return;
                        }

                        // We've got a message
                        if (MessageReceived != null)
                        {
                            Console.WriteLine("Server: Received: " + content);
                            ComDataToServer comData = new ComDataToServer();
                            comData.FromXML(content);

                            if (comData != null)
                            {
                                if (comData.name != null && comData.name != "")
                                {
                                    Console.WriteLine("Settings name: " + comData.name);
                                    name = comData.name;
                                }

                                // Save accepting work status
                                acceptingWork = comData.acceptingWork;
                                status        = comData.status;
                            }
                            // Handle the received data
                            MessageReceived(this, comData);
                        }
                    }

                    // If the tcp connection is ungracefully disconnected, it will throw an exception
                    catch (IOException)
                    {
                        Console.WriteLine("Server: Error handling message");
                        MarkAsDisconnected();
                        return;
                    }
                }
            }
        }
        // Send a message that a password has been found
        public void SendPassword(string pass)
        {
            if (isConnected)
            {
                ComDataToServer comData = new ComDataToServer();
                comData.name          = name;
                comData.password      = pass;
                comData.acceptingWork = acceptingWork;
                comData.status        = status;

                tcpQueue.Enqueue(comData);
            }
        }
        // Send a message that work has been accepted
        public void SendWorkAccepted()
        {
            if (isConnected)
            {
                status = StatusCode.processing;
                ComDataToServer comData = new ComDataToServer();
                comData.acceptingWork = acceptingWork;
                comData.name          = name;
                comData.status        = status;

                tcpQueue.Enqueue(comData);
            }
        }
        // Thread for sending keepalives
        private void KeepAlive()
        {
            while (isConnected)
            {
                ComDataToServer comData = new ComDataToServer();
                comData.acceptingWork = acceptingWork;
                comData.name          = name;
                comData.status        = status;

                Console.WriteLine("Worker: Sending keepalive");
                tcpQueue.Enqueue(comData);

                Thread.Sleep(1000);
            }
        }
        private void btnSend_Click(object sender, RoutedEventArgs e)
        {
            // Send chat data
            UpdateComm();
            if (txtSend.Text != "")
            {
                comData               = new ComDataToServer();
                comData.status        = StatusCode.idle;
                comData.name          = txtName.Text;
                comData.message       = txtSend.Text;
                comData.acceptingWork = chkAcceptWork.IsChecked == true;

                comm.send(comData);

                txtSend.Text = "";
            }
        }
        // Send a message that work has been completed
        public void SendWorkCompleted(string start, string end, bool passFound)
        {
            if (isConnected)
            {
                status = StatusCode.idle;
                ComDataToServer comData = new ComDataToServer();
                comData.acceptingWork = acceptingWork;
                comData.name          = name;
                comData.status        = status;
                comData.isWorkMessage = true;

                WorkStatus w = new WorkStatus();
                w.start     = start;
                w.end       = end;
                w.passFound = passFound;


                comData.workStatus = w;

                tcpQueue.Enqueue(comData);
            }
        }
 // Add a message to the queue
 public void send(ComDataToServer comData)
 {
     tcpQueue.Enqueue(comData);
 }