a25f0158275757490a88c582bb7dd89fd100dba2
[iotivity.git] / java / 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::PROVISIONTRUSTCERTCHAIN:
116         {
117             calledFunc = "provisionTrustCertChainListener";
118         }
119         break;
120         case ListenerFunc::UNLINKDEVICES:
121         {
122             calledFunc = "unlinkDevicesListener";
123         }
124         break;
125         case ListenerFunc::REMOVEDEVICE:
126         {
127             calledFunc = "removeDeviceListener";
128         }
129         break;
130         case ListenerFunc::PROVISIONPAIRWISEDEVICES:
131         {
132             calledFunc = "provisionPairwiseDevicesListener";
133         }
134         break;
135         case ListenerFunc::PROVISIONDIRECTPAIRING:
136         {
137             calledFunc = "provisionDirectPairingListener";
138         }
139         break;
140         default:
141         {
142             checkExAndRemoveListener(env);
143             if (JNI_EDETACHED == ret)
144             {
145                 g_jvm->DetachCurrentThread();
146             }
147             return;
148         }
149         return;
150     }
151
152     jmethodID midL = env->GetMethodID(clsL, calledFunc.c_str(), "(Ljava/util/List;I)V");
153     if (!midL)
154     {
155         checkExAndRemoveListener(env);
156         if (JNI_EDETACHED == ret)
157         {
158             g_jvm->DetachCurrentThread();
159         }
160         return;
161     }
162     env->CallVoidMethod(jListener, midL, jResultList, (jint)hasError);
163     if (env->ExceptionCheck())
164     {
165         LOGE("Java exception is thrown");
166     }
167
168     checkExAndRemoveListener(env);
169     if (JNI_EDETACHED == ret)
170     {
171         g_jvm->DetachCurrentThread();
172     }
173 }
174
175 void JniProvisionResultListner::checkExAndRemoveListener(JNIEnv* env)
176 {
177     if (env->ExceptionCheck())
178     {
179         jthrowable ex = env->ExceptionOccurred();
180         env->ExceptionClear();
181         m_removeProvisionResultListener(env, m_jwListener);
182         env->Throw((jthrowable)ex);
183     }
184     else
185     {
186         m_removeProvisionResultListener(env, m_jwListener);
187     }
188 }