public void IniciarTransferencia()
        {
            file_stream = new FileStream(item.Ruta, FileMode.OpenOrCreate, FileAccess.Read);
            int tamaño_paquetes = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(file_stream.Length) / Convert.ToDouble(num_particiones)));

            for (int i = 0; i < num_particiones; i++)
            {
                Particion nueva_parte = new Particion(this, file_stream, i * tamaño_paquetes, (i + 1) * tamaño_paquetes, i, listener);
                partes.Add(nueva_parte);
                NotifyPropertyChanged("Partes");

                new Thread(nueva_parte.IniciarTransferencia).Start();
            }

            while (!TransferenciaFinalizada())
            {
                ;
            }

            finalizada = true;
            NotifyPropertyChanged("Finalizada");

            lock (partes)
                foreach (Particion part in partes)
                {
                    part.Cliente.Close();
                }

            file_stream.Close();
        }
        public void EliminarParte(bool is_server)
        {
            Particion to_delete = partes[partes.Count - 1];
            Particion new_end   = partes[partes.Count - 2];

            lock (partes)
            {
                lock (new_end)
                {
                    new_end.Fin = to_delete.Fin;
                    new_end.NotifyPropertyChanged("Fin");
                }

                lock (to_delete)
                {
                    to_delete.Fin        = to_delete.Progreso;
                    to_delete.Finalizado = true;
                    to_delete.NotifyPropertyChanged("Fin");
                }

                partes.Remove(to_delete);
            }

            NotifyPropertyChanged("Partes");
        }
        public void AgregarParte(bool is_server)
        {
            Int64     menor = Int64.MaxValue;
            Particion aux   = null;

            foreach (Particion part in partes)
            {
                if (part.Progreso < menor)
                {
                    aux   = part;
                    menor = part.Progreso;
                }
            }

            int nuevo_fin = 0;
            int viejo_fin = 0;

            lock (aux)
            {
                int fin      = aux.Fin;
                int progreso = aux.Progreso;

                int mitad = (fin - progreso) / 2;
                viejo_fin = aux.Fin;
                nuevo_fin = aux.Fin - mitad;

                aux.Fin = nuevo_fin;

                aux.NotifyPropertyChanged("Fin");
            }

            lock (partes)
            {
                if (is_server)
                {
                    Particion nueva_parte = new Particion(this, file_stream, nuevo_fin, viejo_fin, partes.Count, listener);
                    partes.Add(nueva_parte); partes.Add(nueva_parte);
                    NotifyPropertyChanged("Partes");

                    new Thread(nueva_parte.IniciarTransferencia).Start();
                }
                else
                {
                    TcpClient cliente     = new TcpClient(Cliente.HOST, Cliente.PORT + 1);
                    Particion nueva_parte = new Particion(this, file_stream, partes.Count, cliente);
                    partes.Add(nueva_parte);
                    NotifyPropertyChanged("Partes");

                    new Thread(nueva_parte.SolicitarTransferencia).Start();
                }
            }
        }
        public void SolicitarTransferencia()
        {
            file_stream = new FileStream(item.Ruta, FileMode.OpenOrCreate, FileAccess.Write);

            for (int i = 0; i < num_particiones; i++)
            {
                TcpClient cliente = new TcpClient(Cliente.HOST, Cliente.PORT + 1);

                Particion nueva_parte = new Particion(this, file_stream, i, cliente);

                lock (partes)
                    partes.Add(nueva_parte);

                NotifyPropertyChanged("Partes");

                new Thread(nueva_parte.SolicitarTransferencia).Start();
            }

            while (!TransferenciaFinalizada())
            {
                ;
            }

            finalizada = true;
            NotifyPropertyChanged("Finalizada");

            lock (partes)
                foreach (Particion part in partes)
                {
                    part.Cliente.Close();
                }

            file_stream.Close();

            //Para abrir el archivo que se ha descargado
            if (item.Extension.Equals("mp3") ||
                item.Extension.Equals("wav"))
            {
                AudioPlayer player = new AudioPlayer(item);
                System.Windows.Threading.Dispatcher.Run();
            }
            else if (item.Extension.Equals("jpg") ||
                     item.Extension.Equals("png") ||
                     item.Extension.Equals("gif"))
            {
                ImagePlayer player = new ImagePlayer(item);
                System.Windows.Threading.Dispatcher.Run();
            }
            else
            {
                try
                {
                    Process process = new Process();
                    process.StartInfo.FileName = item.Ruta;
                    process.Start();
                    process.WaitForExit();
                }
                catch (Win32Exception)
                {
                    MessageBox.Show("No hay aplicación por defecto para abrir el archivo descargado");
                }
            }
        }