blob: 5638aa868e80d4c6e3c52dbc7d09cc24ab4b1cd7 [file] [log] [blame]
// 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_