| // Copyright 2017 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. |
| // |
| // This file implements DBus functionality. |
| // Because hammerd is not a daemon, it can only send signals to other |
| // processes or call methods provided by others. |
| |
| #ifndef HAMMERD_DBUS_WRAPPER_H_ |
| #define HAMMERD_DBUS_WRAPPER_H_ |
| |
| #include <memory> |
| #include <string> |
| |
| #include <base/macros.h> |
| #include <base/memory/ptr_util.h> |
| #include <base/memory/ref_counted.h> |
| #include <dbus/bus.h> |
| #include <dbus/exported_object.h> |
| #include <dbus/message.h> |
| |
| namespace hammerd { |
| |
| class DBusWrapperInterface { |
| public: |
| virtual ~DBusWrapperInterface() = default; |
| |
| // Send a signal without argument. |
| virtual void SendSignal(const std::string& signal_name) = 0; |
| // Send a signal with a binary-blob argument. |
| // Currently we only have one signal with a binary-blob argument. If we need |
| // other kind of arguments in the future, then switch to protobuf. |
| virtual void SendSignalWithArg(const std::string& signal_name, |
| const uint8_t* values, |
| size_t length) = 0; |
| }; |
| |
| class DBusWrapper : public DBusWrapperInterface { |
| public: |
| DBusWrapper(); |
| DBusWrapper(const DBusWrapper&) = delete; |
| DBusWrapper& operator=(const DBusWrapper&) = delete; |
| |
| virtual ~DBusWrapper() = default; |
| |
| void SendSignal(const std::string& signal_name) override; |
| void SendSignalWithArg(const std::string& signal_name, |
| const uint8_t* values, |
| size_t length) override; |
| |
| protected: |
| scoped_refptr<dbus::Bus> bus_; |
| dbus::ExportedObject* exported_object_; |
| }; |
| |
| // The dummy class used in hammerd API. |
| class DummyDBusWrapper : public DBusWrapperInterface { |
| public: |
| DummyDBusWrapper() {} |
| DummyDBusWrapper(const DummyDBusWrapper&) = delete; |
| DummyDBusWrapper& operator=(const DummyDBusWrapper&) = delete; |
| |
| virtual ~DummyDBusWrapper() = default; |
| |
| void SendSignal(const std::string& signal_name) override { |
| SendSignalWithArg(signal_name, NULL, 0); |
| } |
| void SendSignalWithArg(const std::string& signal_name, |
| const uint8_t* values, |
| size_t length) override { |
| last_signal_name_ = std::string(signal_name); |
| if (values == NULL) |
| last_value_ = ""; |
| else |
| last_value_ = std::string(reinterpret_cast<const char*>(values), length); |
| } |
| |
| std::string GetLastSignalName() { return last_signal_name_; } |
| std::string GetLastValue() { return last_value_; } |
| |
| private: |
| // Record the last signal that was "sent" |
| std::string last_signal_name_; |
| std::string last_value_; |
| }; |
| |
| } // namespace hammerd |
| #endif // HAMMERD_DBUS_WRAPPER_H_ |