blob: 70e40b7599e62e4c6097589ee8cac1e7c1a8cf05 [file] [log] [blame]
#include "utils.hpp"
#include <phosphor-logging/lg2.hpp>
namespace phosphor
{
namespace led
{
namespace utils
{
// Get service name
const std::string DBusHandler::getService(const std::string& path,
const std::string& interface) const
{
using InterfaceList = std::vector<std::string>;
std::unordered_map<std::string, std::vector<std::string>> mapperResponse;
auto& bus = DBusHandler::getBus();
auto mapper = bus.new_method_call(mapperBusName, mapperObjPath, mapperIntf,
"GetObject");
mapper.append(path, InterfaceList({interface}));
auto mapperResponseMsg = bus.call(mapper);
mapperResponseMsg.read(mapperResponse);
if (mapperResponse.empty())
{
lg2::error(
"Failed to read getService mapper response, OBJECT_PATH = {PATH}, INTERFACE = {INTERFACE}",
"PATH", path, "INTERFACE", interface);
return "";
}
// the value here will be the service name
return mapperResponse.cbegin()->first;
}
// Get all properties
const PropertyMap DBusHandler::getAllProperties(
const std::string& objectPath, const std::string& interface) const
{
PropertyMap properties;
auto& bus = DBusHandler::getBus();
auto service = getService(objectPath, interface);
if (service.empty())
{
return properties;
}
auto method = bus.new_method_call(service.c_str(), objectPath.c_str(),
proIntf, "GetAll");
method.append(interface);
auto reply = bus.call(method);
reply.read(properties);
return properties;
}
// Get the property name
const PropertyValue DBusHandler::getProperty(
const std::string& objectPath, const std::string& interface,
const std::string& propertyName) const
{
PropertyValue value{};
auto& bus = DBusHandler::getBus();
auto service = getService(objectPath, interface);
if (service.empty())
{
return value;
}
auto method = bus.new_method_call(service.c_str(), objectPath.c_str(),
proIntf, "Get");
method.append(interface, propertyName);
auto reply = bus.call(method);
reply.read(value);
return value;
}
// Set property
void DBusHandler::setProperty(
const std::string& objectPath, const std::string& interface,
const std::string& propertyName, const PropertyValue& value) const
{
auto& bus = DBusHandler::getBus();
auto service = getService(objectPath, interface);
if (service.empty())
{
return;
}
auto method = bus.new_method_call(service.c_str(), objectPath.c_str(),
proIntf, "Set");
method.append(interface.c_str(), propertyName.c_str(), value);
bus.call_noreply(method);
}
const std::vector<std::string> DBusHandler::getSubTreePaths(
const std::string& objectPath, const std::string& interface)
{
std::vector<std::string> paths;
auto& bus = DBusHandler::getBus();
auto method = bus.new_method_call(mapperBusName, mapperObjPath, mapperIntf,
"GetSubTreePaths");
method.append(objectPath.c_str());
method.append(0); // Depth 0 to search all
method.append(std::vector<std::string>({interface.c_str()}));
auto reply = bus.call(method);
reply.read(paths);
return paths;
}
} // namespace utils
} // namespace led
} // namespace phosphor