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