1 /* ****************************************************************
3 * Copyright 2016 Samsung Electronics All Rights Reserved.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 ******************************************************************/
24 #include "cacommonutil.h"
25 #include "camanagerleutil.h"
26 #include "uarraylist.h"
28 #include "camanagerdevice.h"
29 #include "oic_malloc.h"
31 #define TAG "OIC_CA_MANAGER_DEVICE"
33 static u_arraylist_t *g_deviceACDataList = NULL;
34 static oc_mutex g_deviceACDataListMutex = NULL;
35 static bool g_isBTRecovery = false;
37 jstring CAManagerGetLEAddressFromACData(JNIEnv *env, size_t idx)
39 OIC_LOG_V(DEBUG, TAG, "CAManagerGetLEAddressFromACData (idx : %d)", idx);
40 if (idx <= u_arraylist_length(g_deviceACDataList))
42 CAManagerACData_t *curData = (CAManagerACData_t *) u_arraylist_get(
43 g_deviceACDataList, idx);
46 OIC_LOG(ERROR, TAG, "curData is null");
50 const char* address = (*env)->GetStringUTFChars(env, curData->address, NULL);
53 OIC_LOG(ERROR, TAG, "address is null");
56 OIC_LOG_V(INFO, TAG, "found target address : %s", address);
57 (*env)->ReleaseStringUTFChars(env, curData->address, address);
59 return curData->address;
61 OIC_LOG(DEBUG, TAG, "idx is greater than the length of ACDataList");
65 void CAManagerCreateACDataList()
67 OIC_LOG(DEBUG, TAG, "CAManagerCreateACDataList");
69 oc_mutex_lock(g_deviceACDataListMutex);
70 if (NULL == g_deviceACDataList)
72 OIC_LOG(DEBUG, TAG, "Create AC Data list");
73 g_deviceACDataList = u_arraylist_create();
75 oc_mutex_unlock(g_deviceACDataListMutex);
78 void CAManagerDestroyACDataList()
80 OIC_LOG(DEBUG, TAG, "CAManagerDestroyACDataList");
81 if (g_deviceACDataList)
83 OIC_LOG(DEBUG, TAG, "Destroy AC Data list");
84 u_arraylist_free(&g_deviceACDataList);
85 g_deviceACDataList = NULL;
89 CAResult_t CAManagerInitMutexVaraibles()
91 if (NULL == g_deviceACDataListMutex)
93 g_deviceACDataListMutex = oc_mutex_new();
94 if (NULL == g_deviceACDataListMutex)
96 OIC_LOG(ERROR, TAG, "oc_mutex_new has failed");
97 return CA_STATUS_FAILED;
103 void CAManagerTerminateMutexVariables()
105 if (g_deviceACDataListMutex)
107 oc_mutex_free(g_deviceACDataListMutex);
108 g_deviceACDataListMutex = NULL;
112 static CAManagerACData_t *CAManagerCreateACData(jstring jaddress)
114 VERIFY_NON_NULL_RET(jaddress, TAG, "jaddress", NULL);
117 CAManagerACData_t *data = (CAManagerACData_t *) OICCalloc(1, sizeof(*data));
120 OIC_LOG(ERROR, TAG, "memory alloc has failed");
124 data->address = jaddress;
125 data->isAutoConnecting = false;
129 bool CAManagerIsInACDataList(JNIEnv *env, jstring jaddress)
131 VERIFY_NON_NULL_RET(env, TAG, "env", NULL);
132 VERIFY_NON_NULL_RET(jaddress, TAG, "jaddress", false);
134 oc_mutex_lock(g_deviceACDataListMutex);
136 const char* address = (*env)->GetStringUTFChars(env, jaddress, NULL);
139 OIC_LOG(ERROR, TAG, "address is null");
140 oc_mutex_unlock(g_deviceACDataListMutex);
144 size_t length = u_arraylist_length(g_deviceACDataList);
145 for (size_t idx = 0; idx < length; idx++)
147 CAManagerACData_t *curData = (CAManagerACData_t *) u_arraylist_get(g_deviceACDataList,
151 OIC_LOG(ERROR, TAG, "curData is null");
152 (*env)->ReleaseStringUTFChars(env, jaddress, address);
153 oc_mutex_unlock(g_deviceACDataListMutex);
157 const char* setAddress = (*env)->GetStringUTFChars(env, curData->address, NULL);
160 OIC_LOG(ERROR, TAG, "address is null");
161 (*env)->ReleaseStringUTFChars(env, jaddress, address);
162 oc_mutex_unlock(g_deviceACDataListMutex);
166 if (!strcmp(setAddress, address))
168 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
169 (*env)->ReleaseStringUTFChars(env, jaddress, address);
170 oc_mutex_unlock(g_deviceACDataListMutex);
173 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
176 OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in list", address);
177 (*env)->ReleaseStringUTFChars(env, jaddress, address);
178 oc_mutex_unlock(g_deviceACDataListMutex);
183 void CAManagerAddACData(JNIEnv *env, jstring jaddress)
185 VERIFY_NON_NULL_VOID(env, TAG, "env");
186 VERIFY_NON_NULL_VOID(jaddress, TAG, "jaddress");
188 if(!CAManagerIsInACDataList(env, jaddress))
190 OIC_LOG(DEBUG, TAG, "new ACdata will be added in List");
191 // add CAManagerACData
192 jobject gaddress = (*env)->NewGlobalRef(env, jaddress);
194 CAManagerACData_t *data = CAManagerCreateACData(gaddress);
196 oc_mutex_lock(g_deviceACDataListMutex);
197 u_arraylist_add(g_deviceACDataList, data);
198 oc_mutex_unlock(g_deviceACDataListMutex);
202 OIC_LOG(DEBUG, TAG, "the address is already in ACData list");
206 CAResult_t CAManagerRemoveACData(JNIEnv *env, jstring jaddress)
208 OIC_LOG(DEBUG, TAG, "CAManagerRemoveACData");
209 VERIFY_NON_NULL(env, TAG, "env");
210 VERIFY_NON_NULL(jaddress, TAG, "jaddress");
212 oc_mutex_lock(g_deviceACDataListMutex);
214 const char* address = (*env)->GetStringUTFChars(env, jaddress, NULL);
217 OIC_LOG(ERROR, TAG, "address is null");
218 oc_mutex_unlock(g_deviceACDataListMutex);
219 return CA_STATUS_FAILED;
222 OIC_LOG_V(DEBUG, TAG, "[%s] will be removed", address);
224 size_t length = u_arraylist_length(g_deviceACDataList);
225 for (size_t idx = 0; idx < length; idx++)
227 CAManagerACData_t *curData = (CAManagerACData_t *) u_arraylist_get(g_deviceACDataList,
231 OIC_LOG(ERROR, TAG, "curData is null");
232 (*env)->ReleaseStringUTFChars(env, jaddress, address);
233 oc_mutex_unlock(g_deviceACDataListMutex);
234 return CA_STATUS_FAILED;
237 const char* setAddress = (*env)->GetStringUTFChars(env, curData->address, NULL);
240 OIC_LOG(ERROR, TAG, "address is null");
241 (*env)->ReleaseStringUTFChars(env, jaddress, address);
242 oc_mutex_unlock(g_deviceACDataListMutex);
243 return CA_STATUS_FAILED;
246 if (!strcmp(setAddress, address))
248 if (NULL == u_arraylist_remove(g_deviceACDataList, idx))
250 OIC_LOG(ERROR, TAG, "removal has failed.");
251 (*env)->ReleaseStringUTFChars(env, jaddress, address);
252 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
253 oc_mutex_unlock(g_deviceACDataListMutex);
254 return CA_STATUS_FAILED;
257 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
259 if (curData->address)
261 (*env)->DeleteGlobalRef(env, curData->address);
265 (*env)->ReleaseStringUTFChars(env, jaddress, address);
266 oc_mutex_unlock(g_deviceACDataListMutex);
267 OIC_LOG(DEBUG, TAG, "remove done");
270 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
273 OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in list", address);
274 (*env)->ReleaseStringUTFChars(env, jaddress, address);
275 oc_mutex_unlock(g_deviceACDataListMutex);
280 CAResult_t CAManagerRemoveAllACData(JNIEnv *env)
282 OIC_LOG(DEBUG, TAG, "IN - CAManagerRemoveAllACData");
283 VERIFY_NON_NULL(env, TAG, "env");
285 oc_mutex_lock(g_deviceACDataListMutex);
287 size_t length = u_arraylist_length(g_deviceACDataList);
288 for (size_t idx = 0; idx < length; idx++)
290 CAManagerACData_t *curData = (CAManagerACData_t *) u_arraylist_get(g_deviceACDataList,
294 OIC_LOG(ERROR, TAG, "curData is null");
295 oc_mutex_unlock(g_deviceACDataListMutex);
296 return CA_STATUS_FAILED;
299 if (NULL == u_arraylist_remove(g_deviceACDataList, idx))
301 OIC_LOG(ERROR, TAG, "removal has failed.");
302 oc_mutex_unlock(g_deviceACDataListMutex);
303 return CA_STATUS_FAILED;
306 if (curData->address)
308 (*env)->DeleteGlobalRef(env, curData->address);
313 oc_mutex_unlock(g_deviceACDataListMutex);
314 OIC_LOG(DEBUG, TAG, "OUT - CAManagerRemoveAllACData");
318 CAResult_t CAManagerGetAutoConnectingFlag(JNIEnv *env, jstring jaddress, bool *flag)
320 OIC_LOG(DEBUG, TAG, "CAManagerGetAutoConnectingFlag");
321 VERIFY_NON_NULL(env, TAG, "env");
322 VERIFY_NON_NULL(jaddress, TAG, "jaddress");
324 oc_mutex_lock(g_deviceACDataListMutex);
326 const char* address = (*env)->GetStringUTFChars(env, jaddress, NULL);
329 OIC_LOG(ERROR, TAG, "address is null");
330 oc_mutex_unlock(g_deviceACDataListMutex);
331 return CA_STATUS_FAILED;
334 size_t length = u_arraylist_length(g_deviceACDataList);
335 for (size_t idx = 0; idx < length; idx++)
337 CAManagerACData_t *curData = (CAManagerACData_t *) u_arraylist_get(g_deviceACDataList,
341 OIC_LOG(ERROR, TAG, "curData is null");
342 (*env)->ReleaseStringUTFChars(env, jaddress, address);
343 oc_mutex_unlock(g_deviceACDataListMutex);
344 return CA_STATUS_FAILED;
347 const char* setAddress = (*env)->GetStringUTFChars(env, curData->address, NULL);
350 OIC_LOG(ERROR, TAG, "setAddress is null");
351 (*env)->ReleaseStringUTFChars(env, jaddress, address);
352 oc_mutex_unlock(g_deviceACDataListMutex);
353 return CA_STATUS_FAILED;
356 if (!strcmp(setAddress, address))
358 OIC_LOG_V(DEBUG, TAG, "address : [%s], isAutoConnecting : %d", address,
359 curData->isAutoConnecting);
360 *flag = curData->isAutoConnecting;
361 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
362 (*env)->ReleaseStringUTFChars(env, jaddress, address);
363 oc_mutex_unlock(g_deviceACDataListMutex);
366 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
369 OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in list", address);
370 (*env)->ReleaseStringUTFChars(env, jaddress, address);
371 oc_mutex_unlock(g_deviceACDataListMutex);
373 return CA_STATUS_FAILED;
376 bool CAManagerSetAutoConnectingFlag(JNIEnv *env, jstring jaddress, bool flag)
378 OIC_LOG(DEBUG, TAG, "CAManagerSetAutoConnectingFlag");
379 VERIFY_NON_NULL_RET(env, TAG, "env", false);
380 VERIFY_NON_NULL_RET(jaddress, TAG, "jaddress", false);
382 oc_mutex_lock(g_deviceACDataListMutex);
384 const char* address = (*env)->GetStringUTFChars(env, jaddress, NULL);
387 OIC_LOG(ERROR, TAG, "address is null");
388 oc_mutex_unlock(g_deviceACDataListMutex);
392 size_t length = u_arraylist_length(g_deviceACDataList);
393 for (size_t idx = 0; idx < length; idx++)
395 CAManagerACData_t *curData = (CAManagerACData_t *) u_arraylist_get(g_deviceACDataList,
399 OIC_LOG(ERROR, TAG, "curData is null");
400 (*env)->ReleaseStringUTFChars(env, jaddress, address);
401 oc_mutex_unlock(g_deviceACDataListMutex);
405 const char* setAddress = (*env)->GetStringUTFChars(env, curData->address, NULL);
408 OIC_LOG(ERROR, TAG, "address is null");
409 (*env)->ReleaseStringUTFChars(env, jaddress, address);
410 oc_mutex_unlock(g_deviceACDataListMutex);
414 if (!strcmp(setAddress, address))
416 OIC_LOG_V(DEBUG, TAG, "isAutoConnecting flag of [%s] is set to %d", address,
417 curData->isAutoConnecting);
418 curData->isAutoConnecting = flag;
419 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
420 (*env)->ReleaseStringUTFChars(env, jaddress, address);
421 oc_mutex_unlock(g_deviceACDataListMutex);
424 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
427 OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in list", address);
428 (*env)->ReleaseStringUTFChars(env, jaddress, address);
429 oc_mutex_unlock(g_deviceACDataListMutex);
434 size_t CAManagerGetACDataLength()
436 return u_arraylist_length(g_deviceACDataList);
439 void CAManagerSetBTRecovery(bool flag)
441 g_isBTRecovery = flag;
442 OIC_LOG_V(DEBUG, TAG, "BT recovery flag is set to %d", g_isBTRecovery);
445 bool CAManagerIsRecoveryFlagSet()
447 return g_isBTRecovery;