[CONPRO-1483] Implementation of API for setting scanfilter UUIDs 84/214384/1
authorsamanway <samanway@samanway.sa.corp.samsungelectronics.net>
Tue, 3 Sep 2019 15:54:59 +0000 (21:24 +0530)
committerSudipto <sudipto.bal@samsung.com>
Tue, 3 Sep 2019 15:54:59 +0000 (21:24 +0530)
- Currently, IoTivity sets the custom UUIDs to set scanfilters for Android BLE client by hard coding UUIDs
- This patch implements CASetLEScanUuid API to set the UUIDs to add more scanfilters

Change-Id: I167bb7b7b24589e88d4b7c8120cea9b72a5918b1
Signed-off-by: samanway-dey <samanway.dey@samsung.com>
Signed-off-by: Sudipto <sudipto.bal@samsung.com>
android/android_api/base/jni/JniCaInterface.c
android/android_api/base/jni/JniCaInterface.h
android/android_api/base/src/main/java/org/iotivity/ca/CaInterface.java
resource/csdk/connectivity/api/cautilinterface.h
resource/csdk/connectivity/src/bt_le_adapter/android/caleclient.c
resource/csdk/connectivity/src/bt_le_adapter/android/caleclient.h
resource/csdk/connectivity/src/bt_le_adapter/android/caleutils.c
resource/csdk/connectivity/src/bt_le_adapter/android/caleutils.h
resource/csdk/connectivity/util/inc/camanagerleinterface.h
resource/csdk/connectivity/util/src/camanager/bt_le_manager/android/caleconnectionmanager.c
resource/csdk/connectivity/util/src/cautilinterface.c

index 2a7861b..4694820 100644 (file)
@@ -323,6 +323,25 @@ Java_org_iotivity_ca_CaInterface_caBtPairingTerminate(JNIEnv *env, jclass clazz)
 }
 
 JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_setLeScanUuidImpl(JNIEnv *env, jclass clazz, jstring uuid, jint uuid_type)
+{
+    LOGI("setLeScanUuidImpl");
+    (void)env;
+    (void)clazz;
+    if (uuid)
+    {
+        //convert java string to native string
+        const char* nativeUuid = (*env)->GetStringUTFChars(env, uuid, NULL);
+        if (!nativeUuid)
+        {
+            LOGE("Native UUID is null");
+            return;
+        }
+        CASetLEScanUuid(nativeUuid, uuid_type);
+    }
+}
+
+JNIEXPORT void JNICALL
 Java_org_iotivity_ca_CaInterface_caBtPairingStartScan(JNIEnv *env, jclass clazz)
 {
     LOGI("caBtPairingStartScan");
index d13b47e..34efa10 100644 (file)
@@ -105,6 +105,13 @@ extern "C" {
     Java_org_iotivity_ca_CaInterface_caBtPairingStopScan(JNIEnv *, jclass);
 
     /*
+     * Class:     Java_org_iotivity_ca_CaInterface_setLEScanUuidImpl
+     * Method:    setLeScanUuidImpl
+     * Signature: (Ljava/lang/String;I)V
+     */
+    JNIEXPORT void JNICALL
+    Java_org_iotivity_ca_CaInterface_setLeScanUuidImpl(JNIEnv *, jclass, jstring, jint);
+    /*
      * Class:     Java_org_iotivity_ca_CaInterface_caBtPairingCreateBond
      * Method:    caBtPairingCreateBond
      * Signature: (Landroid/bluetooth/BluetoothDevice;)V
index 73fec6c..9fa0659 100644 (file)
@@ -38,6 +38,11 @@ public class CaInterface {
     private static volatile boolean isConnectionManagerInitialized = false;
     private static volatile boolean isBtPairingInitialized = false;
 
+    public enum UuidType {
+        SERVICE_UUID,
+        MANUFACTURER_DATA
+    }
+
     public static native void initialize(Activity activity, Context context);
 
     /**
@@ -204,6 +209,18 @@ public class CaInterface {
     private static native void stopLeScanImpl();
 
     /**
+     *  set UUID for scanfilter.
+     *  there can be two ways to set scanfilters, firstly setting service UUIDs as filter and
+     *  other way is setting manufacture data based filter.
+     *  @param uuid                          service uuid or manufacture data.
+     *  @param uuid_type                     0 for service uuid, 1 for manufacture data.
+     */
+    public synchronized static void setLeScanUuid(String uuid, int uuid_type){
+        CaInterface.setLeScanUuidImpl(uuid, uuid_type);
+    }
+    private static native void setLeScanUuidImpl(String uuid, int uuid_type);
+
+    /**
      *  start BLE Advertising.
      */
     public synchronized static void startLeAdvertising(){
index 0d1bbfb..1b14968 100644 (file)
@@ -286,6 +286,15 @@ CAResult_t CAUtilStartLEScan();
 CAResult_t CAUtilClientDisconnect();
 #endif
 
+#if defined(__ANDROID__)
+/**
+ *  set UUID for setting scanfilter, which will add another scanfilter for BLE scanning in android client based on the UUID or manufacture data provided
+ *  @param[in]   uuid                 service UUID string or manufacture Data
+ *  @param[in]   uuid_type            Type of scanfilter to be added i.e. service UUID based or manufacture data based
+ */
+void CASetLEScanUuid(char* uuid, int uuid_type);
+#endif
+
 #ifdef __ANDROID__
 /**
  * initialize util client for android
@@ -298,7 +307,7 @@ CAResult_t CAUtilClientDisconnect();
 CAResult_t CAUtilClientInitialize(JNIEnv *env, JavaVM *jvm, jobject context);
 
 /**
- * terminate util client for android
+ * terminate util client for android.
  * @param[in]   env                   JNI interface pointer.
  *
  * @return  ::CA_STATUS_OK or ::CA_STATUS_FAILED or ::CA_MEMORY_ALLOC_FAILED
index 83ed0ae..9bf9330 100644 (file)
@@ -30,6 +30,7 @@
 #include "caleinterface.h"
 #include "caadapterutils.h"
 
+#include "uarraylist.h"
 #include "logger.h"
 #include "oic_malloc.h"
 #include "oic_string.h"
@@ -121,6 +122,15 @@ static int32_t g_jniIntSdk = -1;
 static bool g_setHighQoS = true;
 static bool g_setFullScanFlag = false;
 jclass g_LEInterface = NULL;
+static int g_manufactureDataCount = 0;
+static int g_serviceUuidCount = 0;
+
+// List of Service UUIDs
+static u_arraylist_t* g_serviceUuidList = NULL;
+
+// List of Manufacture Data
+static u_arraylist_t* g_manufactureDataList = NULL;
+
 /**
  * check if retry logic for connection routine has to be stopped or not.
  * in case of error value including this method, connection routine has to be stopped.
@@ -421,11 +431,62 @@ error_exit:
     return CA_STATUS_FAILED;
 }
 
+void CALEClientAddUuid(char* uuid, int uuid_type)
+{
+    OIC_LOG(DEBUG, TAG, "CALEClientAddUuid");
+    VERIFY_NON_NULL_VOID(uuid, TAG, "uuid is null");
+
+    if (uuid_type == CA_LE_TYPE_CUSTOM_UUID)
+    {
+       if (g_manufactureDataCount == 0)
+       {
+           g_manufactureDataList = u_arraylist_create();
+          OIC_LOG(DEBUG, TAG, "List of manufacture data created");
+       }
+       for (int i = 0; i < g_manufactureDataCount; i++)
+       {
+            char *str = u_arraylist_get(g_manufactureDataList, i);
+            if (!strcmp(uuid, str))
+            {
+                OIC_LOG(DEBUG, TAG, "UUID already set before");
+                return;
+            }
+        }
+        g_manufactureDataCount++;
+        bool result = u_arraylist_add(g_manufactureDataList, uuid);
+        OIC_LOG_V(DEBUG, TAG, "Adding manufacture data: %s", u_arraylist_get(g_manufactureDataList, g_manufactureDataCount - 1));
+    }
+    else //uuid_type == CA_LE_TYPE_SERVICE_UUID
+    {
+        if (g_serviceUuidCount == 0)
+        {
+            g_serviceUuidList = u_arraylist_create();
+            OIC_LOG(DEBUG, TAG, "List of service uuid created");
+        }
+        for (int i = 0; i < g_serviceUuidCount; i++)
+        {
+            char *str = u_arraylist_get(g_serviceUuidList, i);
+            if (!strcmp(uuid, str))
+            {
+                OIC_LOG(DEBUG, TAG, "UUID already set before");
+                return;
+            }
+        }
+        g_serviceUuidCount++;
+        bool result = u_arraylist_add(g_serviceUuidList, uuid);
+        OIC_LOG_V(DEBUG, TAG, "Adding service UUID: %s", u_arraylist_get(g_serviceUuidList, g_serviceUuidCount - 1));
+    }
+}
+
 CAResult_t CALEClientInitialize()
 {
     OIC_LOG(DEBUG, TAG, "CALEClientInitialize");
 
     CALEClientJniInit();
+    CALEClientAddUuid(OIC_GATT_SERVICE_UUID, CA_LE_TYPE_SERVICE_UUID);
+    CALEClientAddUuid(OIC_GATT_CUSTOM_UUID, CA_LE_TYPE_CUSTOM_UUID);
+    CALEClientAddUuid(OIC_GATT_CUSTOM_UUID2, CA_LE_TYPE_CUSTOM_UUID);
+    CALEClientAddUuid(OIC_GATT_CUSTOM_UUID3, CA_LE_TYPE_CUSTOM_UUID);
 
     if (!g_jvm)
     {
@@ -570,6 +631,9 @@ void CALEClientTerminate()
         g_LEInterface = NULL;
     }
 
+    u_arraylist_free(&g_serviceUuidList);
+    u_arraylist_free(&g_manufactureDataList);
+
     CALEDeleteSendBuffer(env);
 
     if (g_uuidList)
@@ -1767,6 +1831,7 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     VERIFY_NON_NULL(uuids, TAG, "uuids is null");
     VERIFY_NON_NULL(env, TAG, "env is null");
 
+    int i, j;
     if (!CALEIsEnableBTAdapter(env))
     {
         OIC_LOG(INFO, TAG, "BT adapter is not enabled");
@@ -1821,53 +1886,35 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     }
 
     // call scanfilter.Builder()
-    jobject jni_obj_scanfilterBuilder = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
-                                                          jni_mid_scanfilterBuilderCtor);
-    if (!jni_obj_scanfilterBuilder)
+    jobject jni_obj_servicescanfilterBuilder[g_serviceUuidCount];
+    for (i = 0; i < g_serviceUuidCount; i++)
     {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilterBuilder is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
-        return CA_STATUS_FAILED;
-    }
-
-    // call scanfilter.Builder()
-    jobject jni_obj_scanfilterBuilder2 = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
+        jni_obj_servicescanfilterBuilder[i] = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
                                                           jni_mid_scanfilterBuilderCtor);
-    if (!jni_obj_scanfilterBuilder2)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilterBuilder2 is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        return CA_STATUS_FAILED;
+        if (!jni_obj_servicescanfilterBuilder[i])
+        {
+            OIC_LOG_V(ERROR, TAG, "scanfilter: jni_obj_servicescanfilterBuilder[%d] is null", i);
+            (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
+            for (j = 0; j < i; j++)
+                (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[j]);
+            return CA_STATUS_FAILED;
+        }
     }
 
     // call scanfilter.Builder()
-    jobject jni_obj_scanfilterBuilder3 = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
-                                                          jni_mid_scanfilterBuilderCtor);
-    if (!jni_obj_scanfilterBuilder3)
+    jobject jni_obj_customscanfilterBuilder[g_manufactureDataCount];
+    for (i = 0; i < g_manufactureDataCount; i++)
     {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilterBuilder3 is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        return CA_STATUS_FAILED;
-    }
-
-    // call scanfilter.Builder()
-    jobject jni_obj_scanfilterBuilder4 = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
+        jni_obj_customscanfilterBuilder[i] = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
                                                           jni_mid_scanfilterBuilderCtor);
-    if (!jni_obj_scanfilterBuilder4)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilterBuilder4 is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        return CA_STATUS_FAILED;
+       if (!jni_obj_customscanfilterBuilder[i])
+        {
+            OIC_LOG_V(ERROR, TAG, "scanfilter: jni_obj_customscanfilterBuilder[%d] is null", i);
+           (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
+           for (j = 0; j < i; j++)
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[j]);
+           return CA_STATUS_FAILED;
+        }
     }
 
     // get scanfilter.Builder.setServiceUuid method id
@@ -1880,10 +1927,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
         OIC_LOG(ERROR, TAG, "scanfilter: jni_mid_setServiceUuid is null");
         CACheckJNIException(env);
         (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        for (i = 0; i < g_serviceUuidCount; i++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[i]);
+        }
+        for (i = 0; i < g_manufactureDataCount; i++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[i]);
+        }
         return CA_STATUS_FAILED;
     }
 
@@ -1897,10 +1948,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
         OIC_LOG(ERROR, TAG, "scanfilter: jni_mid_setManufacturerData is null");
         CACheckJNIException(env);
         (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        for (i = 0; i < g_serviceUuidCount; i++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[i]);
+        }
+        for (i = 0; i < g_manufactureDataCount; i++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[i]);
+        }
         return CA_STATUS_FAILED;
     }
     // get scanfilter.Builder.build method id
@@ -1914,200 +1969,146 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
         OIC_LOG(ERROR, TAG, "scanfilter: jni_mid_build_scanfilterBuilder is null");
         CACheckJNIException(env);
         (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        for (i = 0; i < g_serviceUuidCount; i++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[i]);
+        }
+        for (i = 0; i < g_manufactureDataCount; i++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[i]);
+        }
         return CA_STATUS_FAILED;
     }
     (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
 
-    // call ParcelUuid.fromSting(uuid)
-    jobject jni_obj_parcelUuid = CALEGetParcelUuidFromString(env, OIC_GATT_SERVICE_UUID);
-    if (!jni_obj_parcelUuid)
+    jobject jni_obj_parcelUuid, jni_obj_setServiceUuid;
+    jobject jni_obj_servicescanfilter[g_serviceUuidCount];
+
+    for (i = 0; i < g_serviceUuidCount; i++)
     {
-        OIC_LOG(ERROR, TAG, "scanSettings: jni_obj_parcelUuid is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
+        // call ParcelUuid.fromSting(uuid)
+        jni_obj_parcelUuid = CALEGetParcelUuidFromString(env, u_arraylist_get(g_serviceUuidList, i));
+        if (!jni_obj_parcelUuid)
+        {
+            OIC_LOG(ERROR, TAG, "scanSettings: jni_obj_parcelUuid is null");
+            CACheckJNIException(env);
+            for (j = i; j < g_serviceUuidCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[j]);
+            }
+            for (j = 0; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[j]);
+            }
+            return CA_STATUS_FAILED;
+        }
 
-    // call setServiceUuid(uuid)
-    jobject jni_obj_setServiceUuid = (*env)->CallObjectMethod(env,
-                                                              jni_obj_scanfilterBuilder,
+        // call setServiceUuid(uuid)
+        jni_obj_setServiceUuid = (*env)->CallObjectMethod(env,
+                                                              jni_obj_servicescanfilterBuilder[i],
                                                               jni_mid_setServiceUuid,
                                                               jni_obj_parcelUuid);
-    if (!jni_obj_setServiceUuid)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setServiceUuid is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        if (!jni_obj_setServiceUuid)
+        {
+            OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setServiceUuid is null");
+            CACheckJNIException(env);
+            for (j = i; j < g_serviceUuidCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[j]);
+            }
+            for (j = 0; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[j]);
+            }
+           (*env)->DeleteLocalRef(env, jni_obj_parcelUuid);
+            return CA_STATUS_FAILED;
+       }
         (*env)->DeleteLocalRef(env, jni_obj_parcelUuid);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_obj_parcelUuid);
-    (*env)->DeleteLocalRef(env, jni_obj_setServiceUuid);
+        (*env)->DeleteLocalRef(env, jni_obj_setServiceUuid);
 
-    // call build()
-    jobject jni_obj_scanfilter = (*env)->CallObjectMethod(env,
-                                                          jni_obj_scanfilterBuilder,
+        // call build()
+        jni_obj_servicescanfilter[i] = (*env)->CallObjectMethod(env,
+                                                          jni_obj_servicescanfilterBuilder[i],
                                                           jni_mid_build_scanfilterBuilder);
-    if (!jni_obj_scanfilter)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilter is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
+        if (!jni_obj_servicescanfilter[i])
+        {
+            OIC_LOG_V(ERROR, TAG, "scanfilter: jni_obj_scanfilter[%d] is null", i);
+            CACheckJNIException(env);
+            for (j = i; j < g_serviceUuidCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[j]);
+            }
+            for (j = 0; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[j]);
+            }
+            return CA_STATUS_FAILED;
+        }
+        (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[i]);
 
-    OIC_LOG(DEBUG, TAG, "Service UUID scanfilter set");
+        OIC_LOG_V(DEBUG, TAG, "Total %d Service UUID based scanfilter(s) created by now", i + 1);
+    }
 
     jint jni_int_manId;
     jbyteArray jni_byte_manData;
+    jobject jni_obj_setManufacturerData;
+    jobject jni_obj_customscanfilter[g_manufactureDataCount];
     // set manufactererId
     jni_int_manId = MANUFACTURE_ID;
 
-    // call utility function to set manufacturerData
-    jni_byte_manData = CALEGetManufacturerData(env, OIC_GATT_CUSTOM_UUID);
-    if(!jni_byte_manData)
-    {
-        OIC_LOG(ERROR, TAG, "scanSettings: jni_byte_manData is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-
-    // call set(uuid)
-    jobject jni_obj_setManufacturerData = (*env)->CallObjectMethod(env,
-                                                              jni_obj_scanfilterBuilder2,
-                                                              jni_mid_setManufacturerData,
-                                                              jni_int_manId,
-                                                              jni_byte_manData);
-    if (!jni_obj_setManufacturerData)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setManufacturerData is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_byte_manData);
-    (*env)->DeleteLocalRef(env, jni_obj_setManufacturerData);
-
-    // call build()
-    jobject jni_obj_scanfilter2 = (*env)->CallObjectMethod(env,
-                                                          jni_obj_scanfilterBuilder2,
-                                                          jni_mid_build_scanfilterBuilder);
-    if (!jni_obj_scanfilter2)
+    // set custom scanfilters
+    for (i = 0; i < g_manufactureDataCount; i++)
     {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilter2 is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-
-    OIC_LOG(DEBUG, TAG, "First custom UUID scanfilter set");
-
-    // call utility function to set manufacturerData
-    jni_byte_manData = CALEGetManufacturerData(env, OIC_GATT_CUSTOM_UUID2);
-    if(!jni_byte_manData)
-    {
-        OIC_LOG(ERROR, TAG, "scanSettings: jni_byte_manData is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
+        // call utility function to set manufacturerData
+        jni_byte_manData = CALEGetManufacturerData(env, u_arraylist_get(g_manufactureDataList, i));
+        if (!jni_byte_manData)
+        {
+            OIC_LOG(ERROR, TAG, "scanSettings: jni_byte_manData is null");
+            CACheckJNIException(env);
+           for(j = i; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[j]);
+            }
+            return CA_STATUS_FAILED;
+        }
 
-    // call set(uuid)
-    jni_obj_setManufacturerData = (*env)->CallObjectMethod(env,
-                                                              jni_obj_scanfilterBuilder3,
+        // call set(uuid)
+        jni_obj_setManufacturerData = (*env)->CallObjectMethod(env,
+                                                              jni_obj_customscanfilterBuilder[i],
                                                               jni_mid_setManufacturerData,
                                                               jni_int_manId,
                                                               jni_byte_manData);
+       if (!jni_obj_setManufacturerData)
+       {
+            OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setManufacturerData is null");
+            CACheckJNIException(env);
+           for (j = i; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[j]);
+            }
+            return CA_STATUS_FAILED;
+        }
+        (*env)->DeleteLocalRef(env, jni_byte_manData);
+        (*env)->DeleteLocalRef(env, jni_obj_setManufacturerData);
+
+        // call build()
+       jni_obj_customscanfilter[i] = (*env)->CallObjectMethod(env,
+                                                            jni_obj_customscanfilterBuilder[i],
+                                                            jni_mid_build_scanfilterBuilder);
+       if (!jni_obj_customscanfilter[i])
+        {
+            OIC_LOG_V(ERROR, TAG, "scanfilter: jni_obj_customscanfilter[%d] is null", i);
+            CACheckJNIException(env);
+            for (j = i; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[j]);
+            }
+            return CA_STATUS_FAILED;
+       }
+       (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[i]);
 
-    if (!jni_obj_setManufacturerData)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setManufacturerData is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_byte_manData);
-    (*env)->DeleteLocalRef(env, jni_obj_setManufacturerData);
-
-    // call build()
-    jobject jni_obj_scanfilter3 = (*env)->CallObjectMethod(env,
-                                                          jni_obj_scanfilterBuilder3,
-                                                          jni_mid_build_scanfilterBuilder);
-    if (!jni_obj_scanfilter3)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilter3 is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-    OIC_LOG(DEBUG, TAG, "Second custom UUID scanfilter set");
-
-    // call utility function to set manufacturerData
-    jni_byte_manData = CALEGetManufacturerData(env, OIC_GATT_CUSTOM_UUID3);
-    if(!jni_byte_manData)
-    {
-        OIC_LOG(ERROR, TAG, "scanSettings: jni_byte_manData is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-
-    // call set(uuid)
-    jni_obj_setManufacturerData = (*env)->CallObjectMethod(env,
-                                                               jni_obj_scanfilterBuilder4,
-                                                               jni_mid_setManufacturerData,
-                                                               jni_int_manId,
-                                                               jni_byte_manData);
-
-    if (!jni_obj_setManufacturerData)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setManufacturerData is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_byte_manData);
-    (*env)->DeleteLocalRef(env, jni_obj_setManufacturerData);
-
-    // call build()
-    jobject jni_obj_scanfilter4 = (*env)->CallObjectMethod(env,
-                                                           jni_obj_scanfilterBuilder4,
-                                                           jni_mid_build_scanfilterBuilder);
-    if (!jni_obj_scanfilter4)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilter4 is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
+       OIC_LOG_V(DEBUG, TAG, "Total %d manufacture data based scanfilter(s) created by now", i + 1);
     }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-    OIC_LOG(DEBUG, TAG, "Third custom UUID scanfilter set");
 
     // get scanSettings.Builder class id
     jclass jni_cid_scanSettingsBuilder = (*env)->FindClass(env,
@@ -2117,7 +2118,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "scanSettings: jni_cid_scanSettingsBuilder is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         return CA_STATUS_FAILED;
     }
 
@@ -2128,7 +2136,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "scanSettings: jni_mid_scanSettingsBuilderCtor is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_cid_scanSettingsBuilder);
         return CA_STATUS_FAILED;
     }
@@ -2142,7 +2157,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "scanSettings: jni_mid_setScanMode is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_cid_scanSettingsBuilder);
         return CA_STATUS_FAILED;
     }
@@ -2157,7 +2179,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "scanSettings: jni_mid_build_scanSettings is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_cid_scanSettingsBuilder);
         return CA_STATUS_FAILED;
     }
@@ -2169,7 +2198,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanSettingBuilder is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_cid_scanSettingsBuilder);
         return CA_STATUS_FAILED;
     }
@@ -2180,7 +2216,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "ArrayList: jni_cid_arrayList is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
         return CA_STATUS_FAILED;
     }
@@ -2190,7 +2233,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "ArrayList: jni_mid_arrayListCtor is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_cid_arrayList);
         (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
         return CA_STATUS_FAILED;
@@ -2202,7 +2252,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "ArrayList: jni_mid_arrayListAdd is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_cid_arrayList);
         (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
         return CA_STATUS_FAILED;
@@ -2212,66 +2269,66 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     if (!jni_obj_filterList)
     {
         OIC_LOG(ERROR, TAG, "ArrayList: jni_obj_filterList is null");
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_cid_arrayList);
         (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
         return CA_STATUS_FAILED;
     }
     (*env)->DeleteLocalRef(env, jni_cid_arrayList);
 
-    jboolean jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
-                                                                   jni_mid_arrayListAdd,
-                                                                   jni_obj_scanfilter);
-    if (!jni_bool_arrayListIsAdded)
+    jboolean jni_bool_arrayListIsAdded;
+    for (i = 0; i < g_serviceUuidCount; i++)
     {
-        OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
-        (*env)->DeleteLocalRef(env, jni_obj_filterList);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
-        (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
-
-    jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
+        jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
                                                                    jni_mid_arrayListAdd,
-                                                                   jni_obj_scanfilter2);
-    if (!jni_bool_arrayListIsAdded)
-    {
-        OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
-        (*env)->DeleteLocalRef(env, jni_obj_filterList);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
-        return CA_STATUS_FAILED;
+                                                                   jni_obj_servicescanfilter[i]);
+        if (!jni_bool_arrayListIsAdded)
+        {
+            OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
+            (*env)->DeleteLocalRef(env, jni_obj_filterList);
+            for(j = i; j < g_serviceUuidCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+            }
+           for(j = 0; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+            }
+            (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
+            return CA_STATUS_FAILED;
+        }
+        (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[i]);
+       OIC_LOG_V(INFO, TAG, "%d st/nd/th service uuid based scanFilters Added", i + 1);
     }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilter2);
 
-    jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
-                                                                   jni_mid_arrayListAdd,
-                                                                   jni_obj_scanfilter3);
-    if (!jni_bool_arrayListIsAdded)
+    for (i = 0; i < g_manufactureDataCount; i++)
     {
-        OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
-        (*env)->DeleteLocalRef(env, jni_obj_filterList);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilter3);
-
-    jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
+        jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
                                                                    jni_mid_arrayListAdd,
-                                                                   jni_obj_scanfilter4);
-    if (!jni_bool_arrayListIsAdded)
-    {
-        OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
-        (*env)->DeleteLocalRef(env, jni_obj_filterList);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter4);
-        (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
-        return CA_STATUS_FAILED;
+                                                                   jni_obj_customscanfilter[i]);
+        if (!jni_bool_arrayListIsAdded)
+        {
+            OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
+           (*env)->DeleteLocalRef(env, jni_obj_filterList);
+            for(j = i; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+            }
+            (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
+            return CA_STATUS_FAILED;
+        }
+        (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[i]);
+       OIC_LOG_V(INFO, TAG, "%d st/nd/th manufacture data based scanFilters Added", i + 1);
     }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilter4);
 
-    OIC_LOG(INFO, TAG, "ScanFilters Added");
+    OIC_LOG(INFO, TAG, "All ScanFilters Added");
     // get ScanSettings.SCAN_MODE_BALANCED jint value
     jint jni_int_scanBalancedMode = CALEGetConstantsValue(env, CLASSPATH_LE_SCANSETTINGS,
                                                           "SCAN_MODE_BALANCED");
index e05a0d4..f108cea 100644 (file)
@@ -71,6 +71,12 @@ void CALEClientJNISetContext();
 CAResult_t CALEClientCreateJniInterfaceObject();
 
 /**
+ *  set UUID for setting scanfilter
+ *  @param[in]   uuid                 UUID string(service UUID or manufacture data)
+ *  @param[in]   uuid_type            Type of UUID i.e. service UUID or manufacture data
+ */
+void CALEClientAddUuid(char* uuid, int uuid_type);
+/**
  * initialize client for BLE.
  * @return  ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
  */
index ca3091b..e41acfa 100644 (file)
@@ -150,6 +150,29 @@ error_exit:
     return NULL;
 }
 
+static int CALEGetIntFromHex(char c)
+{
+    if(c >= '0' && c <= '9')
+        return c - '0';
+    switch (c)
+    {
+        case 'A':
+            return 10;
+        case 'B':
+            return 11;
+        case 'C':
+            return 12;
+        case 'D':
+            return 13;
+        case 'E':
+            return 14;
+        case 'F':
+            return 15;
+        default:
+            return -1;
+    }
+}
+
 jbyteArray CALEGetManufacturerData(JNIEnv *env, const char* uuid)
 {
     VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL);
@@ -157,21 +180,14 @@ jbyteArray CALEGetManufacturerData(JNIEnv *env, const char* uuid)
 
     jbyteArray jni_byte_Data = (*env)->NewByteArray(env, 2);
     uint8_t data_array[2];
-    if(uuid[7] == '9')
-    {
-        // OIC_GATT_CUSTOM_UUID
-        data_array[0] = 66, data_array[1] = 9;
-    }
-    else if(uuid[7] == '4')
-    {
-        // OIC_GATT_CUSTOM_UUID2
-        data_array[0] = 66, data_array[1] = 4;
-    }
-    else
-    {
-        // OIC_GATT_CUSTOM_UUID3
-        data_array[0] = 66, data_array[1] = 12;
-    }
+    int c1,c2,c3,c4;
+    c1 = CALEGetIntFromHex(uuid[4]);
+    c2 = CALEGetIntFromHex(uuid[5]);
+    c3 = CALEGetIntFromHex(uuid[6]);
+    c4 = CALEGetIntFromHex(uuid[7]);
+    data_array[0] = c1 * 16 + c2;
+    data_array[1] = c3 * 16 + c4;
+    OIC_LOG_V(DEBUG, TAG, "data_array[0]: %d, data_array[1]: %d", data_array[0], data_array[1]);
     (*env)->SetByteArrayRegion(env, jni_byte_Data, 0, 2, data_array);
     return jni_byte_Data;
 
index 1a5013a..ee52303 100644 (file)
@@ -40,9 +40,13 @@ extern "C"
 #define CA_LE_CONNECTION_STATE     2
 #define CA_LE_SEND_STATE           3
 #define CA_LE_DESCRIPTOR_FOUND     4
+#define CA_LE_TYPE_SERVICE_UUID    0
+#define CA_LE_TYPE_CUSTOM_UUID     1
 
 /* Service UUID */
 static const char OIC_GATT_SERVICE_UUID[] = CA_GATT_SERVICE_UUID;
+
+/* Manufacture Data */
 static const char OIC_GATT_CUSTOM_UUID[] = CA_GATT_CUSTOM_UUID;
 static const char OIC_GATT_CUSTOM_UUID2[] = CA_GATT_CUSTOM_UUID2;
 static const char OIC_GATT_CUSTOM_UUID3[] = CA_GATT_CUSTOM_UUID3;
index f0bf2b9..19b0bc7 100644 (file)
@@ -111,6 +111,13 @@ void CAManagerLEDisconnect();
 
 #if defined(__ANDROID__) && defined(LE_ADAPTER)
 /**
+ *  set UUID for setting scanfilter
+ *  @param[in]   uuid                 service UUID string or manufacture data.
+ *  @param[in]   uuid_type            Type of scanfilter to be set i.e. service UUID based or manufacture data based.
+ */
+void CASetScanUuid(char* uuid, int uuid_type);
+
+/**
  * initialize client connection manager
  * @param[in]   env                   JNI interface pointer.
  * @param[in]   jvm                   invocation inferface for JAVA virtual machine.
index 532ee70..a906685 100644 (file)
@@ -43,6 +43,12 @@ static JavaVM *g_jvm = NULL;
 static jobject g_context = NULL;
 static jobject g_connectedDeviceSet = NULL;
 
+void CASetScanUuid(char* uuid, int uuid_type)
+{
+    OIC_LOG(DEBUG, TAG, "CASetScanUuid");
+
+    CALEClientAddUuid(uuid, uuid_type);
+}
 
 CAResult_t CASetLEClientAutoConnectionDeviceInfo(const char* address)
 {
index 60d8384..5321cd4 100644 (file)
 #ifdef TCP_ADAPTER
 #include "catcpadapter.h"
 #endif
+
 #define TAG "OIC_CA_COMMON_UTILS"
 
+#if defined(__ANDROID__)
+
+void CASetLEScanUuid(char* uuid, int uuid_type)
+{
+       OIC_LOG(DEBUG, TAG, "CASetLEScanUuid");
+#ifdef LE_ADAPTER
+       CASetScanUuid(uuid, uuid_type);
+#else
+       OIC_LOG(DEBUG, TAG, "it is not supported");
+#endif
+       return;
+}
+
+#endif
+
 CAResult_t CARegisterNetworkMonitorHandler(CAAdapterStateChangedCB adapterStateCB, CAConnectionStateChangedCB connStateCB)
 {
        OIC_LOG(DEBUG, TAG, "CARegisterNetworkMonitorHandler");