blob: 02e06717dd3bd605c0ca4d3fb96c62b421b440af [file] [log] [blame]
// Copyright 2019 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_SERVICE_HANDLER_BASE_H_
#define LIB_FIDL_CPP_SERVICE_HANDLER_BASE_H_
#include <lib/async/dispatcher.h>
#include <lib/fidl/cpp/interface_request.h>
namespace fidl {
// A base class for service handlers.
//
// This base class is used to reduce the number of libraries that generated code
// needs to depend upon.
class ServiceHandlerBase {
public:
virtual ~ServiceHandlerBase() = default;
// A callback to be invoked when binding a channel to a protocol.
using MemberHandler = fit::function<void(zx::channel channel, async_dispatcher_t* dispatcher)>;
// Add a |member| to the instance, which will be handled by |handler|.
virtual zx_status_t AddMember(std::string member, MemberHandler handler) const = 0;
// Add a |member| to the instance, which will be handled by |handler|.
template <typename Protocol>
zx_status_t AddMember(std::string member, fidl::InterfaceRequestHandler<Protocol> handler) {
return AddMember(std::move(member), [handler = std::move(handler)](
zx::channel channel, async_dispatcher_t* dispatcher) {
handler(fidl::InterfaceRequest<Protocol>(std::move(channel)));
});
}
};
} // namespace fidl
#endif // LIB_FIDL_CPP_SERVICE_HANDLER_BASE_H_