replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / bt_le_adapter / android / calenwmonitor.c
index 758243e..440fe3e 100644 (file)
 #include "caleinterface.h"
 #include "caadapterutils.h"
 
-#include "camutex.h"
+#include "octhread.h"
 
 #include "org_iotivity_ca_CaLeClientInterface.h"
 #include "org_iotivity_ca_CaLeServerInterface.h"
 
 #define TAG PCF("OIC_CA_LE_MONITOR")
 
+static const jint CONNECTION_FAILED_TO_BE_EASTABLISHED = 62;
+
 static JavaVM *g_jvm;
 
 /**
@@ -55,14 +57,14 @@ static CALEConnectionStateChangedCallback g_bleConnectionStateChangedCallback =
  * @brief Mutex to synchronize access to the deviceStateChanged Callback when the state
  *           of the LE adapter gets change.
  */
-static ca_mutex g_bleDeviceStateChangedCbMutex = NULL;
+static oc_mutex g_bleDeviceStateChangedCbMutex = NULL;
 
 /**
  * @var g_bleConnectionStateChangedCbMutex
  * @brief Mutex to synchronize access to the LE ConnectionStateChanged Callback when the state
  *           of the LE adapter gets change.
  */
-static ca_mutex g_bleConnectionStateChangedCbMutex = NULL;
+static oc_mutex g_bleConnectionStateChangedCbMutex = NULL;
 
 //getting context
 void CALENetworkMonitorJNISetContext()
@@ -83,11 +85,10 @@ void CALESetAdapterStateCallback(CALEDeviceStateChangedCallback callback)
     g_bleDeviceStateChangedCallback = callback;
 }
 
-CAResult_t CAInitializeLEAdapter(const ca_thread_pool_t threadPool)
+CAResult_t CAInitializeLEAdapter()
 {
-    OIC_LOG(DEBUG, TAG, "IN");
-    (void)threadPool;
-    OIC_LOG(DEBUG, TAG, "OUT");
+    // Nothing to do.
+
     return CA_STATUS_OK;
 }
 
@@ -107,49 +108,41 @@ CAResult_t CAStopLEAdapter()
 
 CAResult_t CAInitLENwkMonitorMutexVaraibles()
 {
-    OIC_LOG(DEBUG, TAG, "IN");
     if (NULL == g_bleDeviceStateChangedCbMutex)
     {
-        g_bleDeviceStateChangedCbMutex = ca_mutex_new();
+        g_bleDeviceStateChangedCbMutex = oc_mutex_new();
         if (NULL == g_bleDeviceStateChangedCbMutex)
         {
-            OIC_LOG(ERROR, TAG, "ca_mutex_new has failed");
+            OIC_LOG(ERROR, TAG, "oc_mutex_new has failed");
             return CA_STATUS_FAILED;
         }
     }
 
     if (NULL == g_bleConnectionStateChangedCbMutex)
     {
-       g_bleConnectionStateChangedCbMutex = ca_mutex_new();
+       g_bleConnectionStateChangedCbMutex = oc_mutex_new();
         if (NULL == g_bleConnectionStateChangedCbMutex)
         {
-            OIC_LOG(ERROR, TAG, "ca_mutex_new has failed");
-            ca_mutex_free(g_bleDeviceStateChangedCbMutex);
+            OIC_LOG(ERROR, TAG, "oc_mutex_new has failed");
+            oc_mutex_free(g_bleDeviceStateChangedCbMutex);
             return CA_STATUS_FAILED;
         }
     }
 
-    OIC_LOG(DEBUG, TAG, "OUT");
     return CA_STATUS_OK;
 }
 
 void CATerminateLENwkMonitorMutexVaraibles()
 {
-    OIC_LOG(DEBUG, TAG, "IN");
-
-    ca_mutex_free(g_bleDeviceStateChangedCbMutex);
+    oc_mutex_free(g_bleDeviceStateChangedCbMutex);
     g_bleDeviceStateChangedCbMutex = NULL;
 
-    ca_mutex_free(g_bleConnectionStateChangedCbMutex);
+    oc_mutex_free(g_bleConnectionStateChangedCbMutex);
     g_bleConnectionStateChangedCbMutex = NULL;
-
-    OIC_LOG(DEBUG, TAG, "OUT");
 }
 
 CAResult_t CAGetLEAdapterState()
 {
-    OIC_LOG(DEBUG, TAG, "IN");
-
     if (!g_jvm)
     {
         OIC_LOG(ERROR, TAG, "g_jvm is null");
@@ -157,7 +150,7 @@ CAResult_t CAGetLEAdapterState()
     }
 
     bool isAttached = false;
-    JNIEnv* env;
+    JNIEnv* env = NULL;
     jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
     if (JNI_OK != res)
     {
@@ -187,14 +180,11 @@ CAResult_t CAGetLEAdapterState()
         (*g_jvm)->DetachCurrentThread(g_jvm);
     }
 
-    OIC_LOG(DEBUG, TAG, "OUT");
     return CA_STATUS_OK;
 }
 
 CAResult_t CAInitializeLENetworkMonitor()
 {
-    OIC_LOG(DEBUG, TAG, "IN");
-
     CAResult_t res = CAInitLENwkMonitorMutexVaraibles();
     if (CA_STATUS_OK != res)
     {
@@ -205,32 +195,24 @@ CAResult_t CAInitializeLENetworkMonitor()
     CALENetworkMonitorJNISetContext();
     CALENetworkMonitorJniInit();
 
-    OIC_LOG(DEBUG, TAG, "OUT");
-
     return CA_STATUS_OK;
-
 }
 
 void CATerminateLENetworkMonitor()
 {
-    OIC_LOG(DEBUG, TAG, "IN");
+    OIC_LOG(DEBUG, TAG, "CATerminateLENetworkMonitor");
 
     CATerminateLENwkMonitorMutexVaraibles();
-
-    OIC_LOG(DEBUG, TAG, "OUT");
 }
 
 CAResult_t CASetLEAdapterStateChangedCb(CALEDeviceStateChangedCallback callback)
 {
-    OIC_LOG(DEBUG, TAG, "IN");
-
     OIC_LOG(DEBUG, TAG, "Setting CALEDeviceStateChangedCallback");
 
-    ca_mutex_lock(g_bleDeviceStateChangedCbMutex);
+    oc_mutex_lock(g_bleDeviceStateChangedCbMutex);
     CALESetAdapterStateCallback(callback);
-    ca_mutex_unlock(g_bleDeviceStateChangedCbMutex);
+    oc_mutex_unlock(g_bleDeviceStateChangedCbMutex);
 
-    OIC_LOG(DEBUG, TAG, "OUT");
     return CA_STATUS_OK;
 }
 
@@ -242,21 +224,47 @@ CAResult_t CAUnSetLEAdapterStateChangedCb()
 
 CAResult_t CASetLENWConnectionStateChangedCb(CALEConnectionStateChangedCallback callback)
 {
-    OIC_LOG(DEBUG, TAG, "IN");
-    ca_mutex_lock(g_bleConnectionStateChangedCbMutex);
+    OIC_LOG(DEBUG, TAG, "CASetLENWConnectionStateChangedCb");
+    oc_mutex_lock(g_bleConnectionStateChangedCbMutex);
     g_bleConnectionStateChangedCallback = callback;
-    ca_mutex_unlock(g_bleConnectionStateChangedCbMutex);
-    OIC_LOG(DEBUG, TAG, "OUT");
+    oc_mutex_unlock(g_bleConnectionStateChangedCbMutex);
     return CA_STATUS_OK;
 }
 
-CAResult_t CAUnsetLENWConnectionStateChangedCb()
+CAResult_t CAUnSetLENWConnectionStateChangedCb()
 {
-    OIC_LOG(DEBUG, TAG, "IN");
-    ca_mutex_lock(g_bleConnectionStateChangedCbMutex);
+    OIC_LOG(DEBUG, TAG, "CAUnSetLENWConnectionStateChangedCb");
+    oc_mutex_lock(g_bleConnectionStateChangedCbMutex);
     g_bleConnectionStateChangedCallback = NULL;
-    ca_mutex_unlock(g_bleConnectionStateChangedCbMutex);
-    OIC_LOG(DEBUG, TAG, "OUT");
+    oc_mutex_unlock(g_bleConnectionStateChangedCbMutex);
+    return CA_STATUS_OK;
+}
+
+static CAResult_t CALEStateConnectedCallback(JNIEnv *env, jstring jni_address,
+                                             jboolean isDescriptorFound)
+{
+    VERIFY_NON_NULL(env, TAG, "env");
+    VERIFY_NON_NULL(jni_address, TAG, "jni_address");
+
+    if (CALEClientGetFlagFromState(env, jni_address, CA_LE_DESCRIPTOR_FOUND) == isDescriptorFound)
+    {
+        if (g_bleConnectionStateChangedCallback)
+        {
+            const char* address = (*env)->GetStringUTFChars(env, jni_address, NULL);
+            if (!address)
+            {
+                OIC_LOG(ERROR, TAG, "address is null");
+                CACheckJNIException(env);
+                return CA_STATUS_FAILED;
+            }
+
+            g_bleConnectionStateChangedCallback(CA_ADAPTER_GATT_BTLE, address, true);
+            OIC_LOG(DEBUG, TAG, "BLE is connected");
+
+            (*env)->ReleaseStringUTFChars(env, jni_address, address);
+        }
+    }
+
     return CA_STATUS_OK;
 }
 
@@ -267,7 +275,7 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeStateChangedCallback(JNIEnv *env, j
     VERIFY_NON_NULL_VOID(env, TAG, "env is null");
     VERIFY_NON_NULL_VOID(obj, TAG, "obj is null");
 
-    OIC_LOG_V(DEBUG, TAG, "CaLeClientInterface - Network State Changed : status(%d)", status);
+    OIC_LOG_V(INFO, TAG, "CaLeClientInterface - Network State Changed : status(%d)", status);
 
     if (!g_bleDeviceStateChangedCallback)
     {
@@ -283,7 +291,11 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeStateChangedCallback(JNIEnv *env, j
     {
         CANetworkStatus_t newStatus = CA_INTERFACE_UP;
         CALEClientCreateDeviceList();
-        CALEServerCreateCachedDeviceList();
+
+        if (!(caglobals.bleFlags & CA_LE_SERVER_DISABLE))
+        {
+            CALEServerCreateCachedDeviceList();
+        }
 
         g_bleDeviceStateChangedCallback(newStatus);
     }
@@ -315,8 +327,6 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeStateChangedCallback(JNIEnv *env, j
             OIC_LOG(ERROR, TAG, "CALEServerRemoveAllDevices has failed");
         }
 
-        CALEClientSetScanFlag(false);
-
         CANetworkStatus_t newStatus = CA_INTERFACE_DOWN;
         g_bleDeviceStateChangedCallback(newStatus);
     }
@@ -366,18 +376,17 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeGattNWConnectionStateChangeCallback
                                                                                  jobject obj,
                                                                                  jobject gatt,
                                                                                  jint status,
-                                                                                 jint newstate)
+                                                                                 jint newState)
 {
-    VERIFY_NON_NULL_VOID(env, TAG, "env is null");
-    VERIFY_NON_NULL_VOID(obj, TAG, "obj is null");
-    VERIFY_NON_NULL_VOID(gatt, TAG, "gatt is null");
-
-    OIC_LOG_V(DEBUG, TAG, "CALeGattNWConnectionStateChangeCallback - status %d, newstate %d",
-              status, newstate);
+    OIC_LOG_V(INFO, TAG, "CALeGattNWConnectionStateChangeCallback - status %d, newstate %d",
+              status, newState);
+    VERIFY_NON_NULL_VOID(env, TAG, "env");
+    VERIFY_NON_NULL_VOID(obj, TAG, "obj");
+    VERIFY_NON_NULL_VOID(gatt, TAG, "gatt");
 
     jint state_disconnected = CALEGetConstantsValue(env, CLASSPATH_BT_PROFILE,
                                                     "STATE_DISCONNECTED");
-    if (state_disconnected == newstate)
+    if (state_disconnected == newState)
     {
         jstring jni_address = CALEClientGetAddressFromGattObj(env, gatt);
         if (!jni_address)
@@ -390,12 +399,17 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeGattNWConnectionStateChangeCallback
         if (!address)
         {
             OIC_LOG(ERROR, TAG, "address is null");
+            CACheckJNIException(env);
             return;
         }
 
-        if (g_bleConnectionStateChangedCallback)
+        if (CONNECTION_FAILED_TO_BE_EASTABLISHED != status)
         {
-            g_bleConnectionStateChangedCallback(CA_ADAPTER_GATT_BTLE, address, false);
+            if (g_bleConnectionStateChangedCallback)
+            {
+                OIC_LOG_V(DEBUG, TAG, "LE Disconnected state is %s", address);
+                g_bleConnectionStateChangedCallback(CA_ADAPTER_GATT_BTLE, address, false);
+            }
         }
 
         (*env)->ReleaseStringUTFChars(env, jni_address, address);
@@ -406,37 +420,113 @@ JNIEXPORT void JNICALL
 Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerNWConnectionStateChangeCallback(
         JNIEnv *env, jobject obj, jobject device, jint status, jint newState)
 {
-    OIC_LOG(DEBUG, TAG, " Gatt Server NWConnectionStateChange Callback");
-
+    OIC_LOG_V(DEBUG, TAG, "caLeGattServerNWConnectionStateChangeCallback - status %d, newstate %d",
+              status, newState);
     VERIFY_NON_NULL_VOID(env, TAG, "env");
     VERIFY_NON_NULL_VOID(obj, TAG, "obj");
     VERIFY_NON_NULL_VOID(device, TAG, "device");
-    (void)status;
 
-    // STATE_DISCONNECTED
-    jint state_disconnected = CALEGetConstantsValue(env, CLASSPATH_BT_PROFILE,
-                                                    "STATE_DISCONNECTED");
-    if (state_disconnected == newState)
+    if (CONNECTION_FAILED_TO_BE_EASTABLISHED != status)
     {
-        jstring jni_remoteAddress = CALEGetAddressFromBTDevice(env, device);
-        if (!jni_remoteAddress)
+        if (g_bleConnectionStateChangedCallback)
         {
-            OIC_LOG(ERROR, TAG, "jni_remoteAddress is null");
+            jstring jni_remoteAddress = CALEGetAddressFromBTDevice(env, device);
+            if (!jni_remoteAddress)
+            {
+                OIC_LOG(ERROR, TAG, "jni_remoteAddress is null");
+                return;
+            }
+
+            const char* address = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
+            if (!address)
+            {
+                OIC_LOG(ERROR, TAG, "address is null");
+                CACheckJNIException(env);
+                return;
+            }
+
+            // STATE_DISCONNECTED
+            jint state_disconnected = CALEGetConstantsValue(env, CLASSPATH_BT_PROFILE,
+                                                            "STATE_DISCONNECTED");
+
+            // STATE_CONNECTED
+            jint state_connected = CALEGetConstantsValue(env, CLASSPATH_BT_PROFILE,
+                                                         "STATE_CONNECTED");
+
+            if (state_disconnected == newState)
+            {
+                OIC_LOG_V(DEBUG, TAG, "LE Disconnected state is %d, %s", newState, address);
+                g_bleConnectionStateChangedCallback(CA_ADAPTER_GATT_BTLE, address, false);
+            }
+            else if (state_connected == newState)
+            {
+                OIC_LOG_V(DEBUG, TAG, "LE Connected state is %d, %s", newState, address);
+                g_bleConnectionStateChangedCallback(CA_ADAPTER_GATT_BTLE, address, true);
+            }
+            else
+            {
+                OIC_LOG_V(DEBUG, TAG, "Unknown state : %d, %s", newState, address);
+            }
+
+            (*env)->ReleaseStringUTFChars(env, jni_remoteAddress, address);
+        }
+    }
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaLeClientInterface_caLeGattNWServicesDiscoveredCallback(JNIEnv *env,
+                                                                              jobject obj,
+                                                                              jobject gatt,
+                                                                              jint status)
+{
+    OIC_LOG_V(INFO, TAG, "caLeGattNWServicesDiscoveredCallback - status %d", status);
+    VERIFY_NON_NULL_VOID(env, TAG, "env");
+    VERIFY_NON_NULL_VOID(obj, TAG, "obj");
+    VERIFY_NON_NULL_VOID(gatt, TAG, "gatt");
+
+    if (GATT_SUCCESS == status)
+    {
+        jstring jni_address = CALEGetAddressFromGatt(env, gatt);
+        if (!jni_address)
+        {
+            OIC_LOG(ERROR, TAG, "jni_address is null");
             return;
         }
 
-        const char* address = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
-        if (!address)
+        if (CA_STATUS_OK != CALEStateConnectedCallback(env, jni_address, JNI_FALSE))
         {
-            OIC_LOG(ERROR, TAG, "address is null");
+            OIC_LOG(ERROR, TAG, "CALEStateConnectedCallback has failed");
+        }
+
+        (*env)->DeleteLocalRef(env, jni_address);
+    }
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaLeClientInterface_caLeGattNWDescriptorWriteCallback(JNIEnv *env,
+                                                                           jobject obj,
+                                                                           jobject gatt,
+                                                                           jint status)
+{
+    OIC_LOG_V(INFO, TAG, "caLeGattNWDescriptorWriteCallback - status %d", status);
+    VERIFY_NON_NULL_VOID(env, TAG, "env");
+    VERIFY_NON_NULL_VOID(obj, TAG, "obj");
+    VERIFY_NON_NULL_VOID(gatt, TAG, "gatt");
+
+    if (GATT_SUCCESS == status)
+    {
+        jstring jni_address = CALEGetAddressFromGatt(env, gatt);
+        if (!jni_address)
+        {
+            OIC_LOG(ERROR, TAG, "jni_address is null");
             return;
         }
 
-        if (g_bleConnectionStateChangedCallback)
+        if (CA_STATUS_OK != CALEStateConnectedCallback(env, jni_address, JNI_TRUE))
         {
-            g_bleConnectionStateChangedCallback(CA_ADAPTER_GATT_BTLE, address, false);
+            OIC_LOG(ERROR, TAG, "CALEStateConnectedCallback has failed");
         }
 
-        (*env)->ReleaseStringUTFChars(env, jni_remoteAddress, address);
+        (*env)->DeleteLocalRef(env, jni_address);
     }
 }