diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c6a281..1c3cc6b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,7 +114,7 @@ install( NAMESPACE Amarula:: COMPONENT ${PROJECT_NAME}-dev) install( - FILES ${CMAKE_SOURCE_DIR}/LICENSE + FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE DESTINATION ${CMAKE_INSTALL_DATADIR}/Amarula/${PROJECT_NAME} COMPONENT ${PROJECT_NAME}) include(CMakePackageConfigHelpers) diff --git a/src/dbus/gconnman_manager.cpp b/src/dbus/gconnman_manager.cpp index a1ec398..4a37ac7 100644 --- a/src/dbus/gconnman_manager.cpp +++ b/src/dbus/gconnman_manager.cpp @@ -83,7 +83,6 @@ void Manager::process_services_changed( } } services_ = new_order_of_services; - services_changed_cb_(services_); } void Manager::setup_agent() { @@ -261,16 +260,29 @@ void Manager::get_proxies_cb(GObject* proxy, GAsyncResult* res, if (success) { proxies = self->template arrays_to_proxies(out_properties); g_variant_unref(out_properties); - std::lock_guard const lock(self->mtx_); if constexpr (std::is_same_v) { - self->services_ = proxies; - if (!self->services_.empty()) { - self->services_changed_cb_(self->services_); + OnServListChangedCallback callback; + { + std::lock_guard const lock(self->mtx_); + self->services_ = proxies; + if (!self->services_.empty()) { + callback = self->services_changed_cb_; + } + } + if (callback) { + callback(proxies); } } else { - self->technologies_ = proxies; - if (!self->technologies_.empty()) { - self->technologies_changed_cb_(self->technologies_); + OnTechListChangedCallback callback; + { + std::lock_guard const lock(self->mtx_); + self->technologies_ = proxies; + if (!self->technologies_.empty()) { + callback = self->technologies_changed_cb_; + } + } + if (callback) { + callback(proxies); } } @@ -314,25 +326,34 @@ void Manager::on_technology_added_removed_cb(GDBusProxy* /*proxy*/, GVariant* parameters, gpointer user_data) { auto* self = static_cast(user_data); - std::lock_guard const lock(self->mtx_); - if (g_strcmp0(signal_name, "g-signal::TechnologyAdded") == 0U) { - const auto technology = - self->template dict_to_proxy(parameters); - self->technologies_.push_back(technology); - - } else if (g_strcmp0(signal_name, "g-signal::TechnologyRemoved") == 0U) { - const auto object_path = - std::string(g_variant_get_string(parameters, nullptr)); - - self->technologies_.erase( - std::remove_if(self->technologies_.begin(), - self->technologies_.end(), - [&object_path](const auto& technology) { - return technology->objPath() == object_path; - }), - self->technologies_.end()); + Manager::ProxyList updated_technologies; + OnTechListChangedCallback callback; + { + std::lock_guard const lock(self->mtx_); + if (g_strcmp0(signal_name, "g-signal::TechnologyAdded") == 0U) { + const auto technology = + self->template dict_to_proxy(parameters); + self->technologies_.push_back(technology); + + } else if (g_strcmp0(signal_name, "g-signal::TechnologyRemoved") == + 0U) { + const auto object_path = + std::string(g_variant_get_string(parameters, nullptr)); + + self->technologies_.erase( + std::remove_if(self->technologies_.begin(), + self->technologies_.end(), + [&object_path](const auto& technology) { + return technology->objPath() == object_path; + }), + self->technologies_.end()); + } + updated_technologies = self->technologies_; + callback = self->technologies_changed_cb_; + } + if (callback) { + callback(updated_technologies); } - self->technologies_changed_cb_(self->technologies_); } void Manager::on_services_changed_cb(GDBusProxy* /*proxy*/, @@ -371,8 +392,17 @@ void Manager::on_services_changed_cb(GDBusProxy* /*proxy*/, } g_variant_unref(removed); - std::lock_guard const lock(self->mtx_); - self->process_services_changed(services_removed, services_changed); + Manager::ProxyList updated_services; + OnServListChangedCallback callback; + { + std::lock_guard const lock(self->mtx_); + self->process_services_changed(services_removed, services_changed); + updated_services = self->services_; + callback = self->services_changed_cb_; + } + if (callback) { + callback(updated_services); + } } void Manager::onTechnologiesChanged(OnTechListChangedCallback callback) {