blob: 80d13e3c7bb3692a0a926bc141d12e4a7ee767ab [file] [log] [blame]
// 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_INSPECT_COMPONENT_CPP_SERVICE_H_
#define LIB_INSPECT_COMPONENT_CPP_SERVICE_H_
#include <fidl/fuchsia.inspect/cpp/wire.h>
#include <lib/async/cpp/executor.h>
#include <lib/inspect/component/cpp/tree_handler_settings.h>
#include <lib/inspect/cpp/inspect.h>
#include <lib/stdcompat/optional.h>
#include <functional>
#include <memory>
#include <variant>
namespace inspect {
/// TreeServer is an implementation of the fuchsia.inspect.Tree protocol.
///
/// Generally, it is not necessary to use this directly. See `inspect::ComponentInspector`.
///
/// This class can be used directly if the client wishes to manage protocol registration
/// details manually.
///
/// For an example of usage, see the constructor for `inspect::ComponentInspector`.
class TreeServer final : public fidl::WireServer<fuchsia_inspect::Tree> {
public:
/// Starts a new server. The implementation deletes itself during teardown after an unbind or
/// else runs until component shutdown.
///
/// `data` is the Inspect data served over the connection.
///
/// The `Inspector` variant results in full-featured Inspect with lazy nodes
/// and values.
///
/// The `zx::vmo` variant will not serve lazy nodes/values. It will only serve the Inspect
/// data in itself. The VMO may contain lazy nodes/values, but they will be ignored when
/// snapshotting and parsing the data.
static void StartSelfManagedServer(std::variant<Inspector, zx::vmo> data,
TreeHandlerSettings settings, async_dispatcher_t* dispatcher,
fidl::ServerEnd<fuchsia_inspect::Tree>&& request);
/// Get the VMO handle for the Inspector handled by this server.
void GetContent(GetContentCompleter::Sync& completer) override;
/// Start a server for handling the lazy child whose name is passed.
void OpenChild(OpenChildRequestView request, OpenChildCompleter::Sync& completer) override;
/// Start a server that furnishes the names of this Tree's children.
///
/// The names provided by the server this method starts are valid values to be passed to
/// `OpenChild`.
void ListChildNames(ListChildNamesRequestView request,
ListChildNamesCompleter::Sync& completer) override;
private:
TreeServer(std::variant<Inspector, zx::vmo> data, TreeHandlerSettings settings,
async_dispatcher_t* disp)
: executor_(disp), settings_(settings), data_(std::move(data)) {}
TreeServer(const TreeServer&) = delete;
TreeServer(TreeServer&&) = delete;
TreeServer& operator=(TreeServer&&) = delete;
TreeServer& operator=(const TreeServer&) = delete;
async::Executor executor_;
TreeHandlerSettings settings_;
std::variant<Inspector, zx::vmo> data_;
cpp17::optional<fidl::ServerBindingRef<fuchsia_inspect::Tree>> binding_;
};
class TreeNameIterator final : public fidl::WireServer<fuchsia_inspect::TreeNameIterator> {
public:
// Start a server that deletes itself on unbind.
static void StartSelfManagedServer(async_dispatcher_t* dispatcher,
fidl::ServerEnd<fuchsia_inspect::TreeNameIterator>&& request,
std::vector<std::string> names);
// Get the next batch of names. Names are sent in batches of `kMaxTreeNamesListSize`,
// which is defined with the rest of the FIDL protocol.
void GetNext(GetNextCompleter::Sync& completer) override;
private:
TreeNameIterator(std::vector<std::string>&& names) : names_(std::move(names)) {}
cpp17::optional<fidl::ServerBindingRef<fuchsia_inspect::TreeNameIterator>> binding_;
std::vector<std::string> names_;
uint64_t current_index_ = 0;
};
} // namespace inspect
#endif // LIB_INSPECT_COMPONENT_CPP_SERVICE_H_