blob: 7b20ee1f0175db007aa584ae4318eb0729463374 [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