Clean compilar warnings
[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 = JNI_ERR;
38         JNIEnv *env = GetJNIEnv(ret);
39         if (nullptr == env)
40         {
41             return;
42         }
43         env->DeleteWeakGlobalRef(m_jwListener);
44         m_jwListener = nullptr;
45         if (JNI_EDETACHED == ret)
46         {
47             g_jvm->DetachCurrentThread();
48         }
49     }
50 }
51
52 void JniOnResourceFoundListener::foundResourceCallback(std::shared_ptr<OC::OCResource> resource)
53 {
54     jint ret = JNI_ERR;
55     JNIEnv *env = GetJNIEnv(ret);
56     if (nullptr == env)
57     {
58         return;
59     }
60
61     jobject jListener = env->NewLocalRef(m_jwListener);
62     if (!jListener)
63     {
64         checkExAndRemoveListener(env);
65         if (JNI_EDETACHED == ret)
66         {
67             g_jvm->DetachCurrentThread();
68         }
69     }
70
71     jobject jResource = env->NewObject(g_cls_OcResource, g_mid_OcResource_ctor);
72     if (!jResource)
73     {
74         checkExAndRemoveListener(env);
75         if (JNI_EDETACHED == ret)
76         {
77             g_jvm->DetachCurrentThread();
78         }
79     }
80
81     JniOcResource *jniOcResource = new JniOcResource(resource);
82     SetHandle<JniOcResource>(env, jResource, jniOcResource);
83     if (env->ExceptionCheck())
84     {
85         delete jniOcResource;
86         checkExAndRemoveListener(env);
87         if (JNI_EDETACHED == ret)
88         {
89             g_jvm->DetachCurrentThread();
90         }
91     }
92     jclass clsL = env->GetObjectClass(jListener);
93     if (!clsL)
94     {
95         delete jniOcResource;
96         checkExAndRemoveListener(env);
97         if (JNI_EDETACHED == ret)
98         {
99             g_jvm->DetachCurrentThread();
100         }
101     }
102     jmethodID midL = env->GetMethodID(clsL, "onResourceFound", "(Lorg/iotivity/base/OcResource;)V");
103     if (!midL)
104     {
105         delete jniOcResource;
106         checkExAndRemoveListener(env);
107         if (JNI_EDETACHED == ret)
108         {
109             g_jvm->DetachCurrentThread();
110         }
111     }
112     env->CallVoidMethod(jListener, midL, jResource);
113     if (env->ExceptionCheck())
114     {
115         LOGE("Java exception is thrown");
116         delete jniOcResource;
117         checkExAndRemoveListener(env);
118         if (JNI_EDETACHED == ret)
119         {
120             g_jvm->DetachCurrentThread();
121         }
122     }
123
124     if (JNI_EDETACHED == ret)
125     {
126         g_jvm->DetachCurrentThread();
127     }
128 }
129
130 void JniOnResourceFoundListener::findResourceErrorCallback(const std::string& uri, const int eCode)
131 {
132     LOGI("findResource error callback value : %d", eCode);
133     jint ret;
134     JNIEnv *env = GetJNIEnv(ret);
135     if (nullptr == env)
136     {
137         return;
138     }
139
140     jobject jListener = env->NewLocalRef(m_jwListener);
141     if (!jListener)
142     {
143         checkExAndRemoveListener(env);
144         if (JNI_EDETACHED == ret)
145         {
146             g_jvm->DetachCurrentThread();
147         }
148         return;
149     }
150
151     jclass clsL = env->GetObjectClass(jListener);
152     if (!clsL)
153     {
154         checkExAndRemoveListener(env);
155         if (JNI_EDETACHED == ret)
156         {
157             g_jvm->DetachCurrentThread();
158         }
159         return;
160     }
161
162     jobject ex = GetOcException(eCode, "stack error in onFindResourceErrorCallback");
163     if (!ex)
164     {
165         checkExAndRemoveListener(env);
166         if (JNI_EDETACHED == ret)
167         {
168             g_jvm->DetachCurrentThread();
169         }
170         return;
171     }
172
173
174     jmethodID midL = env->GetMethodID(clsL, "onFindResourceFailed",
175                                       "(Ljava/lang/Throwable;Ljava/lang/String;)V");
176     if (!midL)
177     {
178         checkExAndRemoveListener(env);
179         if (JNI_EDETACHED == ret)
180         {
181             g_jvm->DetachCurrentThread();
182         }
183         return;
184     }
185     env->CallVoidMethod(jListener, midL, ex, env->NewStringUTF(uri.c_str()));
186
187     checkExAndRemoveListener(env);
188     if (JNI_EDETACHED == ret)
189     {
190         g_jvm->DetachCurrentThread();
191     }
192 }
193
194 void JniOnResourceFoundListener::checkExAndRemoveListener(JNIEnv* env)
195 {
196     if (env->ExceptionCheck())
197     {
198         jthrowable ex = env->ExceptionOccurred();
199         env->ExceptionClear();
200         m_removeListenerCallback(env, m_jwListener);
201         env->Throw((jthrowable)ex);
202     }
203     else
204     {
205         m_removeListenerCallback(env, m_jwListener);
206     }
207 }