1*6777b538SAndroid Build Coastguard Worker // Copyright 2023 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_FUCHSIA_FIDL_EVENT_HANDLER_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_FUCHSIA_FIDL_EVENT_HANDLER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <lib/fidl/cpp/wire/client_base.h> 9*6777b538SAndroid Build Coastguard Worker #include <lib/fidl/cpp/wire/status.h> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <optional> 12*6777b538SAndroid Build Coastguard Worker #include <string> 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/fuchsia_logging.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/location.h" 17*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h" 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker namespace fidl { 20*6777b538SAndroid Build Coastguard Worker template <typename Protocol> 21*6777b538SAndroid Build Coastguard Worker class AsyncEventHandler; 22*6777b538SAndroid Build Coastguard Worker } 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker namespace base { 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker // An implementation of `fidl::AsyncEventhandler` that simply LOGs an ERROR 27*6777b538SAndroid Build Coastguard Worker // when `on_fidl_error` is called. The lifetime of an instance of this class 28*6777b538SAndroid Build Coastguard Worker // needs to match the lifetime of the `fidl::Client` that it is used with. 29*6777b538SAndroid Build Coastguard Worker template <typename Protocol> 30*6777b538SAndroid Build Coastguard Worker class FidlErrorEventLogger : public fidl::AsyncEventHandler<Protocol> { 31*6777b538SAndroid Build Coastguard Worker public: 32*6777b538SAndroid Build Coastguard Worker explicit FidlErrorEventLogger( 33*6777b538SAndroid Build Coastguard Worker std::string protocol_name = fidl::DiscoverableProtocolName<Protocol>) protocol_name_(std::move (protocol_name))34*6777b538SAndroid Build Coastguard Worker : protocol_name_(std::move(protocol_name)) {} 35*6777b538SAndroid Build Coastguard Worker on_fidl_error(fidl::UnbindInfo error)36*6777b538SAndroid Build Coastguard Worker void on_fidl_error(fidl::UnbindInfo error) override { 37*6777b538SAndroid Build Coastguard Worker LOG(ERROR) << protocol_name_ << " was disconnected with " 38*6777b538SAndroid Build Coastguard Worker << error.status_string() << "."; 39*6777b538SAndroid Build Coastguard Worker } 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker private: 42*6777b538SAndroid Build Coastguard Worker std::string protocol_name_; 43*6777b538SAndroid Build Coastguard Worker }; 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker // An implementation of `fidl::AsyncEventhandler` that LOGs an ERROR and 46*6777b538SAndroid Build Coastguard Worker // exits the process when `on_fidl_error` is called. The lifetime of an instance 47*6777b538SAndroid Build Coastguard Worker // of this class needs to match the lifetime of the `fidl::Client` that it is 48*6777b538SAndroid Build Coastguard Worker // used with. 49*6777b538SAndroid Build Coastguard Worker template <typename Protocol> 50*6777b538SAndroid Build Coastguard Worker class FidlErrorEventProcessExiter : public fidl::AsyncEventHandler<Protocol> { 51*6777b538SAndroid Build Coastguard Worker public: 52*6777b538SAndroid Build Coastguard Worker explicit FidlErrorEventProcessExiter( 53*6777b538SAndroid Build Coastguard Worker std::string protocol_name = fidl::DiscoverableProtocolName<Protocol>) protocol_name_(std::move (protocol_name))54*6777b538SAndroid Build Coastguard Worker : protocol_name_(std::move(protocol_name)) {} 55*6777b538SAndroid Build Coastguard Worker on_fidl_error(fidl::UnbindInfo error)56*6777b538SAndroid Build Coastguard Worker void on_fidl_error(fidl::UnbindInfo error) override { 57*6777b538SAndroid Build Coastguard Worker base::LogFidlErrorAndExitProcess(FROM_HERE, protocol_name_)(error.status()); 58*6777b538SAndroid Build Coastguard Worker } 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker private: 61*6777b538SAndroid Build Coastguard Worker std::string protocol_name_; 62*6777b538SAndroid Build Coastguard Worker }; 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Worker // An implementation of `fidl::AsyncEventHandler` that invokes the 65*6777b538SAndroid Build Coastguard Worker // caller-supplied callback when `on_fidl_error` is called. The lifetime of an 66*6777b538SAndroid Build Coastguard Worker // instance of this class needs to match the lifetime of the `fidl::Client` that 67*6777b538SAndroid Build Coastguard Worker // it is used with. 68*6777b538SAndroid Build Coastguard Worker template <typename Protocol> 69*6777b538SAndroid Build Coastguard Worker class FidlErrorEventHandler : public fidl::AsyncEventHandler<Protocol> { 70*6777b538SAndroid Build Coastguard Worker public: 71*6777b538SAndroid Build Coastguard Worker using OnFidlErrorCallback = base::RepeatingCallback<void(fidl::UnbindInfo)>; 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker FidlErrorEventHandler() = delete; FidlErrorEventHandler(OnFidlErrorCallback on_fidl_error_callback)74*6777b538SAndroid Build Coastguard Worker explicit FidlErrorEventHandler(OnFidlErrorCallback on_fidl_error_callback) 75*6777b538SAndroid Build Coastguard Worker : on_fidl_error_callback_(std::move(on_fidl_error_callback)) {} 76*6777b538SAndroid Build Coastguard Worker on_fidl_error(fidl::UnbindInfo error)77*6777b538SAndroid Build Coastguard Worker void on_fidl_error(fidl::UnbindInfo error) override { 78*6777b538SAndroid Build Coastguard Worker on_fidl_error_callback_.Run(error); 79*6777b538SAndroid Build Coastguard Worker } 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker private: 82*6777b538SAndroid Build Coastguard Worker OnFidlErrorCallback on_fidl_error_callback_; 83*6777b538SAndroid Build Coastguard Worker }; 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker } // namespace base 86*6777b538SAndroid Build Coastguard Worker 87*6777b538SAndroid Build Coastguard Worker #endif // BASE_FUCHSIA_FIDL_EVENT_HANDLER_H_ 88