| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef REMOTING_PROTOCOL_NAMED_MESSAGE_PIPE_HANDLER_H_ |
| #define REMOTING_PROTOCOL_NAMED_MESSAGE_PIPE_HANDLER_H_ |
| |
| #include <memory> |
| #include <string> |
| |
| #include "base/callback.h" |
| #include "base/sequenced_task_runner_helpers.h" |
| #include "base/threading/thread_checker.h" |
| #include "remoting/protocol/message_pipe.h" |
| |
| namespace google { |
| namespace protobuf { |
| class MessageLite; |
| } // namespace protobuf |
| } // namespace google |
| |
| namespace remoting { |
| |
| class CompoundBuffer; |
| |
| namespace protocol { |
| |
| // A base class to handle data from a named MessagePipe. This class manages the |
| // lifetime itself: it deletes itself once the MessagePipe is closed or the |
| // derived instance actively calls Close() function. |
| class NamedMessagePipeHandler : public MessagePipe::EventHandler { |
| protected: |
| // The callers should create instances of derived classes instead of this |
| // class. So hide the constructor. |
| NamedMessagePipeHandler(const std::string& name, |
| std::unique_ptr<MessagePipe> pipe); |
| |
| ~NamedMessagePipeHandler() override; |
| |
| // Closes the channel and eventually destructs this instance. No operations |
| // should be performed after executing this function. |
| void Close(); |
| |
| const std::string& pipe_name() const { return name_; } |
| |
| // Whether |pipe_| has been connected. |
| bool connected() const { return is_connected_; } |
| |
| // Sends the message through the pipe. This function should only be called |
| // once connected() returns true. See comments of |
| // remoting::protocol::MessagePipe::Send() for details. |
| void Send(const google::protobuf::MessageLite& message, |
| base::OnceClosure done); |
| |
| // Derived classes can override these functions to receive data from the |
| // connection or observe the connection state. These functions will not be |
| // called unless |pipe_| has been opened. |
| virtual void OnIncomingMessage(std::unique_ptr<CompoundBuffer> message); |
| virtual void OnConnected(); |
| virtual void OnDisconnecting(); |
| |
| private: |
| friend class base::DeleteHelper<NamedMessagePipeHandler>; |
| |
| // MessagePipe::EventHandler implementation. |
| void OnMessagePipeOpen() override; |
| void OnMessageReceived(std::unique_ptr<CompoundBuffer> message) override; |
| void OnMessagePipeClosed() override; |
| |
| const std::string name_; |
| std::unique_ptr<MessagePipe> pipe_; |
| base::ThreadChecker thread_checker_; |
| bool is_connected_ = false; |
| }; |
| |
| } // namespace protocol |
| } // namespace remoting |
| |
| #endif // REMOTING_PROTOCOL_NAMED_MESSAGE_PIPE_HANDLER_H_ |