| // Copyright 2022 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_SYS_COMPONENT_LLCPP_HANDLERS_H_ |
| #define LIB_SYS_COMPONENT_LLCPP_HANDLERS_H_ |
| |
| #include <lib/fidl/llcpp/service_handler_interface.h> |
| #include <lib/svc/dir.h> |
| #include <lib/zx/channel.h> |
| #include <lib/zx/status.h> |
| #include <zircon/errors.h> |
| |
| #include <map> |
| |
| namespace component { |
| |
| // Callback invoked when a request is made to a FIDL protocol server end. |
| using AnyHandler = fit::function<void(zx::channel)>; |
| |
| // Same as |AnyHandler| except that it's typesafe. |
| template <typename Protocol> |
| using TypedHandler = fit::function<void(fidl::ServerEnd<Protocol> request)>; |
| |
| // A handler for an instance of a FIDL Service. |
| class ServiceHandler final : public fidl::ServiceHandlerInterface { |
| public: |
| ServiceHandler() = default; |
| |
| // Disable copying. |
| ServiceHandler(const ServiceHandler&) = delete; |
| ServiceHandler& operator=(const ServiceHandler&) = delete; |
| |
| // Enable moving. |
| ServiceHandler(ServiceHandler&&) = default; |
| ServiceHandler& operator=(ServiceHandler&&) = default; |
| |
| private: |
| friend class OutgoingDirectory; |
| |
| // Return all registered member handlers. Key contains member name. Value |
| // contains |Connector| func. |
| // |
| // Once taken, the service handler is no longer safe to use. |
| std::map<std::string, AnyHandler> GetMemberHandlers() { return std::move(handlers_); } |
| |
| // Add a |member| to the instance, whose connection will be handled by |handler|. |
| // |
| // # Errors |
| // |
| // ZX_ERR_ALREADY_EXISTS: The member already exists. |
| zx::status<> AddAnyMember(std::string_view member, AnyMemberHandler handler) override { |
| std::string owned_member = std::string(member); |
| if (handlers_.count(owned_member) != 0) { |
| return zx::make_status(ZX_ERR_ALREADY_EXISTS); |
| } |
| |
| // Since AnyMemberHandler is a protected type of this class' parent class, |
| // |fidl::ServiceHandlerInterface|, wrap the type into a public one. |
| AnyHandler bridge_func = [handler = std::move(handler)](zx::channel request_channel) { |
| handler(std::move(request_channel)); |
| }; |
| handlers_[owned_member] = std::move(bridge_func); |
| return zx::ok(); |
| } |
| |
| std::map<std::string, AnyHandler> handlers_ = {}; |
| }; |
| |
| } // namespace component |
| |
| #endif // LIB_SYS_COMPONENT_LLCPP_HANDLERS_H_ |