1 /* ****************************************************************
3 * Copyright 2016 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
21 #include "JniOnMQTopicFoundListener.h"
22 #include "JniOcResource.h"
23 #include "JniOcRepresentation.h"
26 JniOnMQTopicFoundListener::JniOnMQTopicFoundListener(JNIEnv *env, jobject jListener,
27 RemoveListenerCallback removeListener)
28 : m_removeListener(removeListener)
30 m_jwListener = env->NewWeakGlobalRef(jListener);
33 JniOnMQTopicFoundListener::~JniOnMQTopicFoundListener()
38 JNIEnv *env = GetJNIEnv(ret);
44 env->DeleteWeakGlobalRef(m_jwListener);
45 m_jwListener = nullptr;
47 if (JNI_EDETACHED == ret)
49 g_jvm->DetachCurrentThread();
54 void JniOnMQTopicFoundListener::foundTopicCallback(const int eCode, const std::string& uri,
55 std::shared_ptr<OC::OCResource> resource)
58 JNIEnv *env = GetJNIEnv(ret);
64 jobject jListener = env->NewLocalRef(m_jwListener);
67 checkExAndRemoveListener(env);
68 if (JNI_EDETACHED == ret)
70 g_jvm->DetachCurrentThread();
75 jclass clsL = env->GetObjectClass(jListener);
78 env->DeleteLocalRef(jListener);
79 checkExAndRemoveListener(env);
80 if (JNI_EDETACHED == ret)
82 g_jvm->DetachCurrentThread();
87 if (OC_STACK_OK != eCode)
89 jobject ex = GetOcException(eCode, "stack error");
94 jmethodID midL = env->GetMethodID(clsL, "onDiscoveryTopicFailed",
95 "(Ljava/lang/Throwable;Ljava/lang/String;)V");
101 env->CallVoidMethod(jListener, midL, ex, env->NewStringUTF(uri.c_str()));
106 jobject jResource = env->NewObject(g_cls_OcResource, g_mid_OcResource_ctor);
112 JniOcResource *jniOcResource = new JniOcResource(resource);
113 SetHandle<JniOcResource>(env, jResource, jniOcResource);
114 if (env->ExceptionCheck())
116 delete jniOcResource;
117 env->DeleteLocalRef(jResource);
121 jmethodID midL = env->GetMethodID(clsL, "onTopicDiscoveried", "(Lorg/iotivity/base/OcResource;)V");
124 delete jniOcResource;
125 env->DeleteLocalRef(jResource);
128 env->CallVoidMethod(jListener, midL, jResource);
129 if (env->ExceptionCheck())
131 LOGE("Java exception is thrown");
132 delete jniOcResource;
133 env->DeleteLocalRef(jResource);
138 env->DeleteLocalRef(clsL);
139 env->DeleteLocalRef(jListener);
140 if (JNI_EDETACHED == ret)
142 g_jvm->DetachCurrentThread();
147 env->DeleteLocalRef(clsL);
148 env->DeleteLocalRef(jListener);
149 checkExAndRemoveListener(env);
150 if (JNI_EDETACHED == ret)
152 g_jvm->DetachCurrentThread();
156 void JniOnMQTopicFoundListener::createdTopicCallback(const int eCode, const std::string& uri,
157 std::shared_ptr<OC::OCResource> resource)
159 jint envRet = JNI_ERR;
160 JNIEnv *env = GetJNIEnv(envRet);
166 jobject jListener = env->NewLocalRef(m_jwListener);
169 checkExAndRemoveListener(env);
170 if (JNI_EDETACHED == envRet)
172 g_jvm->DetachCurrentThread();
177 jclass clsL = env->GetObjectClass(jListener);
180 env->DeleteLocalRef(jListener);
181 checkExAndRemoveListener(env);
182 if (JNI_EDETACHED == envRet)
184 g_jvm->DetachCurrentThread();
189 if (OC_STACK_OK != eCode && OC_STACK_RESOURCE_CREATED != eCode &&
190 OC_STACK_RESOURCE_CHANGED != eCode)
192 jobject ex = GetOcException(eCode, "stack error");
197 jmethodID midL = env->GetMethodID(clsL, "onCreateTopicFailed",
198 "(Ljava/lang/Throwable;Ljava/lang/String;)V");
204 env->CallVoidMethod(jListener, midL, ex, env->NewStringUTF(uri.c_str()));
208 // create Resource object
209 jobject jResource = env->NewObject(g_cls_OcResource, g_mid_OcResource_ctor);
215 JniOcResource *jniOcResource = new JniOcResource(resource);
216 SetHandle<JniOcResource>(env, jResource, jniOcResource);
217 if (env->ExceptionCheck())
219 delete jniOcResource;
220 env->DeleteLocalRef(jResource);
224 jmethodID midL = env->GetMethodID(clsL, "onTopicResourceCreated",
225 "(Lorg/iotivity/base/OcResource;)V");
228 delete jniOcResource;
229 env->DeleteLocalRef(jResource);
233 env->CallVoidMethod(jListener, midL, jResource);
234 if (env->ExceptionCheck())
236 LOGE("Java exception is thrown");
237 env->DeleteLocalRef(jResource);
238 delete jniOcResource;
243 env->DeleteLocalRef(clsL);
244 env->DeleteLocalRef(jListener);
245 checkExAndRemoveListener(env);
246 if (JNI_EDETACHED == envRet)
248 g_jvm->DetachCurrentThread();
252 void JniOnMQTopicFoundListener::checkExAndRemoveListener(JNIEnv* env)
254 if (env->ExceptionCheck())
256 jthrowable ex = env->ExceptionOccurred();
257 env->ExceptionClear();
258 m_removeListener(env, m_jwListener);
259 env->Throw((jthrowable)ex);
263 m_removeListener(env, m_jwListener);