added code to close the netlink socket.
[contrib/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;
39         JNIEnv *env = GetJNIEnv(ret);
40         if (NULL == env) return;
41         env->DeleteWeakGlobalRef(m_jwListener);
42         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
43     }
44 }
45
46 void JniProvisionResultListner::ProvisionResultCallback(PMResultList_t *result, int hasError,
47       ListenerFunc func)
48 {
49     jint ret;
50     JNIEnv *env = GetJNIEnv(ret);
51     if (NULL == env) return;
52
53     jobject jListener = env->NewLocalRef(m_jwListener);
54     if (!jListener)
55     {
56         checkExAndRemoveListener(env);
57         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
58         return;
59     }
60
61     jclass clsL = env->GetObjectClass(jListener);
62
63     if (!clsL)
64     {
65         checkExAndRemoveListener(env);
66         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
67         return;
68     }
69
70
71     jobject jResultList = JniSecureUtils::convertProvisionresultVectorToJavaList(env, result);
72     if (!jResultList)
73     {
74         checkExAndRemoveListener(env);
75         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
76         return;
77     }
78
79     std::string calledFunc;
80     switch (func)
81     {
82         case ListenerFunc::OWNERSHIPTRANSFER:
83         {
84             calledFunc = "doOwnershipTransferListener";
85         }
86         break;
87         case ListenerFunc::PROVISIONACL:
88         {
89             calledFunc = "provisionAclListener";
90         }
91         break;
92         case ListenerFunc::PROVISIONCREDENTIALS:
93         {
94             calledFunc = "provisionCredentialsListener";
95         }
96         break;
97         case ListenerFunc::UNLINKDEVICES:
98         {
99             calledFunc = "unlinkDevicesListener";
100         }
101         break;
102         case ListenerFunc::REMOVEDEVICE:
103         {
104             calledFunc = "removeDeviceListener";
105         }
106         break;
107         case ListenerFunc::PROVISIONPAIRWISEDEVICES:
108         {
109             calledFunc = "provisionPairwiseDevicesListener";
110         }
111         break;
112         default:
113         {
114             checkExAndRemoveListener(env);
115             if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
116         }
117         return;
118     }
119
120     jmethodID midL = env->GetMethodID(clsL, calledFunc.c_str(), "(Ljava/util/List;I)V");
121     if (!midL)
122     {
123         checkExAndRemoveListener(env);
124         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
125         return;
126     }
127     env->CallVoidMethod(jListener, midL, jResultList, (jint)hasError);
128     if (env->ExceptionCheck())
129     {
130         LOGE("Java exception is thrown");
131     }
132
133     checkExAndRemoveListener(env);
134     if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
135 }
136
137 void JniProvisionResultListner::checkExAndRemoveListener(JNIEnv* env)
138 {
139     if (env->ExceptionCheck())
140     {
141         jthrowable ex = env->ExceptionOccurred();
142         env->ExceptionClear();
143         m_removeProvisionResultListener(env, m_jwListener);
144         env->Throw((jthrowable)ex);
145     }
146     else
147     {
148         m_removeProvisionResultListener(env, m_jwListener);
149     }
150 }