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"); } } }