// 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 #include #include #include #include #include #include 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 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_