#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);
}
{
if (m_jwListener)
{
- jint ret;
+ jint ret = JNI_ERR;
JNIEnv *env = GetJNIEnv(ret);
- if (NULL == env) return;
+ if (nullptr == env)
+ {
+ return;
+ }
env->DeleteWeakGlobalRef(m_jwListener);
m_jwListener = nullptr;
- if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
+ if (JNI_EDETACHED == ret)
+ {
+ g_jvm->DetachCurrentThread();
+ }
}
}
void JniOnObserveListener::onObserveCallback(const HeaderOptions headerOptions,
const OCRepresentation& ocRepresentation, const int& eCode, const int& sequenceNumber)
{
- jint envRet;
+ jint envRet = JNI_ERR;
JNIEnv *env = GetJNIEnv(envRet);
- if (NULL == env) return;
+ if (nullptr == env)
+ {
+ 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)
{
checkExAndRemoveListener(env);
- if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
+ if (JNI_EDETACHED == envRet)
+ {
+ g_jvm->DetachCurrentThread();
+ }
return;
}
+
jclass clsL = env->GetObjectClass(jListener);
if (!clsL)
{
+ env->DeleteLocalRef(jListener);
checkExAndRemoveListener(env);
- if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
+ if (JNI_EDETACHED == envRet)
+ {
+ g_jvm->DetachCurrentThread();
+ }
return;
}
- if (OC_STACK_OK != eCode && OC_STACK_RESOURCE_CREATED != eCode && OC_STACK_RESOURCE_DELETED != eCode)
+ if (OC_STACK_OK != eCode && OC_STACK_RESOURCE_CREATED != eCode &&
+ OC_STACK_RESOURCE_DELETED != eCode && OC_STACK_RESOURCE_CHANGED != eCode)
{
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);
}
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);
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,
{
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 (CA_OBSERVE_MAX_SEQUENCE_NUMBER + 1 == sequenceNumber)
+ {
+ LOGI("Observe De-registration action is successful");
+ goto JNI_EXIT;
+ }
}
- if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
+ 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();
+ }
}
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);
}
-}
\ No newline at end of file
+}
+
+jweak JniOnObserveListener::getJWListener()
+{
+ return this->m_jwListener;
+}