2 * //******************************************************************
4 * // Copyright 2015 Intel Corporation.
6 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
8 * // Licensed under the Apache License, Version 2.0 (the "License");
9 * // you may not use this file except in compliance with the License.
10 * // You may obtain a copy of the License at
12 * // http://www.apache.org/licenses/LICENSE-2.0
14 * // Unless required by applicable law or agreed to in writing, software
15 * // distributed under the License is distributed on an "AS IS" BASIS,
16 * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * // See the License for the specific language governing permissions and
18 * // limitations under the License.
20 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
22 #include "JniOnPostListener.h"
23 #include "JniOcResource.h"
24 #include "JniOcRepresentation.h"
27 #include "JniOcAccountManager.h"
30 JniOnPostListener::JniOnPostListener(JNIEnv *env, jobject jListener, JniOcResource* owner)
31 : m_ownerResource(owner)
33 m_jwListener = env->NewWeakGlobalRef(jListener);
37 JniOnPostListener::JniOnPostListener(JNIEnv *env, jobject jListener, JniOcAccountManager* owner)
38 : m_ownerAccountManager(owner)
40 m_jwListener = env->NewWeakGlobalRef(jListener);
44 JniOnPostListener::~JniOnPostListener()
49 JNIEnv *env = GetJNIEnv(ret);
55 env->DeleteWeakGlobalRef(m_jwListener);
56 m_jwListener = nullptr;
58 if (JNI_EDETACHED == ret)
60 g_jvm->DetachCurrentThread();
65 void JniOnPostListener::onPostCallback(const HeaderOptions& headerOptions,
66 const OCRepresentation& ocRepresentation, const int eCode)
68 jint envRet = JNI_ERR;
69 JNIEnv *env = GetJNIEnv(envRet);
75 jobject jListener = env->NewLocalRef(m_jwListener);
78 checkExAndRemoveListener(env);
79 if (JNI_EDETACHED == envRet)
81 g_jvm->DetachCurrentThread();
85 jclass clsL = env->GetObjectClass(jListener);
88 checkExAndRemoveListener(env);
89 if (JNI_EDETACHED == envRet)
91 g_jvm->DetachCurrentThread();
96 if (OC_STACK_OK != eCode && OC_STACK_RESOURCE_CREATED != eCode &&
97 OC_STACK_RESOURCE_CHANGED != eCode)
99 jobject ex = GetOcException(eCode, "stack error in onPostCallback");
102 checkExAndRemoveListener(env);
103 if (JNI_EDETACHED == envRet)
105 g_jvm->DetachCurrentThread();
109 jmethodID midL = env->GetMethodID(clsL, "onPostFailed", "(Ljava/lang/Throwable;)V");
112 checkExAndRemoveListener(env);
113 if (JNI_EDETACHED == envRet)
115 g_jvm->DetachCurrentThread();
119 env->CallVoidMethod(jListener, midL, ex);
123 jobject jHeaderOptionList = JniUtils::convertHeaderOptionsVectorToJavaList(env, headerOptions);
124 if (!jHeaderOptionList)
126 checkExAndRemoveListener(env);
127 if (JNI_EDETACHED == envRet)
129 g_jvm->DetachCurrentThread();
134 OCRepresentation * rep = new OCRepresentation(ocRepresentation);
135 jlong handle = reinterpret_cast<jlong>(rep);
136 jobject jRepresentation = env->NewObject(g_cls_OcRepresentation, g_mid_OcRepresentation_N_ctor_bool,
138 if (!jRepresentation)
141 checkExAndRemoveListener(env);
142 if (JNI_EDETACHED == envRet)
144 g_jvm->DetachCurrentThread();
149 jmethodID midL = env->GetMethodID(clsL, "onPostCompleted",
150 "(Ljava/util/List;Lorg/iotivity/base/OcRepresentation;)V");
153 checkExAndRemoveListener(env);
154 if (JNI_EDETACHED == envRet)
156 g_jvm->DetachCurrentThread();
161 env->CallVoidMethod(jListener, midL, jHeaderOptionList, jRepresentation);
162 if (env->ExceptionCheck())
164 LOGE("Java exception is thrown");
169 checkExAndRemoveListener(env);
170 if (JNI_EDETACHED == envRet)
172 g_jvm->DetachCurrentThread();
176 void JniOnPostListener::checkExAndRemoveListener(JNIEnv* env)
178 if (env->ExceptionCheck())
180 jthrowable ex = env->ExceptionOccurred();
181 env->ExceptionClear();
183 m_ownerResource->removeOnPostListener(env, m_jwListener);
187 m_ownerResource->removeOnPostListener(env, m_jwListener);
189 if (m_ownerAccountManager)
191 m_ownerAccountManager->removeOnPostListener(env, m_jwListener);
194 env->Throw((jthrowable)ex);
199 m_ownerResource->removeOnPostListener(env, m_jwListener);
203 m_ownerResource->removeOnPostListener(env, m_jwListener);
205 if (m_ownerAccountManager)
207 m_ownerAccountManager->removeOnPostListener(env, m_jwListener);