/// <summary> /// Envía un mensaje de petición de partes del archivo al usuario remoto y marca el estado del manejador como esperando /// </summary> public override void attendMessage(Message message) { if (message.Type == SubProtocol.FileTransfer.Types.FILEPARTMESSAGE) { FilePartMessage filePartMessage = (FilePartMessage)message; receivePartMessage(filePartMessage); } }
public void FilePartManager(FilePartMessage message) { using (FileStream File = new FileStream(DownloadDirr + DownloadFile, FileMode.Append)) { byte[] array = message.Data; File.Write(array, 0, array.Length); } }
/// <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(); } } }
/// <summary> /// Se gatilla cuando no es posible entregar un mensaje /// </summary> /// <param name="message">El mensaje no entregado</param> public void errorMessage(Message message) { switch (message.Type) { case SubProtocol.FileTransfer.Types.FILEREQUESTMESSAGE: { FileRequestMessage fileRequestMessage = (FileRequestMessage)message; lock (fileMessageHandlerLock) { if (activeDownloads.Contains(fileRequestMessage.FileHandlerId)) { FileMessageHandler fileMessageHandler = (FileMessageHandler)activeDownloads[fileRequestMessage.FileHandlerId]; controlFileHandler.downloadFileFailed(fileMessageHandler.Id.ToString()); fileMessageHandler.close(); activeDownloads.Remove(fileMessageHandler.Id); } } break; } case SubProtocol.FileTransfer.Types.FILEERRORMESSAGES: { break; } case SubProtocol.FileTransfer.Types.FILEPARTMESSAGE: { FilePartMessage filePartMessage = (FilePartMessage)message; lock (fileMessageHandlerLock) { if (activeUploads.Contains(filePartMessage.FileHandlerId)) { FileMessageHandler fileMessageHandler = (FileMessageHandler)activeUploads[filePartMessage.FileHandlerId]; controlFileHandler.uploadFileFailed(fileMessageHandler.Id.ToString()); fileMessageHandler.close(); activeUploads.Remove(fileMessageHandler.Id); } } break; } case SubProtocol.FileTransfer.Types.FILEWAITMESSAGE: { FileWaitMessage fileWaitMessage = (FileWaitMessage)message; lock (fileMessageHandlerLock) { if (activeDownloads.Contains(fileWaitMessage.FileHandlerId)) { FileMessageHandler fileMessageHandler = (FileMessageHandler)activeDownloads[fileWaitMessage.FileHandlerId]; controlFileHandler.downloadFileFailed(fileMessageHandler.Id.ToString()); fileMessageHandler.close(); activeDownloads.Remove(fileMessageHandler.Id); } else if (activeUploads.Contains(fileWaitMessage.FileHandlerId)) { FileMessageHandler fileMessageHandler = (FileMessageHandler)activeUploads[fileWaitMessage.FileHandlerId]; controlFileHandler.uploadFileFailed(fileMessageHandler.Id.ToString()); fileMessageHandler.close(); activeUploads.Remove(fileMessageHandler.Id); } } break; } case SubProtocol.FileTransfer.Types.FILECOMPLETEMESSAGE: { break; } case SubProtocol.FileTransfer.Types.FILELISTREQUESTMESSAGE: { break; } case SubProtocol.FileTransfer.Types.FILELISTMESSAGE: { break; } } }
/// <summary> /// Se gatilla cuando se recibe un mensaje /// </summary> /// <param name="message">El mensaje recibido</param> public void proccessMessage(Message message) { switch (message.Type) { case SubProtocol.FileTransfer.Types.FILEREQUESTMESSAGE: { FileRequestMessage fileRequestMessage = (FileRequestMessage)message; FileInformation fileInformation = fileData.FileList.getFileInformation(fileRequestMessage.FileId); if (fileInformation != null) { FileMessageSender fileMessageSender = new FileMessageSender(fileRequestMessage.SenderNetUser, fileRequestMessage.FileHandlerId, sendMessageDelegate, fileInformation, fileData); lock (fileMessageHandlerLock) { if (!activeUploads.Contains(fileMessageSender.Id)) { if (fileMessageUploadQueue.put(fileMessageSender)) { controlFileHandler.uploadFileQueued(fileRequestMessage.SenderNetUser, fileMessageSender.Id.ToString(), fileInformation.Name); } } } } else { FileErrorMessage fileErrorMessage = new FileErrorMessage(fileRequestMessage.SenderNetUser, fileRequestMessage.FileHandlerId); sendMessageEvent(fileErrorMessage); } break; } case SubProtocol.FileTransfer.Types.FILEERRORMESSAGES: { FileErrorMessage fileErrorMessage = (FileErrorMessage)message; lock (fileMessageHandlerLock) { if (activeUploads.Contains(fileErrorMessage.FileHandlerId)) { FileMessageHandler fileMessageHandler = (FileMessageHandler)activeUploads[fileErrorMessage.FileHandlerId]; controlFileHandler.uploadFileFailed(fileMessageHandler.Id.ToString()); fileMessageHandler.close(); activeUploads.Remove(fileMessageHandler.Id); } else if (activeDownloads.Contains(fileErrorMessage.FileHandlerId)) { FileMessageHandler fileMessageHandler = (FileMessageHandler)activeDownloads[fileErrorMessage.FileHandlerId]; controlFileHandler.downloadFileFailed(fileMessageHandler.Id.ToString()); fileMessageHandler.close(); activeDownloads.Remove(fileMessageHandler.Id); } } break; } case SubProtocol.FileTransfer.Types.FILEPARTMESSAGE: { FilePartMessage filePartMessage = (FilePartMessage)message; lock (fileMessageHandlerLock) { if (activeDownloads.Contains(filePartMessage.FileHandlerId)) { FileMessageHandler fileMessageHandler = (FileMessageHandler)activeDownloads[filePartMessage.FileHandlerId]; fileMessageHandler.attendMessage(filePartMessage); fileMessageHandler.waitUp(fileData.FileRiseUp); } else { FileErrorMessage fileErrorMessage = new FileErrorMessage(filePartMessage.SenderNetUser, filePartMessage.FileHandlerId); sendMessageEvent(fileErrorMessage); } } break; } case SubProtocol.FileTransfer.Types.FILEWAITMESSAGE: { FileWaitMessage fileWaitMessage = (FileWaitMessage)message; lock (fileMessageHandlerLock) { if (activeDownloads.Contains(fileWaitMessage.FileHandlerId)) { FileMessageHandler fileMessageHandler = (FileMessageHandler)activeDownloads[fileWaitMessage.FileHandlerId]; fileMessageHandler.waitUp(fileData.FileRiseUp); } else if (activeUploads.Contains(fileWaitMessage.FileHandlerId)) { FileMessageHandler fileMessageHandler = (FileMessageHandler)activeUploads[fileWaitMessage.FileHandlerId]; fileMessageHandler.waitUp(fileData.FileRiseUp); } else { if (!fileMessageDownloadQueue.contains(fileWaitMessage.FileHandlerId) && !fileMessageUploadQueue.contains(fileWaitMessage.FileHandlerId)) { FileErrorMessage fileErrorMessage = new FileErrorMessage(fileWaitMessage.SenderNetUser, fileWaitMessage.FileHandlerId); sendMessageEvent(fileErrorMessage); } } } break; } case SubProtocol.FileTransfer.Types.FILECOMPLETEMESSAGE: { FileCompleteMessage fileCompleteMessage = (FileCompleteMessage)message; lock (fileMessageHandlerLock) { if (activeUploads.Contains(fileCompleteMessage.FileHandlerId)) { FileMessageHandler fileMessageHandler = (FileMessageHandler)activeUploads[fileCompleteMessage.FileHandlerId]; fileMessageHandler.State = FileMessageHandlerState.COMPLETED; } } break; } case SubProtocol.FileTransfer.Types.FILELISTREQUESTMESSAGE: { FileListRequestMessage fileListRequestMessage = (FileListRequestMessage)message; FileListMessage fileListMessage = new FileListMessage(fileListRequestMessage.SenderNetUser, fileData.FileList); sendMessageEvent(fileListMessage); break; } case SubProtocol.FileTransfer.Types.FILELISTMESSAGE: { FileListMessage fileListMessage = (FileListMessage)message; controlFileListHandler.addFileList(fileListMessage.SenderNetUser, fileListMessage.FileList); break; } } }