blob: 53c7d93c0de2dd0dc3ef9257e805c946db9e0938 [file] [log] [blame]
// Copyright 2018 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 MEDIA_PERCEPTION_DBUS_SERVICE_H_
#define MEDIA_PERCEPTION_DBUS_SERVICE_H_
#include <functional>
#include <string>
#include <utility>
#include <vector>
namespace mri {
// TODO(lasoren): Move these string and enum definitions to a separate file from
// this abstract base class.
constexpr char kMediaPerceptionServiceName[] = "org.chromium.MediaPerception";
constexpr char kMediaPerceptionServicePath[] = "/org/chromium/MediaPerception";
// The following values are meant to be used in checking dbus method call names.
constexpr char kState[] = "State";
constexpr char kGetDiagnostics[] = "GetDiagnostics";
constexpr char kDetectionSignal[] = "MediaPerceptionDetection";
constexpr char kBootstrapMojoConnection[] = "BootstrapMojoConnection";
enum Service { MEDIA_PERCEPTION };
enum Method { STATE, GET_DIAGNOSTICS, BOOTSTRAP_MOJO_CONNECTION };
enum Signal { MEDIA_PERCEPTION_DETECTION };
// This class provides a generic base class for encapsulating methods used for
// communicating over D-Bus.
class DbusService {
public:
virtual ~DbusService() {}
// Handler for incoming method calls. |bytes| stores the reply message.
using MessageHandler = std::function<bool(const Method method,
const uint8_t* arg_bytes,
const int arg_size,
std::vector<uint8_t>* bytes)>;
// This handler function should be set after the DBusService is instantiated
// to handle incoming D-Bus messages.
void SetMessageHandler(MessageHandler message_handler) {
message_handler_ = std::move(message_handler);
}
std::string ServiceEnumToServiceName(const Service service) {
switch (service) {
case MEDIA_PERCEPTION:
return kMediaPerceptionServiceName;
}
return "";
}
std::string ServiceEnumToServicePath(const Service service) {
switch (service) {
case MEDIA_PERCEPTION:
return kMediaPerceptionServicePath;
}
return "";
}
std::string MethodEnumToMethodName(const Method method) {
switch (method) {
case STATE:
return kState;
case GET_DIAGNOSTICS:
return kGetDiagnostics;
case BOOTSTRAP_MOJO_CONNECTION:
return kBootstrapMojoConnection;
}
return "";
}
std::string SignalEnumToSignalName(const Signal signal) {
switch (signal) {
case MEDIA_PERCEPTION_DETECTION:
return kDetectionSignal;
}
return "";
}
// Pure virtuals for the interfaces that need to be available in the
// implementation.
virtual void Connect(const Service service) = 0;
virtual bool IsConnected() const = 0;
virtual bool PublishSignal(const Signal signal,
const std::vector<uint8_t>* bytes) = 0;
virtual void PollMessageQueue() = 0;
protected:
MessageHandler message_handler_;
// Stores the service enum for the active connection.
Service service_;
};
} // namespace mri
#endif // MEDIA_PERCEPTION_DBUS_SERVICE_H_