private void AcceptTcpClient(object param)
        {
            TcpClient client = (TcpClient)param;

            try
            {
                byte[]        bytes         = new byte[256];
                StringBuilder stringBuilder = new StringBuilder();
                NetworkStream networkStream = client.GetStream();

                int i;
                while ((i = networkStream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    stringBuilder.Append(Encoding.UTF8.GetString(bytes, 0, i));
                    if (i < bytes.Length)
                    {
                        break;
                    }
                }

                // Sending a list of files?
                try
                {
                    SendFiles sendFiles = Helper.XmlDeserialize <SendFiles>(stringBuilder.ToString());

                    if (UserWantToSendFiles != null)
                    {
                        AirServer.IPEndPointHolder ipEndPointHolder = new IPEndPointHolder();
                        ipEndPointHolder.IpEndPoint  = new IPEndPoint(IPAddress.Parse(sendFiles.UserAddress.Address), sendFiles.UserAddress.Port);
                        ipEndPointHolder.IsAvailable = true;

                        UserWantToSendFiles(sendFiles, ipEndPointHolder, client);
                    }
                    else
                    {
                        client.Close();
                    }
                }
                catch
                {
                }
            }
            catch
            {
                client.Close();
            }
        }
 public void ReceiveFilesFromAsync(IPEndPointHolder ipEndPoint, TcpClient client, SendFiles sendFiles, bool receive, object state,
                                   UserReceiveFilesProgress progress, UserReceiveFilesComplete complete)
 {
     new Thread(new ThreadStart(() =>
     {
         try
         {
             ReceiveFilesFrom(ipEndPoint, client, sendFiles, receive, state, progress);
             if (complete != null)
             {
                 complete(sendFiles, ipEndPoint, state, null);
             }
         }
         catch (Exception e)
         {
             if (complete != null)
             {
                 complete(sendFiles, ipEndPoint, state, e);
             }
         }
     })).Start();
 }
        private void IdentificationMe()
        {
            using (UdpClient udpClient = new UdpClient())
            {
                udpClient.EnableBroadcast = true;

                IPEndPoint udpBroadcastPoint = new IPEndPoint(IPAddress.Any, Udp.DefaultPort);
                udpClient.Client.Bind(udpBroadcastPoint);

                while (this.identificationThread.IsAlive)
                {
                    try
                    {
                        TimeSpan     timeToWait = TimeSpan.FromMilliseconds(50);
                        IAsyncResult result     = udpClient.BeginReceive(null, null);
                        result.AsyncWaitHandle.WaitOne(timeToWait);
                        try
                        {
                            IPEndPoint remotePoint = null;
                            byte[]     buffer      = udpClient.EndReceive(result, ref remotePoint);

                            try
                            {
                                RequestPresence requestPresence = Helper.XmlDeserialize <RequestPresence>(Encoding.UTF8.GetString(buffer));

                                Log.WriteLn("Recv: {0} - {1}", requestPresence.Status, remotePoint.Address.ToString());

                                if ("presence".Equals(requestPresence.Status))
                                {
                                    IPEndPointHolder ipEndPointHolder = listOfAvailablePCs.Find(
                                        item => item.IpEndPoint.Address.Equals(IPAddress.Parse(requestPresence.UserAddress.Address)));
                                    if (ipEndPointHolder == null)
                                    {
                                        ipEndPointHolder            = new IPEndPointHolder();
                                        ipEndPointHolder.IpEndPoint = new IPEndPoint(IPAddress.Parse(requestPresence.UserAddress.Address),
                                                                                     requestPresence.UserAddress.Port);
                                        ipEndPointHolder.IsAvailable = true;

                                        listOfAvailablePCs.Add(ipEndPointHolder);
                                        if (UserPresenceReceivedRequest != null)
                                        {
                                            UserPresenceReceivedRequest(requestPresence, ipEndPointHolder);
                                        }
                                    }
                                    else
                                    {
                                        ipEndPointHolder.IsAvailable = true;
                                    }
                                }

                                if ("ask".Equals(requestPresence.Status))
                                {
                                    UserInfo userInfo  = null;
                                    bool     isVisible = true;

                                    if (UserPresenceReceivedAsk != null)
                                    {
                                        UserPresenceReceivedAsk(out isVisible, ref userInfo);
                                    }

                                    if (isVisible)
                                    {
                                        Udp.Send(Helper.XmlSerialize <RequestPresence>(new RequestPresence()
                                        {
                                            Status      = "presence",
                                            UserAddress = new UserAddress()
                                            {
                                                Address = Helper.LocalIPAddress(),
                                                Port    = Udp.DefaultPort
                                            },
                                            UserInfo = userInfo
                                        }), new IPEndPoint(IPAddress.Parse(requestPresence.UserAddress.Address),
                                                           requestPresence.UserAddress.Port));

                                        Log.WriteLn("Send: presence - {0}", requestPresence.UserAddress.Address.ToString());

                                        IPEndPointHolder ipEndPointHolder = listOfAvailablePCs.Find(
                                            item => item.IpEndPoint.Address.Equals(IPAddress.Parse(requestPresence.UserAddress.Address)));
                                        if (ipEndPointHolder == null)
                                        {
                                            Udp.Send(Helper.XmlSerialize <RequestPresence>(new RequestPresence()
                                            {
                                                Status      = "ask",
                                                UserAddress = new UserAddress()
                                                {
                                                    Address = Helper.LocalIPAddress(),
                                                    Port    = Udp.DefaultPort
                                                },
                                                UserInfo = null
                                            }), new IPEndPoint(IPAddress.Parse(requestPresence.UserAddress.Address),
                                                               requestPresence.UserAddress.Port));

                                            Log.WriteLn("Send: ask - {0}", requestPresence.UserAddress.Address.ToString());
                                        }
                                        else
                                        {
                                            ipEndPointHolder.IsAvailable = true;
                                        }
                                    }
                                }

                                if ("left".Equals(requestPresence.Status))
                                {
                                    IPEndPointHolder ipEndPointHolder = listOfAvailablePCs.Find(
                                        item => item.IpEndPoint.Address.Equals(remotePoint.Address));
                                    if (ipEndPointHolder != null)
                                    {
                                        ipEndPointHolder.IsAvailable = false;

                                        if (UserPresenceGotTimeout != null)
                                        {
                                            UserPresenceGotTimeout(ipEndPointHolder);
                                        }

                                        listOfAvailablePCs.Remove(ipEndPointHolder);
                                    }
                                }
                            }
                            catch
                            {
                            }
                        }
                        catch
                        {
                        }
                    }
                    catch (ThreadAbortException)
                    {
                        UserInfo userInfo  = null;
                        bool     isVisible = false;

                        if (UserPresenceReceivedAsk != null)
                        {
                            UserPresenceReceivedAsk(out isVisible, ref userInfo);
                        }

                        foreach (IPEndPointHolder ipEndPointHolder in listOfAvailablePCs)
                        {
                            Udp.Send(Helper.XmlSerialize <RequestPresence>(new RequestPresence()
                            {
                                Status      = "left",
                                UserAddress = new UserAddress()
                                {
                                    Address = Helper.LocalIPAddress(),
                                    Port    = Udp.DefaultPort
                                },
                                UserInfo = null
                            }), ipEndPointHolder.IpEndPoint);

                            Log.WriteLn("Send: left - {0}", ipEndPointHolder.IpEndPoint.Address.ToString());
                        }
                    }
                }
            }
        }
        public void ReceiveFilesFrom(IPEndPointHolder ipEndPoint, TcpClient client, SendFiles sendFiles, bool receive, object state,
                                     UserReceiveFilesProgress progress)
        {
            try
            {
                byte[]        bytes         = new byte[1024];
                NetworkStream networkStream = client.GetStream();
                {
                    byte[] buffer = Encoding.UTF8.GetBytes(Helper.XmlSerialize <SendFilesData>(new SendFilesData()
                    {
                        UserAddress = new UserAddress()
                        {
                            Address = Helper.LocalIPAddress(),
                            Port    = AirClient.DefaultPort
                        },
                        Status = receive ? "allowed" : "denied"
                    }));
                    networkStream.Write(buffer, 0, buffer.Length);
                }

                if (!receive)
                {
                    throw new OperationCanceledException();
                }

                int  i      = 0;
                long n      = 0;
                bool cancel = false;

                long totalSize = 0, receivedTotal = 0, receivedCurrent = 0;

                foreach (SendFile file in sendFiles.Files)
                {
                    totalSize += file.Size;
                }

                string folder = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\Air File Exchange\\";
                Directory.CreateDirectory(folder);

                foreach (SendFile file in sendFiles.Files)
                {
                    using (FileStream fileStream = new FileStream(folder + file.Name, FileMode.OpenOrCreate, FileAccess.Write))
                    {
                        fileStream.SetLength(0);

                        receivedCurrent = 0;

                        if (i - n > 0)
                        {
                            fileStream.Write(bytes, (int)n, i - (int)n);

                            receivedCurrent += i - (int)n;
                            receivedTotal   += i - (int)n;

                            if (progress != null)
                            {
                                progress(file, ipEndPoint, receivedCurrent, file.Size, receivedTotal, totalSize, state, out cancel);
                            }
                        }

                        while (!cancel && (i = networkStream.Read(bytes, 0, bytes.Length)) != 0)
                        {
                            n = file.Size - fileStream.Length;
                            if (i <= n)
                            {
                                n = i;
                            }
                            fileStream.Write(bytes, 0, (int)n);

                            receivedCurrent += n;
                            receivedTotal   += n;

                            if (progress != null)
                            {
                                progress(file, ipEndPoint, receivedCurrent, file.Size, receivedTotal, totalSize, state, out cancel);
                            }

                            if (file.Size == fileStream.Length)
                            {
                                break;
                            }
                        }
                    }
                    if (cancel)
                    {
                        throw new OperationCanceledException();
                    }
                }
                if (totalSize > receivedTotal)
                {
                    throw new OperationCanceledException();
                }
            }
            finally
            {
                client.Close();
            }
        }