summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--control/actions.cpp4
-rw-r--r--control/zone.cpp30
-rw-r--r--control/zone.hpp7
3 files changed, 41 insertions, 0 deletions
diff --git a/control/actions.cpp b/control/actions.cpp
index 66bba2b..8ecd30c 100644
--- a/control/actions.cpp
+++ b/control/actions.cpp
@@ -83,6 +83,8 @@ Action call_actions_based_on_timer(Timer&& tConf, std::vector<Action>&& actions)
void default_floor_on_missing_owner(Zone& zone, const Group& group)
{
+ // Set/update the services of the group
+ zone.setServices(&group);
auto services = zone.getGroupServices(&group);
auto defFloor = std::any_of(
services.begin(),
@@ -103,6 +105,8 @@ Action set_speed_on_missing_owner(uint64_t speed)
{
return [speed](control::Zone& zone, const Group& group)
{
+ // Set/update the services of the group
+ zone.setServices(&group);
auto services = zone.getGroupServices(&group);
auto missingOwner = std::any_of(
services.begin(),
diff --git a/control/zone.cpp b/control/zone.cpp
index cb8ebfa..5fe9b01 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -150,6 +150,36 @@ void Zone::setServiceOwner(const Group* group,
}
}
+void Zone::setServices(const Group* group)
+{
+ // TODO Remove empty service name if exists
+ for (auto it = group->begin(); it != group->end(); ++it)
+ {
+ std::string name;
+ bool hasOwner = false;
+ try
+ {
+ name = util::SDBusPlus::getService(
+ _bus,
+ it->first,
+ std::get<intfPos>(it->second));
+ hasOwner = util::SDBusPlus::callMethodAndRead<bool>(
+ _bus,
+ "org.freedesktop.DBus",
+ "/org/freedesktop/DBus",
+ "org.freedesktop.DBus",
+ "NameHasOwner",
+ name);
+ }
+ catch (const InternalFailure& ife)
+ {
+ // Failed to get service name owner state
+ hasOwner = false;
+ }
+ setServiceOwner(group, name, hasOwner);
+ }
+}
+
void Zone::setFloor(uint64_t speed)
{
// Check all entries are set to allow floor to be set
diff --git a/control/zone.hpp b/control/zone.hpp
index fa3ed82..9565933 100644
--- a/control/zone.hpp
+++ b/control/zone.hpp
@@ -151,6 +151,13 @@ class Zone
const bool hasOwner);
/**
+ * @brief Set or update all services for a group
+ *
+ * @param[in] group - Group to get service names for
+ */
+ void setServices(const Group* group);
+
+ /**
* @brief Get the group's list of service names
*
* @param[in] group - Group to get service names for
OpenPOWER on IntegriCloud