| // 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_SYNCHRONOUS_PROXY_H_ |
| #define LIB_FIDL_CPP_INTERNAL_SYNCHRONOUS_PROXY_H_ |
| |
| #include <lib/fidl/cpp/internal/message_sender.h> |
| #include <lib/fidl/cpp/message.h> |
| #include <lib/zx/channel.h> |
| #include <zircon/fidl.h> |
| |
| namespace fidl { |
| namespace internal { |
| |
| // Manages the client state for a synchronous interface. |
| // |
| // A |SynchronousProxy| manages the client state for a sychronous interface. |
| // This object validates messages before sending them to the remote endpoint, |
| // and (optionally) blocks until it receives a reply. |
| // |
| // Instances of this class are thread-safe. |
| class SynchronousProxy final : public MessageSender { |
| public: |
| // Creates a |SynchronousProxy| that wraps the given channel. |
| explicit SynchronousProxy(zx::channel channel); |
| ~SynchronousProxy(); |
| |
| // Returns the underlying channel from this object. |
| // |
| // The |SynchronousProxy| does not attempt to synchronize this operation with |
| // |Send| or |Call|. |
| zx::channel TakeChannel(); |
| |
| // Validates that |message| matches the given |type| and sends the message |
| // through the underlying channel. |
| // |
| // Does not block. |
| // |
| // Returns an error if validation or writing fails. |
| zx_status_t Send(const fidl_type_t* type, Message message) final; |
| |
| // Validate that |request| matches the given |request_type| and sends |
| // |request| through the underlying channel. Blocks until it receives a |
| // response, which is then decoded according to |response_type| and returned |
| // in |response_type|. |
| // |
| // Blocks until the remote endpoint replied. |
| // |
| // Returns an error if validation, writing, reading, or decoding fails. |
| zx_status_t Call(const fidl_type_t* request_type, const fidl_type_t* response_type, |
| Message request, Message* response); |
| |
| private: |
| zx::channel channel_; |
| }; |
| |
| } // namespace internal |
| } // namespace fidl |
| |
| #endif // LIB_FIDL_CPP_INTERNAL_SYNCHRONOUS_PROXY_H_ |