Merge remote-tracking branch 'origin/extended-easysetup'
[platform/upstream/iotivity.git] / service / easy-setup / mediator / richsdk / android / EasySetupCore / src / main / jni / JniDevicePropProvisioningStatusListener.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
21 #include "JniDevicePropProvisioningStatusListener.h"
22 #include "JniRemoteEnrollee.h"
23
24 using namespace OIC::Service;
25
26 JniDevicePropProvisioningStatusListener::JniDevicePropProvisioningStatusListener(JNIEnv *env, jobject jListener,
27         JniRemoteEnrollee *owner)
28     : m_ownerResource(owner)
29 {
30     m_jwListener = env->NewWeakGlobalRef(jListener);
31 }
32
33 JniDevicePropProvisioningStatusListener::~JniDevicePropProvisioningStatusListener()
34 {
35     ES_LOGI("~JniDevicePropProvisioningStatusListener()");
36     if (m_jwListener)
37     {
38         jint ret;
39         JNIEnv *env = GetESJNIEnv(ret);
40         if (NULL == env) return;
41         env->DeleteWeakGlobalRef(m_jwListener);
42         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
43     }
44 }
45
46 void JniDevicePropProvisioningStatusListener::onDevicePropProvisioningStatusCallback (std::shared_ptr<DevicePropProvisioningStatus>
47         devicePropProvStatusCb)
48 {
49
50     ES_LOGI("JniDevicePropProvisioningStatusListener::onDevicePropProvisioningStatusCallback enter");
51
52     jint ret;
53     JNIEnv *env = GetESJNIEnv(ret);
54     if (NULL == env) return;
55     jobject jListener = env->NewLocalRef(m_jwListener);
56     if (!jListener)
57     {
58         checkExAndRemoveListener(env);
59         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
60         return;
61     }
62
63     jclass clsL = env->GetObjectClass(jListener);
64     if (!clsL)
65     {
66         checkExAndRemoveListener(env);
67         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
68         return;
69     }
70     //TODO:
71     jmethodID midL = env->GetMethodID(clsL, "onProgress",
72                                       "(Lorg/iotivity/service/easysetup/mediator/"
73                                       "DevicePropProvisioningStatus;"
74                                       ")V");
75
76     if (!midL)
77     {
78         checkExAndRemoveListener(env);
79         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
80         return;
81     }
82
83     int nativeESResult = convertNativeDeviceProvResultToInt(devicePropProvStatusCb->getESResult());
84
85     jobject jDevicePropProvisioningStatus = NULL;
86     jDevicePropProvisioningStatus = env->NewObject(g_cls_DevicePropProvisioningStatus,
87                                                 g_mid_DevicePropProvisioningStatus_ctor,
88                                                 (jint)nativeESResult);
89
90     ES_LOGI("JniDevicePropProvisioningStatus::onDevicePropProvisioningStatus - %d", nativeESResult);
91     if (!jDevicePropProvisioningStatus)
92     {
93         ES_LOGE("JniDevicePropProvisioningStatus::onDevicePropProvisioningStatus Unable to create the java object");
94         return ;
95     }
96
97     env->CallVoidMethod(jListener, midL, jDevicePropProvisioningStatus);
98
99     if (env->ExceptionCheck())
100     {
101         ES_LOGE("Java exception is thrown");
102         checkExAndRemoveListener(env);
103         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
104         return;
105     }
106
107     if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
108 }
109
110 void JniDevicePropProvisioningStatusListener::checkExAndRemoveListener(JNIEnv *env)
111 {
112     if (env->ExceptionCheck())
113     {
114         jthrowable ex = env->ExceptionOccurred();
115         env->ExceptionClear();
116         m_ownerResource->removeStatusListener<JniDevicePropProvisioningStatusListener>(env, m_jwListener);
117         env->Throw((jthrowable)ex);
118     }
119     else
120     {
121         m_ownerResource->removeStatusListener<JniDevicePropProvisioningStatusListener>(env, m_jwListener);
122     }
123 }