public void AddChunk(FileTransferPartMessage chunk) { if (!ReceiveCancelToken.IsCancellationRequested) { messageQueue.Add(chunk); } }
private void ReceiveLoop() { try { ISLogger.Write($"Downloading {FileName} to {FolderPath + "\\" + FileName}"); fileWriteStream = new FileStream(FolderPath + "\\" + FileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read); fileWriteStream.Seek(0, SeekOrigin.Begin); while (!Complete && !ReceiveCancelToken.IsCancellationRequested) { FileTransferPartMessage msg = messageQueue.Take(ReceiveCancelToken.Token); if (msg.PartNumber == 0) { fileWriteStream.Position = 0; } else { fileWriteStream.Position = msg.PartNumber * Settings.FileTransferPartSize; } fileWriteStream.Write(msg.PartData, 0, msg.PartData.Length); if (msg.PartNumber != 0) { PercentComplete = ((double)msg.PartNumber / (double)msg.PartCount) * 100; } if (msg.PartNumber == msg.PartCount) { Complete = true; fileWriteStream.Close(); OnReceiveComplete(); } } } catch (OperationCanceledException) { ISLogger.Write($"File tranfer {FileName} cancelled"); fileWriteStream.Dispose(); //we want to delete the file if cancelled try { if (File.Exists(FolderPath + "\\" + FileName)) { File.Delete(FolderPath + "\\" + FileName); } }catch (Exception) { } }catch (Exception ex) { ISLogger.Write($"FileReceiveHandler->An error occurred while receiving file '{FileName}': {ex.Message}"); ISLogger.Write(ex.StackTrace); fileWriteStream.Dispose(); ReceiveComplete?.Invoke(this, null); } }
public FileReceiveHandler(FileTransferPartMessage firstPart, string folderPath) { FolderPath = folderPath; TransferId = firstPart.FileTransferId; FileName = firstPart.FileName; Complete = false; PercentComplete = 0; messageQueue.Add(firstPart); receiveTask = new Task(ReceiveLoop); receiveTask.Start(); }
private void ReadFilePart(FileTransferPartMessage fileMsg) { if (fileMsg.PartNumber == 0) { FileReceiveHandler handler = new FileReceiveHandler(fileMsg, FileReceivePath); handler.ReceiveComplete += Handler_ReceiveComplete; receiveHandlers.Add(handler); } else { FileReceiveHandler handle = ReceiveHandlerFromTransferId(fileMsg.FileTransferId); if (handle != null) { handle.AddChunk(fileMsg); } } }
private void SocketReceiveThreadLoop() { try { ISLogger.Write("Socket receive thread started"); byte[] header = new byte[4]; while (!cancelToken.IsCancellationRequested) { int hRem = 4; int hPos = 0; do { int hIn = tcpSocket.Receive(header, hPos, hRem, 0); //make sure we read all 4 bytes of header hPos += hIn; hRem -= hIn; } while (hRem > 0); int pSize = BitConverter.ToInt32(header, 0); if (pSize > Settings.ClientMaxPacketSize) { OnConnectionError(new Exception("Connection error: Server sent invalid packet size of " + pSize), ServerSocketState.ConnectionError); return; } int dRem = pSize; int bPos = 4; do { int bIn = tcpSocket.Receive(socketBuffer, bPos, dRem, 0); bPos += bIn; dRem = pSize - bPos + 4; } while (dRem > 0); MessageType cmd = (MessageType)socketBuffer[4]; switch (cmd) { case MessageType.Input: { InputMessage msg = InputMessage.FromBytes(socketBuffer); InputReceived?.Invoke(this, msg.Input); break; } case MessageType.ServerOK: ISLogger.Write("Server sent OK"); SetState(ServerSocketState.Connected); MessageReceived?.Invoke(this, cmd); break; case MessageType.SetClipboardText: ProcessCbCopy(ClipboardSetTextMessage.FromBytes(socketBuffer)); break; case MessageType.FileTransferPart: FileTransferPartMessage fileMsg = FileTransferPartMessage.FromBytes(ref socketBuffer); ReadFilePart(fileMsg); break; default: MessageReceived?.Invoke(this, cmd); break; } } }catch (ObjectDisposedException) { }catch (Exception ex) { if (!disconnecting) { disconnecting = true; } else { return; } if (cancelToken.IsCancellationRequested) { return; } if (!ex.Message.Contains("WSACancelBlockingCall")) { //ISLogger.Write("Serversocket error: " + ex.Message); } OnConnectionError(ex, ServerSocketState.ConnectionError); } }