Imported Upstream version 0.9.1
[platform/upstream/iotivity.git] / android / android_api / base / jni / JniOnDeleteListener.cpp
1 /*\r
2 * //******************************************************************\r
3 * //\r
4 * // Copyright 2015 Intel Corporation.\r
5 * //\r
6 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
7 * //\r
8 * // Licensed under the Apache License, Version 2.0 (the "License");\r
9 * // you may not use this file except in compliance with the License.\r
10 * // You may obtain a copy of the License at\r
11 * //\r
12 * //      http://www.apache.org/licenses/LICENSE-2.0\r
13 * //\r
14 * // Unless required by applicable law or agreed to in writing, software\r
15 * // distributed under the License is distributed on an "AS IS" BASIS,\r
16 * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
17 * // See the License for the specific language governing permissions and\r
18 * // limitations under the License.\r
19 * //\r
20 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
21 */\r
22 \r
23 #include "JniOnDeleteListener.h"\r
24 #include "JniOcResource.h"\r
25 #include "JniUtils.h"\r
26 \r
27 JniOnDeleteListener::JniOnDeleteListener(JNIEnv *env, jobject jListener, JniOcResource* owner)\r
28     : m_ownerResource(owner)\r
29 {\r
30     m_jwListener = env->NewWeakGlobalRef(jListener);\r
31 }\r
32 \r
33 JniOnDeleteListener::~JniOnDeleteListener()\r
34 {\r
35     if (m_jwListener)\r
36     {\r
37         jint ret;\r
38         JNIEnv *env = GetJNIEnv(ret);\r
39         if (NULL == env) return;\r
40         env->DeleteWeakGlobalRef(m_jwListener);\r
41         if (JNI_EDETACHED == ret) g_jvm->DetachCurrentThread();\r
42     }\r
43 }\r
44 \r
45 void JniOnDeleteListener::onDeleteCallback(const HeaderOptions& headerOptions, const int eCode)\r
46 {\r
47     jint envRet;\r
48     JNIEnv *env = GetJNIEnv(envRet);\r
49     if (NULL == env) return;\r
50 \r
51     jobject jListener = env->NewLocalRef(m_jwListener);\r
52     if (!jListener)\r
53     {\r
54         checkExAndRemoveListener(env);\r
55         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
56         return;\r
57     }\r
58     jclass clsL = env->GetObjectClass(jListener);\r
59     if (!clsL)\r
60     {\r
61         checkExAndRemoveListener(env);\r
62         if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
63         return;\r
64     }\r
65 \r
66     if (OC_STACK_RESOURCE_DELETED != eCode)\r
67     {\r
68         jobject ex = GetOcException(eCode, "stack error in onDeleteCallback");\r
69         if (!ex)\r
70         {\r
71             checkExAndRemoveListener(env);\r
72             if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
73             return;\r
74         }\r
75         jmethodID midL = env->GetMethodID(clsL, "onDeleteFailed", "(Ljava/lang/Throwable;)V");\r
76         if (!midL)\r
77         {\r
78             checkExAndRemoveListener(env);\r
79             if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
80             return;\r
81         }\r
82         env->CallVoidMethod(jListener, midL, ex);\r
83     }\r
84     else\r
85     {\r
86         jobject jHeaderOptionList = JniUtils::convertHeaderOptionsVectorToJavaList(env, headerOptions);\r
87         if (!jHeaderOptionList)\r
88         {\r
89             checkExAndRemoveListener(env);\r
90             if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
91             return;\r
92         }\r
93 \r
94         jmethodID midL = env->GetMethodID(clsL, "onDeleteCompleted", "(Ljava/util/List;)V");\r
95         if (!midL)\r
96         {\r
97             checkExAndRemoveListener(env);\r
98             if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
99             return;\r
100         }\r
101         env->CallVoidMethod(jListener, midL, jHeaderOptionList);\r
102     }\r
103 \r
104     checkExAndRemoveListener(env);\r
105     if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();\r
106 }\r
107 \r
108 void JniOnDeleteListener::checkExAndRemoveListener(JNIEnv* env)\r
109 {\r
110     if (env->ExceptionCheck())\r
111     {\r
112         jthrowable ex = env->ExceptionOccurred();\r
113         env->ExceptionClear();\r
114         m_ownerResource->removeOnDeleteListener(env, m_jwListener);\r
115         env->Throw((jthrowable)ex);\r
116     }\r
117     else\r
118     {\r
119         m_ownerResource->removeOnDeleteListener(env, m_jwListener);\r
120     }\r
121 }