Merge remote-tracking branch 'origin/master' into notification-service
[platform/upstream/iotivity.git] / android / android_api / base / jni / JniProvisionResultListner.cpp
1 /*
2 * //******************************************************************
3 * //
4 * // Copyright 2015 Samsung Electronics All Rights Reserved.
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 "JniProvisionResultListner.h"
23 #include "JniOcSecureResource.h"
24 #include "JniSecureUtils.h"
25
26 JniProvisionResultListner::JniProvisionResultListner(JNIEnv *env, jobject jListener,
27     RemoveCallback removeProvisionResultListener)
28 {
29     m_jwListener = env->NewWeakGlobalRef(jListener);
30     m_removeProvisionResultListener = removeProvisionResultListener;
31 }
32
33 JniProvisionResultListner::~JniProvisionResultListner()
34 {
35     LOGI("~JniProvisionResultListner()");
36     if (m_jwListener)
37     {
38         jint ret = JNI_ERR;
39         JNIEnv *env = GetJNIEnv(ret);
40         if (nullptr == env)
41         {
42             return;
43         }
44         env->DeleteWeakGlobalRef(m_jwListener);
45         if (JNI_EDETACHED == ret)
46         {
47             g_jvm->DetachCurrentThread();
48         }
49     }
50 }
51
52 void JniProvisionResultListner::ProvisionResultCallback(PMResultList_t *result, int hasError,
53       ListenerFunc func)
54 {
55     jint ret = JNI_ERR;
56     JNIEnv *env = GetJNIEnv(ret);
57     if (nullptr == env)
58     {
59         return;
60     }
61
62     jobject jListener = env->NewLocalRef(m_jwListener);
63     if (!jListener)
64     {
65         checkExAndRemoveListener(env);
66         if (JNI_EDETACHED == ret)
67         {
68             g_jvm->DetachCurrentThread();
69         }
70         return;
71     }
72
73     jclass clsL = env->GetObjectClass(jListener);
74
75     if (!clsL)
76     {
77         checkExAndRemoveListener(env);
78         if (JNI_EDETACHED == ret)
79         {
80             g_jvm->DetachCurrentThread();
81         }
82         return;
83     }
84
85
86     jobject jResultList = JniSecureUtils::convertProvisionresultVectorToJavaList(env, result);
87     if (!jResultList)
88     {
89         checkExAndRemoveListener(env);
90         if (JNI_EDETACHED == ret)
91         {
92             g_jvm->DetachCurrentThread();
93         }
94         return;
95     }
96
97     std::string calledFunc;
98     switch (func)
99     {
100         case ListenerFunc::OWNERSHIPTRANSFER:
101         {
102             calledFunc = "doOwnershipTransferListener";
103         }
104         break;
105         case ListenerFunc::PROVISIONACL:
106         {
107             calledFunc = "provisionAclListener";
108         }
109         break;
110         case ListenerFunc::PROVISIONCREDENTIALS:
111         {
112             calledFunc = "provisionCredentialsListener";
113         }
114         break;
115         case ListenerFunc::UNLINKDEVICES:
116         {
117             calledFunc = "unlinkDevicesListener";
118         }
119         break;
120         case ListenerFunc::REMOVEDEVICE:
121         {
122             calledFunc = "removeDeviceListener";
123         }
124         break;
125         case ListenerFunc::PROVISIONPAIRWISEDEVICES:
126         {
127             calledFunc = "provisionPairwiseDevicesListener";
128         }
129         break;
130         case ListenerFunc::PROVISIONDIRECTPAIRING:
131         {
132             calledFunc = "provisionDirectPairingListener";
133         }
134         break;
135         default:
136         {
137             checkExAndRemoveListener(env);
138             if (JNI_EDETACHED == ret)
139             {
140                 g_jvm->DetachCurrentThread();
141             }
142             return;
143         }
144         return;
145     }
146
147     jmethodID midL = env->GetMethodID(clsL, calledFunc.c_str(), "(Ljava/util/List;I)V");
148     if (!midL)
149     {
150         checkExAndRemoveListener(env);
151         if (JNI_EDETACHED == ret)
152         {
153             g_jvm->DetachCurrentThread();
154         }
155         return;
156     }
157     env->CallVoidMethod(jListener, midL, jResultList, (jint)hasError);
158     if (env->ExceptionCheck())
159     {
160         LOGE("Java exception is thrown");
161     }
162
163     checkExAndRemoveListener(env);
164     if (JNI_EDETACHED == ret)
165     {
166         g_jvm->DetachCurrentThread();
167     }
168 }
169
170 void JniProvisionResultListner::checkExAndRemoveListener(JNIEnv* env)
171 {
172     if (env->ExceptionCheck())
173     {
174         jthrowable ex = env->ExceptionOccurred();
175         env->ExceptionClear();
176         m_removeProvisionResultListener(env, m_jwListener);
177         env->Throw((jthrowable)ex);
178     }
179     else
180     {
181         m_removeProvisionResultListener(env, m_jwListener);
182     }
183 }