blob: 76f3e85b9701b6dcd1278b5251eb04ee6628cbdb [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 SRC_DEVICES_BIN_DRIVER_MANAGER_V1_DRIVER_DEVELOPMENT_H_
#define SRC_DEVICES_BIN_DRIVER_MANAGER_V1_DRIVER_DEVELOPMENT_H_
#include <fidl/fuchsia.driver.development/cpp/wire.h>
#include <lib/stdcompat/span.h>
#include "src/devices/bin/driver_manager/coordinator.h"
#include "src/devices/bin/driver_manager/device.h"
#include "src/devices/bin/driver_manager/driver.h"
#include "src/devices/bin/driver_manager/v1/unbind_task.h"
class DriverInfoIterator : public fidl::WireServer<fuchsia_driver_development::DriverInfoIterator> {
public:
explicit DriverInfoIterator(std::unique_ptr<fidl::Arena<512>> arena,
std::vector<fuchsia_driver_development::wire::DriverInfo> list)
: arena_(std::move(arena)), list_(std::move(list)) {}
void GetNext(GetNextRequestView request, GetNextCompleter::Sync& completer) override {
constexpr size_t kMaxEntries = 100;
auto result = cpp20::span(&list_[offset_], std::min(kMaxEntries, list_.size() - offset_));
offset_ += result.size();
completer.Reply(fidl::VectorView<fuchsia_driver_development::wire::DriverInfo>::FromExternal(
result.data(), result.size()));
}
private:
size_t offset_ = 0;
std::unique_ptr<fidl::Arena<512>> arena_;
std::vector<fuchsia_driver_development::wire::DriverInfo> list_;
};
class DeviceInfoIterator : public fidl::WireServer<fuchsia_driver_development::DeviceInfoIterator> {
public:
explicit DeviceInfoIterator(std::unique_ptr<fidl::Arena<512>> arena,
std::vector<fuchsia_driver_development::wire::DeviceInfo> list)
: arena_(std::move(arena)), list_(std::move(list)) {}
void GetNext(GetNextRequestView request, GetNextCompleter::Sync& completer) override {
constexpr size_t kMaxEntries = 100;
auto result = cpp20::span(&list_[offset_], std::min(kMaxEntries, list_.size() - offset_));
offset_ += result.size();
completer.Reply(fidl::VectorView<fuchsia_driver_development::wire::DeviceInfo>::FromExternal(
result.data(), result.size()));
}
private:
size_t offset_ = 0;
std::unique_ptr<fidl::Arena<512>> arena_;
std::vector<fuchsia_driver_development::wire::DeviceInfo> list_;
};
zx::status<std::vector<fuchsia_driver_development::wire::DriverInfo>> GetDriverInfo(
fidl::AnyArena& allocator, const std::vector<const Driver*>& drivers);
zx::status<std::vector<fuchsia_driver_development::wire::DeviceInfo>> GetDeviceInfo(
fidl::AnyArena& allocator, const std::vector<fbl::RefPtr<Device>>& devices);
#endif // SRC_DEVICES_BIN_DRIVER_MANAGER_V1_DRIVER_DEVELOPMENT_H_