Diff between 8c0c82c9e966654002350ada8489ca577896566a and cec1ef63ff3f74d98c9fa6b480c7416726927870

Changed Files

File Additions Deletions Status
src/adapter.c +2 -0 modified
src/adv_monitor.c +51 -0 modified
src/adv_monitor.h +2 -0 modified

Full Patch

diff --git a/src/adapter.c b/src/adapter.c
index ce71576..3f947c4 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2967,6 +2967,8 @@ static void property_set_mode(struct btd_adapter *adapter, uint32_t setting,
 		len = sizeof(mode);
 
 		if (!mode) {
+			btd_adv_monitor_power_down(
+						adapter->adv_monitor_manager);
 			clear_discoverable(adapter);
 			remove_temporary_devices(adapter);
 		}
diff --git a/src/adv_monitor.c b/src/adv_monitor.c
index 715ac59..963e4e7 100644
--- a/src/adv_monitor.c
+++ b/src/adv_monitor.c
@@ -2011,3 +2011,54 @@ static void adv_monitor_filter_rssi(struct adv_monitor *monitor,
 					    NULL);
 	}
 }
+
+/* Clears running DeviceLost timer for a given device */
+static void clear_device_lost_timer(void *data, void *user_data)
+{
+	struct adv_monitor_device *dev = data;
+	struct adv_monitor *monitor = NULL;
+
+	if (dev->lost_timer) {
+		timeout_remove(dev->lost_timer);
+		dev->lost_timer = 0;
+
+		monitor = dev->monitor;
+
+		DBG("Calling DeviceLost() for device %p on Adv Monitor "
+				"of owner %s at path %s", dev->device,
+				monitor->app->owner, monitor->path);
+
+		g_dbus_proxy_method_call(monitor->proxy, "DeviceLost",
+				report_device_state_setup,
+				NULL, dev->device, NULL);
+	}
+}
+
+/* Clears running DeviceLost timers from each monitor */
+static void clear_lost_timers_from_monitor(void *data, void *user_data)
+{
+	struct adv_monitor *monitor = data;
+
+	queue_foreach(monitor->devices, clear_device_lost_timer, NULL);
+}
+
+/* Clears running DeviceLost timers from each app */
+static void clear_lost_timers_from_app(void *data, void *user_data)
+{
+	struct adv_monitor_app *app = data;
+
+	queue_foreach(app->monitors, clear_lost_timers_from_monitor, NULL);
+}
+
+/* Handles bt power down scenario */
+void btd_adv_monitor_power_down(struct btd_adv_monitor_manager *manager)
+{
+	if (!manager) {
+		error("Unexpected NULL btd_adv_monitor_manager object upon "
+				"power down");
+		return;
+	}
+
+	/* Clear any running DeviceLost timers in case of power down */
+	queue_foreach(manager->apps, clear_lost_timers_from_app, NULL);
+}
diff --git a/src/adv_monitor.h b/src/adv_monitor.h
index 2b4f68a..d9cb9cc 100644
--- a/src/adv_monitor.h
+++ b/src/adv_monitor.h
@@ -38,4 +38,6 @@ void btd_adv_monitor_notify_monitors(struct btd_adv_monitor_manager *manager,
 void btd_adv_monitor_device_remove(struct btd_adv_monitor_manager *manager,
 				   struct btd_device *device);
 
+void btd_adv_monitor_power_down(struct btd_adv_monitor_manager *manager);
+
 #endif /* __ADV_MONITOR_H */