[WoBluez] Stopping weave advertisement when BluezIOThread is stopped

Unregistering weave advertisement during BluezIOThread closure to stop weave advertisement when WoBluez IO thread is no longer running

Change-Id: Ic0e637f860bbb0247bf46a2002c485ce46889726
diff --git a/src/platform/ble/bluez/BluezHelperCode.cpp b/src/platform/ble/bluez/BluezHelperCode.cpp
index 86d2c16..8a40bd5 100644
--- a/src/platform/ble/bluez/BluezHelperCode.cpp
+++ b/src/platform/ble/bluez/BluezHelperCode.cpp
@@ -33,6 +33,8 @@
 
 static void WeaveRegisterSetup(DBusMessageIter * iter, void * bluezData);
 static void WeaveRegisterReply(DBusMessage * message, void * bluezData);
+static void WeaveUnregisterSetup(DBusMessageIter *iter, void *bluezData);
+static void WeaveUnregisterReply(DBusMessage *message, void *bluezData);
 static gboolean WeaveAdvertisingGetType(const GDBusPropertyTable * property, DBusMessageIter * iter, void * bluezData);
 static gboolean GetWeaveUUIDs(const GDBusPropertyTable * property, DBusMessageIter * iter, void * bluezData);
 static gboolean WeaveServiceDataCheck(const GDBusPropertyTable * property, void * bluezData);
@@ -186,6 +188,47 @@
     }
 }
 
+static void WeaveUnregisterSetup(DBusMessageIter *iter, void *bluezData)
+{
+    const char *path = ADVERTISING_PATH;
+    gboolean success = FALSE;
+    const char *msg = NULL;
+
+    success = dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path);
+    VerifyOrExit(success == TRUE, msg = "Fail to append basic in WeaveUnregisterSetup");
+
+exit:
+
+    if ((success != TRUE) && (msg != NULL))
+    {
+        WeaveLogError(Ble, msg);
+    }
+}
+
+static void WeaveUnregisterReply(DBusMessage *message, void *bluezData)
+{
+    DBusError error;
+
+    dbus_error_init(&error);
+
+    if (FALSE == dbus_set_error_from_message(&error, message))
+    {
+        WeaveLogProgress(Ble, "Weave advertisement unregistered");
+        if (gBluezDbusConn)
+        {
+            if (FALSE == g_dbus_unregister_interface(gBluezDbusConn, ADVERTISING_PATH, ADVERTISING_INTERFACE))
+            {
+                WeaveLogError(Ble, "Fail to unregister weave advertisement object in WeaveUnregisterReply");
+            }
+        }
+    }
+    else
+    {
+        WeaveLogError(Ble, "Fail to unregister weave advertisement in WeaveUnregisterReply: %s", error.name);
+        dbus_error_free(&error);
+    }
+}
+
 static gboolean WeaveAdvertisingGetType(const GDBusPropertyTable * property, DBusMessageIter * iter, void * bluezData)
 {
     gboolean success = dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &(gBluezServerEndpoint->advertisingType));
@@ -1665,6 +1708,26 @@
         WeaveLogError(Ble, msg);
     }
 
+    if (gDefaultAdapter && gDefaultAdapter->advertisingProxy)
+    {
+        WeaveLogProgress(Ble, "Unregistering weave advertisement");
+
+        if (FALSE == g_dbus_proxy_method_call(gDefaultAdapter->advertisingProxy,
+                                              "UnregisterAdvertisement",
+                                              WeaveUnregisterSetup, WeaveUnregisterReply,
+                                              gBluezDbusConn, NULL))
+        {
+            WeaveLogError(Ble, "Fail to call UnregisterAdvertisement method");
+        }
+
+        if (FALSE == g_dbus_unregister_interface(gBluezDbusConn, ADVERTISING_PATH,
+                                                 ADVERTISING_INTERFACE))
+        {
+            WeaveLogError(Ble, "Fail to unregister weave advertisement object");
+        }
+    }
+
+
     if (NULL != gBluezServerEndpoint)
     {
         if (NULL != gBluezServerEndpoint->weaveService)