| // Copyright 2014 The Chromium OS 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 LIBBRILLO_BRILLO_DBUS_DBUS_SIGNAL_H_ |
| #define LIBBRILLO_BRILLO_DBUS_DBUS_SIGNAL_H_ |
| |
| #include <string> |
| #include <typeinfo> |
| |
| #include <base/bind.h> |
| #include <base/macros.h> |
| #include <brillo/brillo_export.h> |
| #include <brillo/dbus/dbus_param_writer.h> |
| #include <dbus/message.h> |
| |
| namespace brillo { |
| namespace dbus_utils { |
| |
| class DBusObject; |
| |
| // Base class for D-Bus signal proxy classes. |
| // Used mostly to store the polymorphic DBusSignal<...> in a single map |
| // container inside DBusInterface object. |
| class BRILLO_EXPORT DBusSignalBase { |
| public: |
| DBusSignalBase(DBusObject* dbus_object, |
| const std::string& interface_name, |
| const std::string& signal_name); |
| virtual ~DBusSignalBase() = default; |
| |
| protected: |
| bool SendSignal(::dbus::Signal* signal) const; |
| |
| std::string interface_name_; |
| std::string signal_name_; |
| |
| private: |
| DBusObject* dbus_object_; |
| |
| DISALLOW_COPY_AND_ASSIGN(DBusSignalBase); |
| }; |
| |
| // DBusSignal<...> is a concrete signal proxy class that knows about the |
| // exact number of signal arguments and their types. |
| template<typename... Args> |
| class DBusSignal : public DBusSignalBase { |
| public: |
| // Expose the custom constructor from DBusSignalBase. |
| using DBusSignalBase::DBusSignalBase; |
| ~DBusSignal() override = default; |
| |
| // DBusSignal<...>::Send(...) dispatches the signal with the given arguments. |
| // Note: This function can be called from any thread/task runner, as it'll |
| // eventually post the actual signal sending to the DBus thread. |
| bool Send(const Args&... args) const { |
| ::dbus::Signal signal(interface_name_, signal_name_); |
| ::dbus::MessageWriter signal_writer(&signal); |
| DBusParamWriter::Append(&signal_writer, args...); |
| return SendSignal(&signal); |
| } |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(DBusSignal); |
| }; |
| |
| } // namespace dbus_utils |
| } // namespace brillo |
| |
| #endif // LIBBRILLO_BRILLO_DBUS_DBUS_SIGNAL_H_ |