| // Copyright 2023 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_MISC_DRIVERS_COMPAT_COMPAT_DRIVER_SERVER_H_ |
| #define SRC_DEVICES_MISC_DRIVERS_COMPAT_COMPAT_DRIVER_SERVER_H_ |
| |
| #include <fidl/fuchsia.driver.framework/cpp/driver/natural_messaging.h> |
| #include <fidl/fuchsia.driver.framework/cpp/driver/wire.h> |
| #include <lib/driver/component/cpp/start_completer.h> |
| |
| namespace compat { |
| |
| // Forward declare. |
| class Driver; |
| |
| class CompatDriverServer : public fdf::WireServer<fuchsia_driver_framework::Driver> { |
| public: |
| // Initialize the fuchsia_driver_framework::Driver server. |
| static void* initialize(fdf_handle_t server_handle); |
| |
| // Destroy the fuchsia_driver_framework::Driver server. |
| static void destroy(void* token); |
| |
| static Driver* CreateDriver(fuchsia_driver_framework::DriverStartArgs start_args, |
| fdf::UnownedSynchronizedDispatcher driver_dispatcher, |
| fdf::StartCompleter start_completer); |
| |
| CompatDriverServer(fdf_dispatcher_t* dispatcher, fdf_handle_t server_handle); |
| |
| virtual ~CompatDriverServer(); |
| |
| void Start(StartRequestView request, fdf::Arena& arena, StartCompleter::Sync& completer) override; |
| |
| void Stop(fdf::Arena& arena, StopCompleter::Sync& completer) override; |
| |
| void handle_unknown_method(fidl::UnknownMethodMetadata<fuchsia_driver_framework::Driver> metadata, |
| fidl::UnknownMethodCompleter::Sync& completer) override {} |
| |
| private: |
| fdf_dispatcher_t* dispatcher_; |
| std::optional<fdf::ServerBinding<fuchsia_driver_framework::Driver>> binding_; |
| |
| // Using a pointer for driver_ since it is an incomplete type here. |
| std::optional<Driver*> driver_; |
| }; |
| } // namespace compat |
| |
| #endif // SRC_DEVICES_MISC_DRIVERS_COMPAT_COMPAT_DRIVER_SERVER_H_ |