private void StartTransferButton_Click(object sender, EventArgs e)
        {
            FileTransferContainer.Clear();
            StatusBar.Visible            = true;
            StopButton.Enabled           = true;
            StartTransferButton.Enabled  = false;
            ProgressBar.Value            = 0;
            ProcessedFilesContainer.Text = "0";

            int profileCount = 0;

            // Count how many directories are found.

            try
            {
                foreach (string target in DeviceList.Items)
                {
                    string[] directories = Directory.GetDirectories(target + Properties.Settings.Default.SourceDirectory);

                    foreach (string path in directories)
                    {
                        profileCount++;
                        ProfileCountContainer.Text = profileCount.ToString();
                    }
                }

                DirectoryTools DirectoryTools = new DirectoryTools(TotalSizeContainer, FileTransferContainer, ProcessedFilesContainer);

                ProfileLabel.Visible            = true;
                ProfileCountContainer.Visible   = true;
                TotalSizeLabel.Visible          = true;
                TotalSizeContainer.Visible      = true;
                ProcessedFilesContainer.Visible = true;
                ProcessedFilesLabel.Visible     = true;
                ElapsedTimeContainer.Visible    = true;
                ElapsedTimeLabel.Visible        = true;

                Timer          = new System.Windows.Forms.Timer();
                Timer.Interval = 500;
                Timer.Tick    += Ticker;
                Timer.Start();

                StopWatch = new Stopwatch();
                StopWatch.Start();

                DirectorySizeCalculator = new Thread(() => InitiateTransfer(RetrieveDeviceList()));
                DirectorySizeCalculator.Start();
            }
            catch
            {
                StatusBar.Text = "Transfer failed. Ensure target device is accessible.";
                StartTransferButton.Enabled = true;
                StopButton.Enabled          = false;
            }
        }
        private void saveReportToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveSession = new SaveFileDialog();

            saveSession.DefaultExt = "*.txt";
            saveSession.Filter     = "txt|*.txt";
            saveSession.FileName   = Environment.UserName + "-Profile Backup Session";
            if (saveSession.ShowDialog() == DialogResult.OK)
            {
                FileTransferContainer.SaveFile(saveSession.FileName, RichTextBoxStreamType.UnicodePlainText);
            }
        }
        private void ProcessClient(ConnectedPeerDataContainer client)
        {
            int             _messageType = 0;
            PrimaryCommands _primaryCommand;
            string          _clientSocketRemoteEndPointString = client.socket.RemoteEndPoint.ToString();
            string          _ip         = _clientSocketRemoteEndPointString.Remove(_clientSocketRemoteEndPointString.LastIndexOf(':'));
            string          _nick       = client.nick;
            Socket          _peerSocket = client.socket;

            Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { AddNewTab(client.nick, _clientSocketRemoteEndPointString.Remove(_clientSocketRemoteEndPointString.LastIndexOf(':'))); }));
            WriteToLogbox("Connected to- " + _ip);
            try {
                string _message;
                int    _size;
                while (_peerSocket.Connected)
                {
                    if (!Network.NetworkCommunicationManagers.ReceiveDecodedIntOverSocket(_peerSocket, client.key, out _messageType))
                    {
                        break;
                    }
                    _primaryCommand = (PrimaryCommands)_messageType;

                    switch (_primaryCommand)
                    {
                    case PrimaryCommands.TextMessage:
                        if (!Network.NetworkCommunicationManagers.ReceiveDecodedIntOverSocket(_peerSocket, client.key, out _size))
                        {
                            break;
                        }

                        if (!Network.NetworkCommunicationManagers.ReceiveDecodedStringOverSocket(_peerSocket, client.key, out _message, _size))
                        {
                            break;
                        }

                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_ip, _message, _nick, 1); }));
                        WriteToLogbox("Message Received- " + _nick + " (" + _clientSocketRemoteEndPointString + ") : " + _message);
                        break;

                    case PrimaryCommands.FileTransfer:
                        int _port1;
                        Network.NetworkCommunicationManagers.ReceiveIntOverSocket(_peerSocket, out _port1);
                        FileTransferContainer fileTransferContainer = new FileTransferContainer()
                        {
                            status       = FileTransferStatus.Running,
                            fileName     = "(Fetching....)",
                            ID           = _nick + " (" + _ip + ")",
                            progress     = 0,
                            size         = "(Fetching....)",
                            transferType = FileTransferType.Download,
                            pausedBy     = PausedBy.None,
                        };

                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => {
                            lock (RunningTransfers) {
                                RunningTransfers.Add(fileTransferContainer);
                            }
                        }));

                        Thread _thread = new Thread(() => {
                            if (!(new Network.FileTransfer(fileTransferContainer)).AcceptFileTransfer(_peerSocket, _port1, this))
                            {
                                WriteToLogbox("File Transfer from " + _nick + " (" + _clientSocketRemoteEndPointString + ") failed");
                                lock (fileTransferContainer) {
                                    if (fileTransferContainer.status != FileTransferStatus.Cancelled)
                                    {
                                        fileTransferContainer.status = FileTransferStatus.Error;
                                    }
                                }
                            }
                            else
                            {
                                WriteToLogbox("File Transfer from " + _nick + " (" + _clientSocketRemoteEndPointString + ") done");
                                lock (fileTransferContainer) {
                                    fileTransferContainer.status = FileTransferStatus.Finished;
                                }
                            }
                        });
                        _thread.Name         = "File Transfer from " + _clientSocketRemoteEndPointString;
                        _thread.IsBackground = true;
                        _thread.Start();
                        break;

                    default:
                        _message = "Invalid MessageCode Received. The other client is most probably running a newer version of the application with a new Feature.. !!";
                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_ip, _message, _nick, 0); }));
                        WriteToLogbox("Unsupported MessageCode from- " + _nick + " (" + _clientSocketRemoteEndPointString + ") received");
                        Network.NetworkCommunicationManagers.Disconnect(_peerSocket);
                        new Thread(() => ConnectToPeerByIP(_ip))
                        {
                            Name = _ip + " handler", IsBackground = true
                        }.Start();
                        try
                        {
                            connectedPeersList.Remove(client);
                        }
                        catch (Exception) { }
                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_ip, "Attempting to reconnect", _nick, 0); }));
                        WriteToLogbox("Attempting to reconnect- " + _ip);
                        Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_ip, "Disconnected", _nick, 0); }));
                        WriteToLogbox("Disconnected- " + _ip);
                        return;
                    }
                }
                connectedPeersList.Remove(client);
            }
            catch (Exception) {
                try {
                    connectedPeersList.Remove(client);
                }
                catch (Exception) { }
            }
            Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { WriteToTab(_ip, "Disconnected", _nick, 0); }));
            WriteToLogbox("Disconnected- " + _ip);
        }
        private void SendFileButtonClicked(object sender, RoutedEventArgs e)
        {
            Button _btn       = ((Button)sender);
            string _buttonTag = (string)_btn.Tag;
            string _ip        = _buttonTag.Remove(0, _buttonTag.IndexOf(':') + 1);
            string _nick      = _buttonTag.Remove(_buttonTag.IndexOf(':'));

            ConnectedPeerDataContainer _peer = new ConnectedPeerDataContainer();

            _peer.nick   = "";
            _peer.socket = null;
            foreach (ConnectedPeerDataContainer _connectedPeer in connectedPeersList)
            {
                string _connectedPeerSocketString = _connectedPeer.socket.RemoteEndPoint.ToString();
                if (_connectedPeerSocketString.Remove(_connectedPeerSocketString.LastIndexOf(':')) == _ip)
                {
                    _peer = _connectedPeer;
                    break;
                }
            }

            if (_peer.socket == null)
            {
                WriteToTab(_ip, "Client not available", nick, 0);
                return;
            }

            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();

            // Display OpenFileDialog by calling ShowDialog method
            Nullable <bool> result = dlg.ShowDialog();

            // Get the selected file name and display in a TextBox
            if ((result.HasValue && result.Value))
            {
                string _filePath = dlg.FileName;

                FileTransferContainer fileTransferContainer = new FileTransferContainer()
                {
                    fileName     = System.IO.Path.GetFileName(_filePath),
                    ID           = _peer.nick + " (" + _ip + ")",
                    progress     = 0,
                    status       = FileTransferStatus.Running,
                    transferType = FileTransferType.Upload,
                    pausedBy     = PausedBy.None,
                };
                using (System.IO.FileStream _fs = new System.IO.FileStream(_filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite)) {
                    fileTransferContainer.sizeInBytes = _fs.Length;
                    fileTransferContainer.size        = Converters.DataConverter.bytesToReadableString(fileTransferContainer.sizeInBytes);
                }

                lock (RunningTransfers) {
                    RunningTransfers.Add(fileTransferContainer);
                }

                Thread _thread = new Thread(() => {
                    Network.NetworkCommunicationManagers.SendEncryptedIntOverSocket(_peer.socket, _peer.key, (int)PrimaryCommands.FileTransfer);

                    int _port1 = Network.NetworkCommunicationManagers.FindNextFreeTcpPort();
                    if (!Network.NetworkCommunicationManagers.SendIntOverSocket(_peer.socket, _port1))
                    {
                        WriteToLogbox("Failed to send file (Handshake Failed)");
                        lock (RunningTransfers) {
                            fileTransferContainer.status = FileTransferStatus.Error;
                        }
                        return;
                    }
                    ;

                    new Network.FileTransfer(fileTransferContainer, _filePath, _port1);
                });
                _thread.Name         = "File Transfer Handler";
                _thread.IsBackground = true;
                _thread.Start();
            }
        }