Imported Upstream version 1.2.0
[platform/upstream/iotivity.git] / service / easy-setup / mediator / richsdk / android / EasySetupCore / src / main / jni / JniGetEnrolleeStatusListener.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 "JniGetEnrolleeStatusListener.h"
22 #include "JniRemoteEnrollee.h"
23
24 using namespace OC;
25 using namespace OIC::Service;
26
27 JniGetEnrolleeStatusListener::JniGetEnrolleeStatusListener(JNIEnv *env, jobject jListener,
28         JniRemoteEnrollee *owner)
29     : m_ownerResource(owner)
30 {
31     m_jwListener = env->NewWeakGlobalRef(jListener);
32 }
33
34 JniGetEnrolleeStatusListener::~JniGetEnrolleeStatusListener()
35 {
36     ES_LOGI("~JniGetEnrolleeStatusListener()");
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 JniGetEnrolleeStatusListener::getEnrolleeStatusCallback (
48     std::shared_ptr<GetEnrolleeStatus> getEnrolleeStatusCb)
49 {
50     ES_LOGI("JniGetEnrolleeStatusListener::getEnrolleeStatusCallback 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                                       "GetEnrolleeStatus;"
74                                       ")V");
75
76     if (!midL)
77     {
78         checkExAndRemoveListener(env);
79         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
80         return;
81     }
82
83     EnrolleeStatus enrolleeStatus = getEnrolleeStatusCb->getEnrolleeStatus();
84     OCRepresentation m_Rep = enrolleeStatus.getRepresentation();
85     OCRepresentation* rep = new OCRepresentation(m_Rep);
86     jlong handle = reinterpret_cast<jlong>(rep);
87     jobject jRepresentation = env->NewObject(g_cls_OcRepresentation,
88                                             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 jEnrolleeStatus = NULL;
102     jEnrolleeStatus = env->NewObject(g_cls_EnrolleeStatus,
103                                         g_mid_EnrolleeStatus_ctor,
104                                         (jobject)jRepresentation);
105     if (!jEnrolleeStatus) {
106         ES_LOGE("JniGetEnrolleeStatusListener::getEnrolleeStatusCallback Unable to create the jEnrolleeStatus");
107         return ;
108     }
109
110     ESResult esResult = getEnrolleeStatusCb->getESResult();
111     jobject jgetEnrolleeStatus = NULL;
112     jgetEnrolleeStatus = env->NewObject(g_cls_getEnrolleeStatus,
113                                             g_mid_getEnrolleeStatus_ctor,
114                                             (jint)esResult,
115                                             (jobject)jEnrolleeStatus);
116
117     if (!jgetEnrolleeStatus)
118     {
119         ES_LOGE("JniGetEnrolleeStatusListener::getEnrolleeStatusCallback Unable to create the java object");
120         return ;
121     }
122
123     env->CallVoidMethod(jListener, midL, jgetEnrolleeStatus);
124
125     if (env->ExceptionCheck())
126     {
127         ES_LOGE("Java exception is thrown");
128         checkExAndRemoveListener(env);
129         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
130         return;
131     }
132
133     if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();
134 }
135
136 void JniGetEnrolleeStatusListener::checkExAndRemoveListener(JNIEnv *env)
137 {
138     if (env->ExceptionCheck())
139     {
140         jthrowable ex = env->ExceptionOccurred();
141         env->ExceptionClear();
142         m_ownerResource->removeStatusListener<JniGetEnrolleeStatusListener>
143                                                             (env, m_jwListener);
144
145         env->Throw((jthrowable)ex);
146     }
147     else
148     {
149         m_ownerResource->removeStatusListener<JniGetEnrolleeStatusListener>
150                                                             (env, m_jwListener);
151     }
152 }
153