#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);
}
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)
{
}
return;
}
+
jclass clsL = env->GetObjectClass(jListener);
if (!clsL)
{
+ env->DeleteLocalRef(jListener);
checkExAndRemoveListener(env);
if (JNI_EDETACHED == envRet)
{
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 (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();
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);
}
}