xref: /aosp_15_r20/external/libbrillo/brillo/dbus/dbus_signal.h (revision 1a96fba65179ea7d3f56207137718607415c5953)
1*1a96fba6SXin Li // Copyright 2014 The Chromium OS Authors. All rights reserved.
2*1a96fba6SXin Li // Use of this source code is governed by a BSD-style license that can be
3*1a96fba6SXin Li // found in the LICENSE file.
4*1a96fba6SXin Li 
5*1a96fba6SXin Li #ifndef LIBBRILLO_BRILLO_DBUS_DBUS_SIGNAL_H_
6*1a96fba6SXin Li #define LIBBRILLO_BRILLO_DBUS_DBUS_SIGNAL_H_
7*1a96fba6SXin Li 
8*1a96fba6SXin Li #include <string>
9*1a96fba6SXin Li #include <typeinfo>
10*1a96fba6SXin Li 
11*1a96fba6SXin Li #include <base/bind.h>
12*1a96fba6SXin Li #include <base/macros.h>
13*1a96fba6SXin Li #include <brillo/brillo_export.h>
14*1a96fba6SXin Li #include <brillo/dbus/dbus_param_writer.h>
15*1a96fba6SXin Li #include <dbus/message.h>
16*1a96fba6SXin Li 
17*1a96fba6SXin Li namespace brillo {
18*1a96fba6SXin Li namespace dbus_utils {
19*1a96fba6SXin Li 
20*1a96fba6SXin Li class DBusObject;
21*1a96fba6SXin Li 
22*1a96fba6SXin Li // Base class for D-Bus signal proxy classes.
23*1a96fba6SXin Li // Used mostly to store the polymorphic DBusSignal<...> in a single map
24*1a96fba6SXin Li // container inside DBusInterface object.
25*1a96fba6SXin Li class BRILLO_EXPORT DBusSignalBase {
26*1a96fba6SXin Li  public:
27*1a96fba6SXin Li   DBusSignalBase(DBusObject* dbus_object,
28*1a96fba6SXin Li                  const std::string& interface_name,
29*1a96fba6SXin Li                  const std::string& signal_name);
30*1a96fba6SXin Li   virtual ~DBusSignalBase() = default;
31*1a96fba6SXin Li 
32*1a96fba6SXin Li  protected:
33*1a96fba6SXin Li   bool SendSignal(::dbus::Signal* signal) const;
34*1a96fba6SXin Li 
35*1a96fba6SXin Li   std::string interface_name_;
36*1a96fba6SXin Li   std::string signal_name_;
37*1a96fba6SXin Li 
38*1a96fba6SXin Li  private:
39*1a96fba6SXin Li   DBusObject* dbus_object_;
40*1a96fba6SXin Li 
41*1a96fba6SXin Li   DISALLOW_COPY_AND_ASSIGN(DBusSignalBase);
42*1a96fba6SXin Li };
43*1a96fba6SXin Li 
44*1a96fba6SXin Li // DBusSignal<...> is a concrete signal proxy class that knows about the
45*1a96fba6SXin Li // exact number of signal arguments and their types.
46*1a96fba6SXin Li template<typename... Args>
47*1a96fba6SXin Li class DBusSignal : public DBusSignalBase {
48*1a96fba6SXin Li  public:
49*1a96fba6SXin Li   // Expose the custom constructor from DBusSignalBase.
50*1a96fba6SXin Li   using DBusSignalBase::DBusSignalBase;
51*1a96fba6SXin Li   ~DBusSignal() override = default;
52*1a96fba6SXin Li 
53*1a96fba6SXin Li   // DBusSignal<...>::Send(...) dispatches the signal with the given arguments.
54*1a96fba6SXin Li   // Note: This function can be called from any thread/task runner, as it'll
55*1a96fba6SXin Li   // eventually post the actual signal sending to the DBus thread.
Send(const Args &...args)56*1a96fba6SXin Li   bool Send(const Args&... args) const {
57*1a96fba6SXin Li     ::dbus::Signal signal(interface_name_, signal_name_);
58*1a96fba6SXin Li     ::dbus::MessageWriter signal_writer(&signal);
59*1a96fba6SXin Li     DBusParamWriter::Append(&signal_writer, args...);
60*1a96fba6SXin Li     return SendSignal(&signal);
61*1a96fba6SXin Li   }
62*1a96fba6SXin Li 
63*1a96fba6SXin Li  private:
64*1a96fba6SXin Li   DISALLOW_COPY_AND_ASSIGN(DBusSignal);
65*1a96fba6SXin Li };
66*1a96fba6SXin Li 
67*1a96fba6SXin Li }  // namespace dbus_utils
68*1a96fba6SXin Li }  // namespace brillo
69*1a96fba6SXin Li 
70*1a96fba6SXin Li #endif  // LIBBRILLO_BRILLO_DBUS_DBUS_SIGNAL_H_
71