// Copyright 2023 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_FUCHSIA_FIDL_EVENT_HANDLER_H_ #define BASE_FUCHSIA_FIDL_EVENT_HANDLER_H_ #include #include #include #include #include "base/fuchsia/fuchsia_logging.h" #include "base/functional/callback.h" #include "base/location.h" #include "base/strings/string_piece.h" namespace fidl { template class AsyncEventHandler; } namespace base { // An implementation of `fidl::AsyncEventhandler` that simply LOGs an ERROR // when `on_fidl_error` is called. The lifetime of an instance of this class // needs to match the lifetime of the `fidl::Client` that it is used with. template class FidlErrorEventLogger : public fidl::AsyncEventHandler { public: explicit FidlErrorEventLogger( std::string protocol_name = fidl::DiscoverableProtocolName) : protocol_name_(std::move(protocol_name)) {} void on_fidl_error(fidl::UnbindInfo error) override { LOG(ERROR) << protocol_name_ << " was disconnected with " << error.status_string() << "."; } private: std::string protocol_name_; }; // An implementation of `fidl::AsyncEventhandler` that LOGs an ERROR and // exits the process when `on_fidl_error` is called. The lifetime of an instance // of this class needs to match the lifetime of the `fidl::Client` that it is // used with. template class FidlErrorEventProcessExiter : public fidl::AsyncEventHandler { public: explicit FidlErrorEventProcessExiter( std::string protocol_name = fidl::DiscoverableProtocolName) : protocol_name_(std::move(protocol_name)) {} void on_fidl_error(fidl::UnbindInfo error) override { base::LogFidlErrorAndExitProcess(FROM_HERE, protocol_name_)(error.status()); } private: std::string protocol_name_; }; // An implementation of `fidl::AsyncEventHandler` that invokes the // caller-supplied callback when `on_fidl_error` is called. The lifetime of an // instance of this class needs to match the lifetime of the `fidl::Client` that // it is used with. template class FidlErrorEventHandler : public fidl::AsyncEventHandler { public: using OnFidlErrorCallback = base::RepeatingCallback; FidlErrorEventHandler() = delete; explicit FidlErrorEventHandler(OnFidlErrorCallback on_fidl_error_callback) : on_fidl_error_callback_(std::move(on_fidl_error_callback)) {} void on_fidl_error(fidl::UnbindInfo error) override { on_fidl_error_callback_.Run(error); } private: OnFidlErrorCallback on_fidl_error_callback_; }; } // namespace base #endif // BASE_FUCHSIA_FIDL_EVENT_HANDLER_H_