replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / easy-setup / mediator / richsdk / android / EasySetupCore / src / main / jni / JniGetConfigurationStatusListener.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 "JniGetConfigurationStatusListener.h"
22 #include "JniRemoteEnrollee.h"
23
24 using namespace OC;
25 using namespace OIC::Service;
26
27 JniGetConfigurationStatusListener::JniGetConfigurationStatusListener(JNIEnv *env, jobject jListener,
28         JniRemoteEnrollee *owner)
29     : m_ownerResource(owner)
30 {
31     m_jwListener = env->NewWeakGlobalRef(jListener);
32 }
33
34 JniGetConfigurationStatusListener::~JniGetConfigurationStatusListener()
35 {
36     ES_LOGI("~JniGetConfigurationStatusListener()");
37     if (m_jwListener)
38     {
39         jint ret;
40         JNIEnv *env = GetESJNIEnv(ret);
41         if (NULL == env) return;
42         env->DeleteWeakGlobalRef(m_jwListener);
43         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
44     }
45 }
46
47 void JniGetConfigurationStatusListener::getConfigurationStatusCallback (
48     std::shared_ptr<GetConfigurationStatus> getConfigurationStatusCb)
49 {
50     ES_LOGI("JniGetConfigurationStatusListener::provisioiningStatusCallback 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
71     jmethodID midL = env->GetMethodID(clsL, "onProgress",
72                                       "(Lorg/iotivity/service/easysetup/mediator/"
73                                       "GetConfigurationStatus;"
74                                       ")V");
75
76     if (!midL)
77     {
78         checkExAndRemoveListener(env);
79         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
80         return;
81     }
82
83     EnrolleeConf enrolleeConf = getConfigurationStatusCb->getEnrolleeConf();
84     OCRepresentation m_ProvRep = enrolleeConf.getEasySetupRep();
85
86     OCRepresentation* rep = new OCRepresentation(m_ProvRep);
87     jlong handle = reinterpret_cast<jlong>(rep);
88     jobject jRepresentation = env->NewObject(g_cls_OcRepresentation, g_mid_OcRepresentation_N_ctor_bool,
89                                             handle, true);
90     if (!jRepresentation)
91     {
92         delete rep;
93         checkExAndRemoveListener(env);
94         if (JNI_EDETACHED == ret)
95         {
96             g_jvm->DetachCurrentThread();
97         }
98         return;
99     }
100
101     jobject jEnrolleeConf = NULL;
102     jEnrolleeConf = env->NewObject(g_cls_EnrolleeConf, g_mid_EnrolleeConf_ctor, (jobject)jRepresentation);
103     if (!jEnrolleeConf) {
104         ES_LOGE("JniGetConfigurationStatusListener::getConfigurationStatusCallback Unable to create the jEnrolleeConf");
105         return ;
106     }
107
108     ESResult esResult = getConfigurationStatusCb->getESResult();
109     jobject jgetConfigurationStatus = NULL;
110     jgetConfigurationStatus = env->NewObject(g_cls_getConfigurationStatus,
111                                                 g_mid_getConfigurationStatus_ctor,
112                                                 (jint)esResult,
113                                                 (jobject)jEnrolleeConf);
114
115     if (!jgetConfigurationStatus)
116     {
117         ES_LOGE("JniGetConfigurationStatusListener::getConfigurationStatusCallback Unable to create the java object");
118         return ;
119     }
120
121     env->CallVoidMethod(jListener, midL, jgetConfigurationStatus);
122
123     if (env->ExceptionCheck())
124     {
125         ES_LOGE("Java exception is thrown");
126         checkExAndRemoveListener(env);
127         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
128         return;
129     }
130
131     if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
132 }
133
134 void JniGetConfigurationStatusListener::checkExAndRemoveListener(JNIEnv *env)
135 {
136     if (env->ExceptionCheck())
137     {
138         jthrowable ex = env->ExceptionOccurred();
139         env->ExceptionClear();
140         m_ownerResource->removeStatusListener<JniGetConfigurationStatusListener>(env, m_jwListener);
141
142         env->Throw((jthrowable)ex);
143     }
144     else
145     {
146         m_ownerResource->removeStatusListener<JniGetConfigurationStatusListener>(env, m_jwListener);
147     }
148 }