Merge "Merge remote-tracking branch 'origin/master' into notification-service" into...
[platform/upstream/iotivity.git] / android / android_api / base / jni / JniOnDeleteResourceListener.cpp
1 /* ****************************************************************
2  *
3  * Copyright 2016 Samsung Electronics All Rights Reserved.
4  *
5  *
6  *
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  ******************************************************************/
20 #include "JniOnDeleteResourceListener.h"
21
22 JniOnDeleteResourceListener::JniOnDeleteResourceListener(JNIEnv *env, jobject jListener,
23     RemoveListenerCallback removeListenerCallback)
24 {
25     m_jwListener = env->NewWeakGlobalRef(jListener);
26     m_removeListenerCallback = removeListenerCallback;
27 }
28
29 JniOnDeleteResourceListener::~JniOnDeleteResourceListener()
30 {
31     LOGI("~JniOnDeleteResourceListener()");
32     if (m_jwListener)
33     {
34         jint ret = JNI_ERR;
35         JNIEnv *env = GetJNIEnv(ret);
36         if (nullptr == env)
37         {
38             return;
39         }
40         env->DeleteWeakGlobalRef(m_jwListener);
41         m_jwListener = nullptr;
42         if (JNI_EDETACHED == ret)
43         {
44             g_jvm->DetachCurrentThread();
45         }
46     }
47 }
48
49 void JniOnDeleteResourceListener::onDeleteResourceCallback(const int eCode)
50 {
51     jint envRet = JNI_ERR;
52     JNIEnv *env = GetJNIEnv(envRet);
53     if (nullptr == env)
54     {
55         return;
56     }
57
58     jobject jListener = env->NewLocalRef(m_jwListener);
59     if (!jListener)
60     {
61         checkExAndRemoveListener(env);
62         if (JNI_EDETACHED == envRet)
63         {
64             g_jvm->DetachCurrentThread();
65         }
66         return;
67     }
68     jclass clsL = env->GetObjectClass(jListener);
69     if (!clsL)
70     {
71         checkExAndRemoveListener(env);
72         if (JNI_EDETACHED == envRet)
73         {
74             g_jvm->DetachCurrentThread();
75         }
76         return;
77     }
78
79     jint jres = static_cast<jint>(eCode);
80     jmethodID midL = env->GetMethodID(clsL, "onDeleteResourceCompleted", "(I)V");
81     if (!midL)
82     {
83         checkExAndRemoveListener(env);
84         if (JNI_EDETACHED == envRet)
85         {
86             g_jvm->DetachCurrentThread();
87         }
88         return;
89     }
90     env->CallVoidMethod(jListener, midL, jres);
91
92     checkExAndRemoveListener(env);
93     if (JNI_EDETACHED == envRet)
94     {
95         g_jvm->DetachCurrentThread();
96     }
97 }
98
99 void JniOnDeleteResourceListener::checkExAndRemoveListener(JNIEnv* env)
100 {
101     if (env->ExceptionCheck())
102     {
103         jthrowable ex = env->ExceptionOccurred();
104         env->ExceptionClear();
105         m_removeListenerCallback(env, m_jwListener);
106         env->Throw((jthrowable)ex);
107     }
108     else
109     {
110         m_removeListenerCallback(env, m_jwListener);
111     }
112 }