auto configurationItem = std::make_shared<SwitchConfigurationItem>(switchId, activityType);
configurationItem->setUserName(userName);
configuration->add(configurationItem);
+ scheduleSwitchesConfigurationChangedSignalEmission();
return DBus::Success{};
}
configurationItem->setActivityType(activityType);
configurationItem->setUserName(userName);
configuration->update(configurationItem);
+ scheduleSwitchesConfigurationChangedSignalEmission();
return DBus::Success{};
} else {
ERROR("configurationItem switchId: %s not found", switchId.c_str());
auto configurationItem = configuration->findBySwitchId(switchId);
if (configurationItem) {
configuration->remove(configurationItem);
+ scheduleSwitchesConfigurationChangedSignalEmission();
return DBus::Success{};
} else {
ERROR("configurationItem switchId: %s not found", switchId.c_str());
releaseSwitchObserver();
return DBus::Success{};
}
+
+ template <typename ... ARGS> auto addSignal(DBus::DBusInterfaceDescription &desc, const std::string &funcName)
+ {
+ return desc.addSignal<ARGS...>(funcName);
+ }
+
public:
DBusInterfaceImpl() : dbusServer(DBus::ConnectionType::SESSION)
{
add(desc, "addSwitchConfigurationItem", &DBusInterfaceImpl::addSwitchConfigurationItem);
add(desc, "updateSwitchConfigurationItem", &DBusInterfaceImpl::updateSwitchConfigurationItem);
add(desc, "removeSwitchConfigurationItem", &DBusInterfaceImpl::removeSwitchConfigurationItem);
+ onSwitchesChangeSignalId = addSignal<>(desc, "switchesConfigurationChanged");
+
dbusServer.addInterface(PATH, desc);
eldbus_name_request(dbusServer.getConnection()->get(), BUS, ELDBUS_NAME_REQUEST_FLAG_DO_NOT_QUEUE, onNameRequest, nullptr);
}
private:
DBus::DBusServer dbusServer;
+ DBus::DBusInterfaceDescription::SignalId onSwitchesChangeSignalId;
+ ecore::AsyncInvoker configurationChangedSignalInvoker;
std::shared_ptr<DBusSwitchObserver> switchObserver;
+ void scheduleSwitchesConfigurationChangedSignalEmission()
+ {
+ configurationChangedSignalInvoker.addToMainLoopQueue([this]() {
+ this->dbusServer.emit<>(this->onSwitchesChangeSignalId);
+ });
+ }
+
template <typename ... RET, typename ... ARGS> void add(DBus::DBusInterfaceDescription &desc, const std::string &funcName,
DBus::ValueOrError<RET...>(DBusInterfaceImpl::*funcPtr)(ARGS...))
{
});
}
+
void releaseSwitchObserver()
{
if (switchObserver) {