| // Copyright 2018 The Fuchsia 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 LIB_FIDL_CPP_INTERNAL_STUB_CONTROLLER_H_ | |
| #define LIB_FIDL_CPP_INTERNAL_STUB_CONTROLLER_H_ | |
| #include <lib/fidl/cpp/internal/message_handler.h> | |
| #include <lib/fidl/cpp/internal/message_reader.h> | |
| #include <lib/fidl/cpp/internal/message_sender.h> | |
| #include <lib/fidl/cpp/internal/stub.h> | |
| #include <lib/fidl/cpp/message.h> | |
| #include <lib/zx/channel.h> | |
| #include <memory> | |
| namespace fidl { | |
| namespace internal { | |
| class WeakStubController; | |
| // Controls the server endpoint of a FIDL channel. | |
| // | |
| // A |StubController| controls the protocol-specific "stub" object. Stub | |
| // objects are used on the server endpoint of a FIDL channel to decode messages | |
| // received over the channel and dispatch them to an implementation of the | |
| // protocol. | |
| class StubController final : public MessageHandler, public MessageSender { | |
| public: | |
| StubController(); | |
| ~StubController() override; | |
| StubController(const StubController&) = delete; | |
| StubController& operator=(const StubController&) = delete; | |
| // The |MessageReader| that is listening for messages sent by the client. | |
| MessageReader& reader() { return reader_; } | |
| const MessageReader& reader() const { return reader_; } | |
| // The protocol-specific object that decodes messages and dispatches them to | |
| // an implementation of the protocol. | |
| // | |
| // The stub must be set to a non-null value before messages are read from the | |
| // underlying channel. Typically, the caller will set a non-null stub before | |
| // binding a channel to the |MessageReader|. | |
| Stub* stub() const { return stub_; } | |
| void set_stub(Stub* stub) { stub_ = stub; } | |
| // Send a message over the channel. | |
| // | |
| // Returns an error if the message fails to encode properly or if the message | |
| // cannot be written to the channel. | |
| zx_status_t Send(const fidl_type_t* type, Message message) final; | |
| private: | |
| // Called by the |MessageReader| when a message arrives on the channel from | |
| // the client. | |
| // | |
| // The message will be dispatched using the |stub()|. If the message expects a | |
| // response, the |stub()| will also be given a |PendingResponse| object that | |
| // can be used to send a reply to the message. | |
| zx_status_t OnMessage(Message message) final; | |
| // Causes the |StubController| to invalidate all outstanding weak pointers, | |
| // preventing outstanding |PendingResponse| objects from sending messages on | |
| // the channel that has gone away. | |
| void OnChannelGone() final; | |
| // Invalidate all outstanding weak pointers, preventing outstanding | |
| // |PendingResponse| objects from sending messages. | |
| void InvalidateWeakIfNeeded(); | |
| WeakStubController* weak_; | |
| MessageReader reader_; | |
| Stub* stub_; | |
| }; | |
| } // namespace internal | |
| } // namespace fidl | |
| #endif // LIB_FIDL_CPP_INTERNAL_STUB_CONTROLLER_H_ |