Merge tizen_5.0 codes into tizen_4.0
[platform/upstream/iotivity.git] / android / android_api / base / jni / JniOnObserveListener.cpp
index c1e4a2e..ce27374 100644 (file)
 #include "JniOcRepresentation.h"
 #include "JniUtils.h"
 
-JniOnObserveListener::JniOnObserveListener(JNIEnv *env, jobject jListener, JniOcResource* owner)
-    : m_ownerResource(owner)
+#define CA_OBSERVE_MAX_SEQUENCE_NUMBER 0xFFFFFF
+
+JniOnObserveListener::JniOnObserveListener(JNIEnv *env, jobject jListener, RemoveListenerCallback removeListener)
+    : m_removeListener(removeListener)
 {
     m_jwListener = env->NewWeakGlobalRef(jListener);
 }
@@ -61,6 +63,16 @@ void JniOnObserveListener::onObserveCallback(const HeaderOptions headerOptions,
         return;
     }
 
+    if (nullptr == m_jwListener)
+    {
+        LOGE("listener is not available");
+        if (JNI_EDETACHED == envRet)
+        {
+            g_jvm->DetachCurrentThread();
+        }
+        return;
+    }
+
     jobject jListener = env->NewLocalRef(m_jwListener);
     if (!jListener)
     {
@@ -71,9 +83,11 @@ void JniOnObserveListener::onObserveCallback(const HeaderOptions headerOptions,
         }
         return;
     }
+
     jclass clsL = env->GetObjectClass(jListener);
     if (!clsL)
     {
+        env->DeleteLocalRef(jListener);
         checkExAndRemoveListener(env);
         if (JNI_EDETACHED == envRet)
         {
@@ -88,22 +102,14 @@ void JniOnObserveListener::onObserveCallback(const HeaderOptions headerOptions,
         jobject ex = GetOcException(eCode, "stack error in onObserveCallback");
         if (!ex)
         {
-            checkExAndRemoveListener(env);
-            if (JNI_EDETACHED == envRet)
-            {
-                g_jvm->DetachCurrentThread();
-            }
-            return;
+            goto JNI_EXIT;
         }
+
         jmethodID midL = env->GetMethodID(clsL, "onObserveFailed", "(Ljava/lang/Throwable;)V");
         if (!midL)
         {
-            checkExAndRemoveListener(env);
-            if (JNI_EDETACHED == envRet)
-            {
-                g_jvm->DetachCurrentThread();
-            }
-            return;
+            env->DeleteLocalRef(ex);
+            goto JNI_EXIT;
         }
         env->CallVoidMethod(jListener, midL, ex);
     }
@@ -112,12 +118,7 @@ void JniOnObserveListener::onObserveCallback(const HeaderOptions headerOptions,
         jobject jHeaderOptionList = JniUtils::convertHeaderOptionsVectorToJavaList(env, headerOptions);
         if (!jHeaderOptionList)
         {
-            checkExAndRemoveListener(env);
-            if (JNI_EDETACHED == envRet)
-            {
-                g_jvm->DetachCurrentThread();
-            }
-            return;
+            goto JNI_EXIT;
         }
 
         OCRepresentation * rep = new OCRepresentation(ocRepresentation);
@@ -127,24 +128,17 @@ void JniOnObserveListener::onObserveCallback(const HeaderOptions headerOptions,
         if (!jRepresentation)
         {
             delete rep;
-            checkExAndRemoveListener(env);
-            if (JNI_EDETACHED == envRet)
-            {
-                g_jvm->DetachCurrentThread();
-            }
-            return;
+            env->DeleteLocalRef(jHeaderOptionList);
+            goto JNI_EXIT;
         }
 
         jmethodID midL = env->GetMethodID(clsL, "onObserveCompleted",
             "(Ljava/util/List;Lorg/iotivity/base/OcRepresentation;I)V");
         if (!midL)
         {
-            checkExAndRemoveListener(env);
-            if (JNI_EDETACHED == envRet)
-            {
-                g_jvm->DetachCurrentThread();
-            }
-            return;
+            env->DeleteLocalRef(jRepresentation);
+            env->DeleteLocalRef(jHeaderOptionList);
+            goto JNI_EXIT;
         }
 
         env->CallVoidMethod(jListener, midL, jHeaderOptionList, jRepresentation,
@@ -153,18 +147,33 @@ void JniOnObserveListener::onObserveCallback(const HeaderOptions headerOptions,
         {
             LOGE("Java exception is thrown");
             delete rep;
+            env->DeleteLocalRef(jRepresentation);
+            env->DeleteLocalRef(jHeaderOptionList);
             jthrowable ex = env->ExceptionOccurred();
             env->ExceptionClear();
-            m_ownerResource->removeOnObserveListener(env, m_jwListener);
+            m_removeListener(env, m_jwListener);
             env->Throw((jthrowable)ex);
         }
 
-        if (OC_OBSERVE_DEREGISTER == sequenceNumber)
+        if (CA_OBSERVE_MAX_SEQUENCE_NUMBER + 1 == sequenceNumber)
         {
-            checkExAndRemoveListener(env);
+            LOGI("Observe De-registration action is successful");
+            goto JNI_EXIT;
         }
     }
 
+    env->DeleteLocalRef(clsL);
+    env->DeleteLocalRef(jListener);
+    if (JNI_EDETACHED == envRet)
+    {
+        g_jvm->DetachCurrentThread();
+    }
+    return;
+
+JNI_EXIT:
+    env->DeleteLocalRef(clsL);
+    env->DeleteLocalRef(jListener);
+    checkExAndRemoveListener(env);
     if (JNI_EDETACHED == envRet)
     {
         g_jvm->DetachCurrentThread();
@@ -173,15 +182,21 @@ void JniOnObserveListener::onObserveCallback(const HeaderOptions headerOptions,
 
 void JniOnObserveListener::checkExAndRemoveListener(JNIEnv* env)
 {
+    LOGI("checkExAndRemoveListener");
     if (env->ExceptionCheck())
     {
         jthrowable ex = env->ExceptionOccurred();
         env->ExceptionClear();
-        m_ownerResource->removeOnObserveListener(env, m_jwListener);
+        m_removeListener(env, m_jwListener);
         env->Throw((jthrowable)ex);
     }
     else
     {
-        m_ownerResource->removeOnObserveListener(env, m_jwListener);
+        m_removeListener(env, m_jwListener);
     }
 }
+
+jweak JniOnObserveListener::getJWListener()
+{
+    return this->m_jwListener;
+}