Imported Upstream version 0.9.1
[platform/upstream/iotivity.git] / android / android_api / base / jni / JniUtils.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 "JniUtils.h"\r
24 #include "JniOcRepresentation.h"\r
25 \r
26 jobject JniUtils::convertStrVectorToJavaStrList(JNIEnv *env, std::vector<std::string> &vector)\r
27 {\r
28     jobject jList = env->NewObject(g_cls_LinkedList, g_mid_LinkedList_ctor);\r
29     if (!jList) return nullptr;\r
30     for (size_t i = 0; i < vector.size(); ++i)\r
31     {\r
32         jstring jStr = env->NewStringUTF(vector[i].c_str());\r
33         if (!jStr) return nullptr;\r
34         env->CallBooleanMethod(jList, g_mid_LinkedList_add_object, jStr);\r
35         if (env->ExceptionCheck()) return nullptr;\r
36         env->DeleteLocalRef(jStr);\r
37     }\r
38     return jList;\r
39 }\r
40 \r
41 void JniUtils::convertJavaStrArrToStrVector(JNIEnv *env, jobjectArray jStrArr, std::vector<std::string> &vector)\r
42 {\r
43     if (!jStrArr) return;\r
44 \r
45     jsize len = env->GetArrayLength(jStrArr);\r
46     for (jsize i = 0; i < len; ++i)\r
47     {\r
48         jstring jStr = (jstring)env->GetObjectArrayElement(jStrArr, i);\r
49         if (!jStr) return;\r
50         vector.push_back(env->GetStringUTFChars(jStr, NULL));\r
51         if (env->ExceptionCheck()) return;\r
52         env->DeleteLocalRef(jStr);\r
53     }\r
54 }\r
55 \r
56 void JniUtils::convertJavaHeaderOptionsArrToVector(JNIEnv *env, jobjectArray jHeaderOptions,\r
57     OC::HeaderOptions &headerOptions)\r
58 {\r
59     if (!jHeaderOptions) return;\r
60 \r
61     jsize len = env->GetArrayLength(jHeaderOptions);\r
62     for (jsize i = 0; i < len; ++i)\r
63     {\r
64         jobject header = env->GetObjectArrayElement(jHeaderOptions, i);\r
65         if (!header) nullptr;\r
66         jint jId = env->CallIntMethod(header, g_mid_OcHeaderOption_get_id);\r
67         jstring jData = (jstring)env->CallObjectMethod(header, g_mid_OcHeaderOption_get_data);\r
68         if (jData) return;\r
69 \r
70         OC::HeaderOption::OCHeaderOption hopt(\r
71             static_cast<int>(jId),\r
72             env->GetStringUTFChars(jData, NULL));\r
73 \r
74         headerOptions.push_back(hopt);\r
75 \r
76         if (env->ExceptionCheck()) return;\r
77         env->DeleteLocalRef(header);\r
78         env->DeleteLocalRef(jData);\r
79     }\r
80 }\r
81 \r
82 jobject JniUtils::convertHeaderOptionsVectorToJavaList(JNIEnv *env, const OC::HeaderOptions& headerOptions)\r
83 {\r
84     jobject jHeaderOptionList = env->NewObject(g_cls_LinkedList, g_mid_LinkedList_ctor);\r
85     if (!jHeaderOptionList) return nullptr;\r
86 \r
87     for (size_t i = 0; i < headerOptions.size(); ++i)\r
88     {\r
89         jobject jHeaderOption = env->NewObject(\r
90             g_cls_OcHeaderOption,\r
91             g_mid_OcHeaderOption_ctor,\r
92             static_cast<jint>(headerOptions[i].getOptionID()),\r
93             env->NewStringUTF(headerOptions[i].getOptionData().c_str())\r
94             );\r
95         if (!jHeaderOption) return nullptr;\r
96 \r
97         env->CallBooleanMethod(jHeaderOptionList, g_mid_LinkedList_add_object, jHeaderOption);\r
98         if (env->ExceptionCheck()) return nullptr;\r
99         env->DeleteLocalRef(jHeaderOption);\r
100     }\r
101 \r
102     return jHeaderOptionList;\r
103 }\r
104 \r
105 void JniUtils::convertJavaMapToQueryParamsMap(JNIEnv *env, jobject hashMap, OC::QueryParamsMap &map)\r
106 {\r
107     if (!hashMap) return;\r
108 \r
109     jobject jEntrySet = env->CallObjectMethod(hashMap, g_mid_Map_entrySet);\r
110     jobject jIterator = env->CallObjectMethod(jEntrySet, g_mid_Set_iterator);\r
111     if (!jEntrySet || !jIterator || env->ExceptionCheck()) return;\r
112 \r
113     while (env->CallBooleanMethod(jIterator, g_mid_Iterator_hasNext))\r
114     {\r
115         jobject jEntry = env->CallObjectMethod(jIterator, g_mid_Iterator_next);\r
116         if (!jEntry) return;\r
117         jstring jKey = (jstring)env->CallObjectMethod(jEntry, g_mid_MapEntry_getKey);\r
118         if (!jKey) return;\r
119         jstring jValue = (jstring)env->CallObjectMethod(jEntry, g_mid_MapEntry_getValue);\r
120         if (!jValue) return;\r
121 \r
122         map.insert(std::make_pair(env->GetStringUTFChars(jKey, NULL),\r
123             env->GetStringUTFChars(jValue, NULL)));\r
124 \r
125         if (env->ExceptionCheck()) return;\r
126         env->DeleteLocalRef(jEntry);\r
127         env->DeleteLocalRef(jKey);\r
128         env->DeleteLocalRef(jValue);\r
129     }\r
130 }\r
131 \r
132 jobject JniUtils::convertQueryParamsMapToJavaMap(JNIEnv *env, const OC::QueryParamsMap &map)\r
133 {\r
134     jobject hashMap = env->NewObject(g_cls_HashMap, g_mid_HashMap_ctor);\r
135     if (!hashMap) return nullptr;\r
136 \r
137     for (auto it = map.begin(); it != map.end(); ++it)\r
138     {\r
139         std::string key = it->first;\r
140         std::string value = it->second;\r
141 \r
142         env->CallObjectMethod(hashMap,\r
143             g_mid_HashMap_put,\r
144             env->NewStringUTF(key.c_str()),\r
145             env->NewStringUTF(value.c_str()));\r
146         if (env->ExceptionCheck()) return nullptr;\r
147     }\r
148 \r
149     return hashMap;\r
150 }\r
151 \r
152 void JniUtils::convertJavaRepresentationArrToVector(JNIEnv *env,\r
153     jobjectArray jRepresentationArray,\r
154     std::vector<OC::OCRepresentation>& representationVector)\r
155 {\r
156     if (!jRepresentationArray) return;\r
157     jsize len = env->GetArrayLength(jRepresentationArray);\r
158 \r
159     for (jsize i = 0; i < len; ++i)\r
160     {\r
161         jobject jRep = env->GetObjectArrayElement(jRepresentationArray, i);\r
162         if (!jRep) return;\r
163         OC::OCRepresentation *rep = JniOcRepresentation::getOCRepresentationPtr(env, jRep);\r
164         representationVector.push_back(*rep);\r
165         if (env->ExceptionCheck()) return;\r
166         env->DeleteLocalRef(jRep);\r
167     }\r
168 }\r
169 \r
170 jobjectArray JniUtils::convertRepresentationVectorToJavaArray(JNIEnv *env,\r
171     const std::vector<OC::OCRepresentation>& representationVector)\r
172 {\r
173     jsize len = static_cast<jsize>(representationVector.size());\r
174     jobjectArray repArr = env->NewObjectArray(len, g_cls_OcRepresentation, NULL);\r
175     if (!repArr) return nullptr;\r
176     for (jsize i = 0; i < len; ++i)\r
177     {\r
178         OCRepresentation* rep = new OCRepresentation(representationVector[i]);\r
179         jlong handle = reinterpret_cast<jlong>(rep);\r
180         jobject jRepresentation = env->NewObject(g_cls_OcRepresentation, g_mid_OcRepresentation_N_ctor_bool,\r
181             handle, true);\r
182         if (!jRepresentation)\r
183         {\r
184             delete rep;\r
185             return nullptr;\r
186         }\r
187         env->SetObjectArrayElement(repArr, i, jRepresentation);\r
188         if (env->ExceptionCheck()) return nullptr;\r
189         env->DeleteLocalRef(jRepresentation);\r
190     }\r
191 \r
192     return repArr;\r
193 }