Пример #1
0
 public void AddChunk(FileTransferPartMessage chunk)
 {
     if (!ReceiveCancelToken.IsCancellationRequested)
     {
         messageQueue.Add(chunk);
     }
 }
Пример #2
0
        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);
            }
        }
Пример #3
0
 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();
 }
Пример #4
0
 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);
         }
     }
 }
Пример #5
0
        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);
            }
        }