Imported Upstream version 1.0.0
[platform/upstream/iotivity.git] / android / android_api / base / jni / JniOnResourceFoundListener.cpp
1 /*
2 * //******************************************************************
3 * //
4 * // Copyright 2015 Intel Corporation.
5 * //
6 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 * //
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
11 * //
12 * //      http://www.apache.org/licenses/LICENSE-2.0
13 * //
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.
19 * //
20 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 */
22 #include "JniOnResourceFoundListener.h"
23 #include "JniOcResource.h"
24
25 JniOnResourceFoundListener::JniOnResourceFoundListener(JNIEnv *env, jobject jListener,
26     RemoveListenerCallback removeListenerCallback)
27 {
28     m_jwListener = env->NewWeakGlobalRef(jListener);
29     m_removeListenerCallback = removeListenerCallback;
30 }
31
32 JniOnResourceFoundListener::~JniOnResourceFoundListener()
33 {
34     LOGI("~JniOnResourceFoundListener()");
35     if (m_jwListener)
36     {
37         jint ret;
38         JNIEnv *env = GetJNIEnv(ret);
39         if (nullptr == env) return;
40         env->DeleteWeakGlobalRef(m_jwListener);
41         m_jwListener = nullptr;
42         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
43     }
44 }
45
46 void JniOnResourceFoundListener::foundResourceCallback(std::shared_ptr<OC::OCResource> resource)
47 {
48     jint ret;
49     JNIEnv *env = GetJNIEnv(ret);
50     if (nullptr == env) return;
51
52     jobject jListener = env->NewLocalRef(m_jwListener);
53     if (!jListener)
54     {
55         checkExAndRemoveListener(env);
56         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
57         return;
58     }
59
60     jobject jResource = env->NewObject(g_cls_OcResource, g_mid_OcResource_ctor);
61     if (!jResource)
62     {
63         checkExAndRemoveListener(env);
64         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
65         return;
66     }
67
68     JniOcResource *jniOcResource = new JniOcResource(resource);
69     SetHandle<JniOcResource>(env, jResource, jniOcResource);
70     if (env->ExceptionCheck())
71     {
72         delete jniOcResource;
73         checkExAndRemoveListener(env);
74         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
75         return;
76     }
77     jclass clsL = env->GetObjectClass(jListener);
78     if (!clsL)
79     {
80         delete jniOcResource;
81         checkExAndRemoveListener(env);
82         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
83         return;
84     }
85     jmethodID midL = env->GetMethodID(clsL, "onResourceFound", "(Lorg/iotivity/base/OcResource;)V");
86     if (!midL)
87     {
88         delete jniOcResource;
89         checkExAndRemoveListener(env);
90         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
91         return;
92     }
93     env->CallVoidMethod(jListener, midL, jResource);
94     if (env->ExceptionCheck())
95     {
96         LOGE("Java exception is thrown");
97         delete jniOcResource;
98         checkExAndRemoveListener(env);
99         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
100         return;
101     }
102
103     if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
104 }
105
106 void JniOnResourceFoundListener::checkExAndRemoveListener(JNIEnv* env)
107 {
108     if (env->ExceptionCheck())
109     {
110         jthrowable ex = env->ExceptionOccurred();
111         env->ExceptionClear();
112         m_removeListenerCallback(env, m_jwListener);
113         env->Throw((jthrowable)ex);
114     }
115     else
116     {
117         m_removeListenerCallback(env, m_jwListener);
118     }
119 }