Added API to disable starting advertisement automatically 30/190730/1
authorAmit KS <amit.s12@samsung.com>
Fri, 24 Aug 2018 16:25:11 +0000 (21:55 +0530)
committerAmit KS <amit.s12@samsung.com>
Fri, 5 Oct 2018 04:12:39 +0000 (09:42 +0530)
And advertisement data can be set just before starting
Following Two Pathces are integrated
1.Added API to disable starting advertisement automatically [Problem] There is no possibility to don't start advertisement.
  It is always started automatically. [Cause & Measure] Advertisement is started automatically in CAStartLEGattServer

2.Advertisement data can be set just before starting
  [Problem] It's not possible to set advertisement data after bluetooth is enabled but before advertising is started.
  [Cause & Measure] current implementation assumes setting advertisement data before turning on BT.
  This feature adds possibility to set function that will be called just before starting advertising

Change-Id: I773bbfc7bb53306609812ec9600d86d29e35d27e
Signed-off-by: Amit KS <amit.s12@samsung.com>
resource/csdk/connectivity/api/cacommon.h
resource/csdk/connectivity/api/cautilinterface.h
resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver.h
resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver_mcd.c
resource/csdk/connectivity/util/inc/camanagerleinterface.h
resource/csdk/connectivity/util/src/camanager/bt_le_manager/tizen/caleconnectionmanager.c
resource/csdk/connectivity/util/src/cautilinterface.c
resource/include/CAManager.h
resource/src/CAManager.cpp

index 618f0eb..19bbc82 100755 (executable)
@@ -697,6 +697,14 @@ typedef void (*CAErrorCallback)(const CAEndpoint_t *object,
  */
 typedef void (*CANetworkMonitorCallback)(const CAEndpoint_t *info, CANetworkStatus_t status);
 
+/**
+ * Callback function type for editing bluetooth advertisement data before starting bluetooth advertisement.
+ * param[in]   max_data_size    Maximal size of advertisement data array
+ * param[out]  data             Advertisement data array
+ * param[out]  real_data_size   Real size of advertisement data array
+ */
+typedef void (*CAAdvertisementDataGetterCB)(int max_data_size, char *data, int *real_data_size);
+
 #ifdef __cplusplus
 } /* extern "C" */
 #endif
index 15727ff..84d5c37 100644 (file)
@@ -134,8 +134,15 @@ uint16_t CAGetAssignedPortNumber(CATransportAdapter_t adapter, CATransportFlags_
 
 //custom advertisement data setting
 #if defined(__TIZEN__) && defined(LE_ADAPTER) && defined(BLE_CUSTOM_ADVERTISE)
+
 CAResult_t CASetAdvertisementData(const char* data, int length);
+
+void CASetAdvertisementDataGetter(CAAdvertisementDataGetterCB getter);
+
+void CASetAutoAdvertisement(bool autoAdvertisement);
+
 CAResult_t CASetScanResponseData(const char* data, int length);
+
 #endif
 
 #ifdef __APPLE__
index e8687fa..6e54522 100644 (file)
  */
 CAResult_t CAsetServerAdvertisementData(const char *data, int length);
 
+/**
+ * Used to set advertisement data getter callback.
+ * @param[in]   getter    Bluetooth advertisement data getter callback.
+ */
+void CAsetServerAdvertisementDataGetter(CAAdvertisementDataGetterCB getter);
+
+/**
+ * Used to set auto advertisement feature on and off.
+ *
+ * @param[in]   auto_advertisement    Boolean flag to turn auto advertisement feature on and off.
+ */
+void CAsetServerAutoAdvertisement(bool auto_advertisement);
 
 /**
  * Used to Start Server  send  response data
index 46c914c..0fe64b8 100644 (file)
@@ -27,6 +27,7 @@
 #include "oic_string.h"
 #include "oic_malloc.h"
 #include "caleutil.h"
+#include "cautilinterface.h"
 #ifndef TIZEN_4
 #include <bluetooth_internal.h>
 #endif
@@ -63,6 +64,17 @@ static bt_gatt_h g_gattWriteCharPath = NULL;
 static bt_advertiser_h g_hAdvertiser = NULL;
 
 /**
+ * Function called just before starting advertising
+ * provided data are used to setServerAdvertisementData
+ */
+static CAAdvertisementDataGetterCB g_leServerAdvertisementDataGetter = NULL;
+
+/**
+ * Control if advertise will start automatically
+ */
+static bool g_leServerAutoAdvertisement = true;
+
+/**
  * Callback register with LE adapter.  This callback is called on reception of any
  * data from the remote device.
  */
@@ -134,9 +146,15 @@ static bool cutom_scanrsp_flag = false;
 static char *custom_scanrsp_data = NULL;
 static int custom_scanrsp_data_length = 0;
 
+/**
+ * Maximum lenght of BLE advertisement packet data size is acctually 24 bytes,
+ * but for safety reason 1 additional byte is allocated.
+ */
+const int max_ble_advertisement_packet_data_size = 25;
+
+
 CAResult_t CAsetServerAdvertisementData(const char *data, int length)
 {
-    int res = 0;
     CAResult_t ret = CA_STATUS_OK;
 
     OIC_LOG(DEBUG, TAG, "IN");
@@ -148,20 +166,45 @@ CAResult_t CAsetServerAdvertisementData(const char *data, int length)
     }
 
     oc_mutex_lock(g_leServerStateMutex);
+    CAsetServerAdvertisementDataImpl(data, length);
+    oc_mutex_unlock(g_leServerStateMutex);
 
+    OIC_LOG(DEBUG, TAG, "OUT");
+    return ret;
+}
+
+void CAsetServerAdvertisementDataImpl(const char *data, int length)
+{
     cutom_adv_flag = true;
     custom_adv_data = data;
     custom_adv_data_length = length;
 
+    OIC_LOG_V(DEBUG, TAG, "Custom advertise value has set as [%s]", custom_adv_data);
+}
+
+void CAsetServerAdvertisementDataGetter(CAAdvertisementDataGetterCB getter)
+{
+    OIC_LOG(DEBUG, TAG, "IN");
+
+    oc_mutex_lock(g_leServerStateMutex);
+    g_leServerAdvertisementDataGetter = getter;
     oc_mutex_unlock(g_leServerStateMutex);
 
-    OIC_LOG_V(DEBUG, TAG, "Custom advertise value has set as [%s]", custom_adv_data);
     OIC_LOG(DEBUG, TAG, "OUT");
+}
 
-    return ret;
+void CAsetServerAutoAdvertisement(bool auto_advertisement)
+{
+    OIC_LOG(DEBUG, TAG, "IN");
+
+    oc_mutex_lock(g_leServerStateMutex);
+    g_leServerAutoAdvertisement = auto_advertisement;
+    oc_mutex_unlock(g_leServerStateMutex);
+
+    OIC_LOG(DEBUG, TAG, "OUT");
 }
 
-CAResult_t CAsetServerSanResponseData(const char *data, int length)
+CAResult_t CAsetServerScanResponseData(const char *data, int length)
 {
     int res = 0;
     CAResult_t ret = CA_STATUS_OK;
@@ -222,11 +265,18 @@ void CALEGattServerConnectionStateChanged(bool connected, const char *remoteAddr
         CARemoveLEClientInfoFromList(&g_LEClientList, remoteAddress);
         oc_mutex_unlock(g_LEClientListMutex);
 
-        res = CALEStartAdvertise();
-        if (CA_STATUS_OK != res)
+        if(g_leServerAutoAdvertisement)
         {
-            OIC_LOG_V(ERROR, TAG, "Failed to start advertising [%d]", res);
-            return;
+            res = CALEStartAdvertise();
+            if (CA_STATUS_OK != res)
+            {
+                OIC_LOG_V(ERROR, TAG, "Failed to start advertising [%d]", res);
+                return;
+            }
+        }
+        else
+        {
+            OIC_LOG(WARNING, TAG, "Auto advertisement is DISABLED. Advertising is not started.");
         }
     }
 }
@@ -308,16 +358,23 @@ CAResult_t CAStartLEGattServer()
         CATerminateLEGattServer();
         return CA_STATUS_FAILED;
     }
-
-    ret = CALEStartAdvertise();
-    if (CA_STATUS_OK != ret)
+    
+    if(g_leServerAutoAdvertisement)
     {
-        OIC_LOG_V(ERROR, TAG, "CALEStartAdvertise failed[%d]", ret);
-        oc_mutex_unlock(g_leServerStateMutex);
-        CATerminateLEGattServer();
-        return CA_STATUS_FAILED;
+        ret = CALEStartAdvertise();
+        if (CA_STATUS_OK != ret)
+        {
+            OIC_LOG_V(ERROR, TAG, "CALEStartAdvertise failed[%d]", ret);
+            oc_mutex_unlock(g_leServerStateMutex);
+            CATerminateLEGattServer();
+            return CA_STATUS_FAILED;
+        }
     }
-
+    else
+    {
+        OIC_LOG(WARNING, TAG, "Auto advertisement is DISABLED. Advertising is not started.");
+    }
+    
     g_isLEGattServerStarted = true;
 
     oc_mutex_unlock(g_leServerStateMutex);
@@ -347,13 +404,31 @@ void CALENotificationCb(bool notify, bt_gatt_server_h server, bt_gatt_h gatt_han
 CAResult_t CALEStartAdvertise()
 {
     OIC_LOG(DEBUG, TAG, "IN");
+    char * data = NULL;
+
+    if(g_leServerAdvertisementDataGetter)
+    {
+        int length;
+        data = (char*) malloc(max_ble_advertisement_packet_data_size);
+        g_leServerAdvertisementDataGetter(max_ble_advertisement_packet_data_size, data, &length);
+        if(!data || length <= 0)
+        {
+            OIC_LOG(WARNING, TAG, "Invalid data. Custom advertisement data will not be set.");
+        }
+        else
+        {
+            CAsetServerAdvertisementDataImpl(data, length);
+        }
+    }
 
     CAResult_t res = CALEStartAdvertiseImpl(CA_GATT_SERVICE_UUID);
     if (CA_STATUS_OK != res)
     {
         OIC_LOG_V(ERROR, TAG, "CALEStartAdvertiseImpl failed[%d]", res);
     }
-
+    
+    //This array is freed here because it's used in CALEStartAdvertiseImpl() method (freeing earlier causes bluetooth to crash)
+    free(data);
     OIC_LOG(DEBUG, TAG, "OUT");
     return res;
 }
index 4a0de07..f0bf2b9 100644 (file)
@@ -50,7 +50,30 @@ CAResult_t CAUnsetLEClientAutoConnectionDeviceInfo();
 
 //custom advertisement data
 #if defined(__TIZEN__) && defined(LE_ADAPTER) && defined(BLE_CUSTOM_ADVERTISE)
+/**
+ * Set custom bluetooth advertisement data.
+ * @param[in]   data      Array of bluetooth advertisement data.
+ * @param[in]   length    Length of data array.
+ */
 CAResult_t CAManagerLEServerSetAdvertisementData(const char* data, int length);
+
+/**
+ * Set custom bluetooth advertisement data getter callback.
+ * @param[in]   getter    Custom bluetooth advertisement data getter callback.
+ */
+void CAManagerLEServerSetAdvertisementDataGetter(CAAdvertisementDataGetterCB getter);
+
+/**
+ * Set auto advertisement enabling flag.
+ * @param[in]   autoAdvertisement   Boolean flag to turn autoadvertisement on or off.
+ */
+void CAManagerLEServerSetAutoAdverisement(bool autoAdvertisement);
+
+/**
+ * Scan custom bluetooth advertisement data and write it to broadcaster.
+ * @param[in]   data      Array of bluetooth advertisement data.
+ * @param[in]   length    Lenght of data array.
+ */
 CAResult_t CAManagerLEServerSetScanResponseData(const char* data, int length);
 #endif
 
index df46ccc..813b68e 100644 (file)
@@ -89,10 +89,20 @@ CAResult_t CAManagerLEServerSetAdvertisementData(const char *data, int length)
     }
 }
 
+void CAManagerLEServerSetAdvertisementDataGetter(CAAdvertisementDataGetterCB getter)
+{
+    return CAsetServerAdvertisementDataGetter(getter);
+}
+
+void CAManagerLEServerSetAutoAdvertisement(bool autoAdvertisement)
+{
+    return CAsetServerAutoAdvertisement(autoAdvertisement);
+}
+
 CAResult_t CAManagerLEServerSetScanResponseData(const char *data, int length)
 {
 
-    CAResult_t res =  CAsetServerSanResponseData(data, length);
+    CAResult_t res =  CAsetServerScanResponseData(data, length);
 
     if (CA_STATUS_OK != res)
     {
index 1e84239..756a9fa 100644 (file)
@@ -217,6 +217,14 @@ CAResult_t CASetAdvertisementData(const char* data, int length)
 {
        return CAManagerLEServerSetAdvertisementData(data, length);
 }
+void CASetAdvertisementDataGetter(CAAdvertisementDataGetterCB getter)
+{
+       return CAManagerLEServerSetAdvertisementDataGetter(getter);
+}
+void CASetAutoAdvertisement(bool autoAdvertisement)
+{
+       return CAManagerLEServerSetAutoAdvertisement(autoAdvertisement);
+}
 CAResult_t CASetScanResponseData(const char* data, int length)
 {
        return CAManagerLEServerSetScanResponseData(data, length);
index 1ac687f..0157b9e 100644 (file)
@@ -22,6 +22,7 @@
 #define CA_MANAGER_H_
 
 #include <OCApi.h>
+#include "cacommon.h"
 
 namespace OC
 {
@@ -128,6 +129,26 @@ namespace OC
         //Custom advertise
 #if defined(__TIZEN__) && defined(LE_ADAPTER) && defined(BLE_CUSTOM_ADVERTISE)
         OCStackResult setAdvertisementData(const char* data, int length);
+
+        /**
+         * Set function that will be called before starting advertising.
+         * Provided data and length will be used to set advertisement data.
+         * @param[in]   getter                 Custom bluetooth advertisement data getter callback.
+         */
+        void setAdvertisementDataGetter(CAAdvertisementDataGetterCB getter);
+
+        /**
+         * set if advertising should be started automatically.
+         * By default advertising is automatically started.
+         * @param[in]  autoAdvertisement         true for automatic start
+         */
+        void setAutoAdvertisement(bool autoAdvertisement);
+
+        /**
+         * Scan and set data for custom bluetooth advertisement.
+         * @param[in]   data                   Array with custom bluetooth advertisement data.
+         * @param[in]   lenght                 Lenght of data array.
+         */
         OCStackResult setScanResponseData(const char* data, int length);
 #endif
 
index cb9ea40..4743939 100644 (file)
@@ -168,7 +168,14 @@ OCStackResult CAManager::setAdvertisementData(const char* data, int length)
 
     return convertCAResultToOCResult(ret);
 }
-
+void CAManager::setAdvertisementDataGetter(CAAdvertisementDataGetterCB getter)
+{
+    return CASetAdvertisementDataGetter(getter);
+}
+void CAManager::setAutoAdvertisement(bool autoAdvertisement)
+{
+    return CASetAutoAdvertisement(autoAdvertisement);
+}
 OCStackResult CAManager::setScanResponseData(const char* data, int length)
 {
     CAResult_t ret = CASetScanResponseData(data, length);