/// <summary> /// Cierra posibles conexiones a disco que puedan quedar abiertos /// </summary> public override void close() { try { FileHandlerStream.Close(); } catch (ThreadAbortException e) { throw e; } catch (Exception) { } }
/// <summary> /// Atiende una solicitud de envĂo de parte /// </summary> public void sendPartMessage( ) { try { long pointer = currentPart * PartSize; if (pointer < FileHandlerStream.Length) { int dataSize; if (currentPart == PartsNumber - 1) { dataSize = (int)(FileHandlerStream.Length - PartSize * (PartsNumber - 1)); } else { dataSize = PartSize; } byte[] fileData = new byte[dataSize]; FileHandlerStream.Seek(pointer, SeekOrigin.Begin); int n = FileHandlerStream.Read(fileData, 0, fileData.Length); while (n < fileData.Length && n != 0) { int m = FileHandlerStream.Read(fileData, n, fileData.Length - n); if (m == 0) { break; } else { n += m; } } sendMessage(new FilePartMessage(RemoteNetUser, Id, currentPart, fileData)); currentPart++; this.State = FileMessageHandlerState.ACTIVE; } } catch (ThreadAbortException e) { throw e; } catch (Exception e) { sendMessage(new FileErrorMessage(RemoteNetUser, Id)); this.State = FileMessageHandlerState.ERROR; this.Error = e.Message; close(); } }
/// <summary> /// Atiende un mensaje que contiene una parte del archivo y escribe dicha parte a disco /// </summary> /// <param name="message">El mensaje con la parte del archivo</param> private void receivePartMessage(FilePartMessage message) { lock (thisLock) { try { long pointer = message.PartId * PartSize; if (pointer < FileInformation.Size && parts[message.PartId].Status == FilePartStatus.NOTRECEIVED) { FileHandlerStream.Seek(pointer, SeekOrigin.Begin); FileHandlerStream.Write(message.FilePart, 0, message.FilePart.Length); parts[message.PartId].Status = FilePartStatus.RECEIVED; partsLoaded++; } bool completed = true; for (long i = 0; i < parts.Length; i++) { if (parts[i].Status == FilePartStatus.NOTRECEIVED) { completed = false; break; } } if (completed) { sendMessage(new FileCompleteMessage(RemoteNetUser, Id)); this.State = FileMessageHandlerState.COMPLETED; } else { State = FileMessageHandlerState.ACTIVE; } } catch (ThreadAbortException e) { throw e; } catch (Exception e) { sendMessage(new FileErrorMessage(RemoteNetUser, Id)); this.State = FileMessageHandlerState.ERROR; this.Error = e.Message; close(); } } }