file_transfer_message_handler.h 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef REMOTING_HOST_FILE_TRANSFER_FILE_TRANSFER_MESSAGE_HANDLER_H_
  5. #define REMOTING_HOST_FILE_TRANSFER_FILE_TRANSFER_MESSAGE_HANDLER_H_
  6. #include <cstdint>
  7. #include <memory>
  8. #include <string>
  9. #include <vector>
  10. #include "base/containers/queue.h"
  11. #include "base/memory/weak_ptr.h"
  12. #include "remoting/host/file_transfer/buffered_file_writer.h"
  13. #include "remoting/host/file_transfer/file_operations.h"
  14. #include "remoting/protocol/file_transfer_helpers.h"
  15. #include "remoting/protocol/named_message_pipe_handler.h"
  16. #include "third_party/abseil-cpp/absl/types/optional.h"
  17. namespace remoting {
  18. constexpr char kFileTransferDataChannelPrefix[] = "filetransfer-";
  19. class FileTransferMessageHandler : public protocol::NamedMessagePipeHandler {
  20. public:
  21. FileTransferMessageHandler(const std::string& name,
  22. std::unique_ptr<protocol::MessagePipe> pipe,
  23. std::unique_ptr<FileOperations> file_operations);
  24. ~FileTransferMessageHandler() override;
  25. // protocol::NamedMessagePipeHandler implementation.
  26. void OnConnected() override;
  27. void OnIncomingMessage(std::unique_ptr<CompoundBuffer> message) override;
  28. void OnDisconnecting() override;
  29. private:
  30. enum State {
  31. // Initial state.
  32. kConnected,
  33. // Writing a file from the client.
  34. kWriting,
  35. // Reading a file and sending to the client.
  36. kReading,
  37. // Reading complete and waiting for confirmation from client.
  38. kEof,
  39. // End states
  40. // File successfully written.
  41. kClosed,
  42. // An error occured or the transfer was canceled.
  43. kFailed,
  44. };
  45. // Handlers for specific messages from the client.
  46. void OnMetadata(protocol::FileTransfer_Metadata metadata);
  47. void OnData(std::vector<std::uint8_t> data);
  48. void OnEnd();
  49. void OnRequestTransfer();
  50. void OnSuccess();
  51. void OnError(protocol::FileTransfer_Error error);
  52. // File reading callbacks.
  53. void OnOpenResult(FileOperations::Reader::OpenResult result);
  54. void OnReadResult(FileOperations::Reader::ReadResult result);
  55. void OnChunkSent();
  56. // File writing callbacks.
  57. void OnWritingComplete();
  58. void OnWriteError(protocol::FileTransfer_Error error);
  59. // Reads the next chunk in reading mode.
  60. void ReadNextChunk();
  61. // Cancels any current operation and transitions to failed state.
  62. void Cancel();
  63. // Sends an error message to the client.
  64. void SendError(protocol::FileTransfer_Error error);
  65. // Handles an unexpected message being received.
  66. void UnexpectedMessage(base::Location from_here, const char* message);
  67. void SetState(State state);
  68. State state_ = kConnected;
  69. std::unique_ptr<FileOperations> file_operations_;
  70. absl::optional<BufferedFileWriter> buffered_file_writer_;
  71. std::unique_ptr<FileOperations::Reader> file_reader_;
  72. std::size_t queued_chunks_ = 0;
  73. base::WeakPtrFactory<FileTransferMessageHandler> weak_ptr_factory_{this};
  74. };
  75. } // namespace remoting
  76. #endif // REMOTING_HOST_FILE_TRANSFER_FILE_TRANSFER_MESSAGE_HANDLER_H_