xref: /aosp_15_r20/external/cronet/base/fuchsia/fidl_event_handler.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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