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 OIC_LOG(DEBUG, TAG, "IN - CAManagerCreateACData");
115 VERIFY_NON_NULL_RET(jaddress, TAG, "jaddress", NULL);
118 CAManagerACData_t *data = (CAManagerACData_t *) OICCalloc(1, sizeof(*data));
121 OIC_LOG(ERROR, TAG, "memory alloc has failed");
125 data->address = jaddress;
126 data->isAutoConnecting = false;
128 OIC_LOG(DEBUG, TAG, "OUT - CAManagerCreateACData");
132 bool CAManagerIsInACDataList(JNIEnv *env, jstring jaddress)
134 VERIFY_NON_NULL_RET(env, TAG, "env", NULL);
135 VERIFY_NON_NULL_RET(jaddress, TAG, "jaddress", false);
137 oc_mutex_lock(g_deviceACDataListMutex);
139 const char* address = (*env)->GetStringUTFChars(env, jaddress, NULL);
142 OIC_LOG(ERROR, TAG, "address is null");
143 oc_mutex_unlock(g_deviceACDataListMutex);
147 size_t length = u_arraylist_length(g_deviceACDataList);
148 for (size_t idx = 0; idx < length; idx++)
150 CAManagerACData_t *curData = (CAManagerACData_t *) u_arraylist_get(g_deviceACDataList,
154 OIC_LOG(ERROR, TAG, "curData is null");
155 (*env)->ReleaseStringUTFChars(env, jaddress, address);
156 oc_mutex_unlock(g_deviceACDataListMutex);
160 const char* setAddress = (*env)->GetStringUTFChars(env, curData->address, NULL);
163 OIC_LOG(ERROR, TAG, "address is null");
164 (*env)->ReleaseStringUTFChars(env, jaddress, address);
165 oc_mutex_unlock(g_deviceACDataListMutex);
169 if (!strcmp(setAddress, address))
171 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
172 (*env)->ReleaseStringUTFChars(env, jaddress, address);
173 oc_mutex_unlock(g_deviceACDataListMutex);
176 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
179 OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in list", address);
180 (*env)->ReleaseStringUTFChars(env, jaddress, address);
181 oc_mutex_unlock(g_deviceACDataListMutex);
186 void CAManagerAddACData(JNIEnv *env, jstring jaddress)
188 OIC_LOG(DEBUG, TAG, "IN - CAManagerAddACData");
190 VERIFY_NON_NULL_VOID(env, TAG, "env");
191 VERIFY_NON_NULL_VOID(jaddress, TAG, "jaddress");
193 if(!CAManagerIsInACDataList(env, jaddress))
195 OIC_LOG(DEBUG, TAG, "new ACdata will be added in List");
196 // add CAManagerACData
197 jobject gaddress = (*env)->NewGlobalRef(env, jaddress);
199 CAManagerACData_t *data = CAManagerCreateACData(gaddress);
201 oc_mutex_lock(g_deviceACDataListMutex);
202 u_arraylist_add(g_deviceACDataList, data);
203 oc_mutex_unlock(g_deviceACDataListMutex);
207 OIC_LOG(DEBUG, TAG, "the address is already in ACData list");
210 OIC_LOG(DEBUG, TAG, "OUT - CAManagerAddACData");
213 CAResult_t CAManagerRemoveACData(JNIEnv *env, jstring jaddress)
215 OIC_LOG(DEBUG, TAG, "CAManagerRemoveACData");
216 VERIFY_NON_NULL(env, TAG, "env");
217 VERIFY_NON_NULL(jaddress, TAG, "jaddress");
219 oc_mutex_lock(g_deviceACDataListMutex);
221 const char* address = (*env)->GetStringUTFChars(env, jaddress, NULL);
224 OIC_LOG(ERROR, TAG, "address is null");
225 oc_mutex_unlock(g_deviceACDataListMutex);
226 return CA_STATUS_FAILED;
229 OIC_LOG_V(DEBUG, TAG, "[%s] will be removed", address);
231 size_t length = u_arraylist_length(g_deviceACDataList);
232 for (size_t idx = 0; idx < length; idx++)
234 CAManagerACData_t *curData = (CAManagerACData_t *) u_arraylist_get(g_deviceACDataList,
238 OIC_LOG(ERROR, TAG, "curData is null");
239 (*env)->ReleaseStringUTFChars(env, jaddress, address);
240 oc_mutex_unlock(g_deviceACDataListMutex);
241 return CA_STATUS_FAILED;
244 const char* setAddress = (*env)->GetStringUTFChars(env, curData->address, NULL);
247 OIC_LOG(ERROR, TAG, "address is null");
248 (*env)->ReleaseStringUTFChars(env, jaddress, address);
249 oc_mutex_unlock(g_deviceACDataListMutex);
250 return CA_STATUS_FAILED;
253 if (!strcmp(setAddress, address))
255 if (NULL == u_arraylist_remove(g_deviceACDataList, idx))
257 OIC_LOG(ERROR, TAG, "removal has failed.");
258 (*env)->ReleaseStringUTFChars(env, jaddress, address);
259 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
260 oc_mutex_unlock(g_deviceACDataListMutex);
261 return CA_STATUS_FAILED;
264 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
266 if (curData->address)
268 (*env)->DeleteGlobalRef(env, curData->address);
272 (*env)->ReleaseStringUTFChars(env, jaddress, address);
273 oc_mutex_unlock(g_deviceACDataListMutex);
274 OIC_LOG(DEBUG, TAG, "remove done");
277 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
280 OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in list", address);
281 (*env)->ReleaseStringUTFChars(env, jaddress, address);
282 oc_mutex_unlock(g_deviceACDataListMutex);
287 CAResult_t CAManagerRemoveAllACData(JNIEnv *env)
289 OIC_LOG(DEBUG, TAG, "IN - CAManagerRemoveAllACData");
290 VERIFY_NON_NULL(env, TAG, "env");
292 oc_mutex_lock(g_deviceACDataListMutex);
294 size_t length = u_arraylist_length(g_deviceACDataList);
295 for (size_t idx = 0; idx < length; idx++)
297 CAManagerACData_t *curData = (CAManagerACData_t *) u_arraylist_get(g_deviceACDataList,
301 OIC_LOG(ERROR, TAG, "curData is null");
302 oc_mutex_unlock(g_deviceACDataListMutex);
303 return CA_STATUS_FAILED;
306 if (NULL == u_arraylist_remove(g_deviceACDataList, idx))
308 OIC_LOG(ERROR, TAG, "removal has failed.");
309 oc_mutex_unlock(g_deviceACDataListMutex);
310 return CA_STATUS_FAILED;
313 if (curData->address)
315 (*env)->DeleteGlobalRef(env, curData->address);
320 oc_mutex_unlock(g_deviceACDataListMutex);
321 OIC_LOG(DEBUG, TAG, "OUT - CAManagerRemoveAllACData");
325 CAResult_t CAManagerGetAutoConnectingFlag(JNIEnv *env, jstring jaddress, bool *flag)
327 OIC_LOG(DEBUG, TAG, "CAManagerGetAutoConnectingFlag");
328 VERIFY_NON_NULL(env, TAG, "env");
329 VERIFY_NON_NULL(jaddress, TAG, "jaddress");
331 oc_mutex_lock(g_deviceACDataListMutex);
333 const char* address = (*env)->GetStringUTFChars(env, jaddress, NULL);
336 OIC_LOG(ERROR, TAG, "address is null");
337 oc_mutex_unlock(g_deviceACDataListMutex);
338 return CA_STATUS_FAILED;
341 size_t length = u_arraylist_length(g_deviceACDataList);
342 for (size_t idx = 0; idx < length; idx++)
344 CAManagerACData_t *curData = (CAManagerACData_t *) u_arraylist_get(g_deviceACDataList,
348 OIC_LOG(ERROR, TAG, "curData is null");
349 (*env)->ReleaseStringUTFChars(env, jaddress, address);
350 oc_mutex_unlock(g_deviceACDataListMutex);
351 return CA_STATUS_FAILED;
354 const char* setAddress = (*env)->GetStringUTFChars(env, curData->address, NULL);
357 OIC_LOG(ERROR, TAG, "setAddress is null");
358 (*env)->ReleaseStringUTFChars(env, jaddress, address);
359 oc_mutex_unlock(g_deviceACDataListMutex);
360 return CA_STATUS_FAILED;
363 if (!strcmp(setAddress, address))
365 OIC_LOG_V(DEBUG, TAG, "address : [%s], isAutoConnecting : %d", address,
366 curData->isAutoConnecting);
367 *flag = curData->isAutoConnecting;
368 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
369 (*env)->ReleaseStringUTFChars(env, jaddress, address);
370 oc_mutex_unlock(g_deviceACDataListMutex);
373 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
376 OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in list", address);
377 (*env)->ReleaseStringUTFChars(env, jaddress, address);
378 oc_mutex_unlock(g_deviceACDataListMutex);
380 return CA_STATUS_FAILED;
383 bool CAManagerSetAutoConnectingFlag(JNIEnv *env, jstring jaddress, bool flag)
385 OIC_LOG(DEBUG, TAG, "CAManagerSetAutoConnectingFlag");
386 VERIFY_NON_NULL_RET(env, TAG, "env", false);
387 VERIFY_NON_NULL_RET(jaddress, TAG, "jaddress", false);
389 oc_mutex_lock(g_deviceACDataListMutex);
391 const char* address = (*env)->GetStringUTFChars(env, jaddress, NULL);
394 OIC_LOG(ERROR, TAG, "address is null");
395 oc_mutex_unlock(g_deviceACDataListMutex);
399 size_t length = u_arraylist_length(g_deviceACDataList);
400 for (size_t idx = 0; idx < length; idx++)
402 CAManagerACData_t *curData = (CAManagerACData_t *) u_arraylist_get(g_deviceACDataList,
406 OIC_LOG(ERROR, TAG, "curData is null");
407 (*env)->ReleaseStringUTFChars(env, jaddress, address);
408 oc_mutex_unlock(g_deviceACDataListMutex);
412 const char* setAddress = (*env)->GetStringUTFChars(env, curData->address, NULL);
415 OIC_LOG(ERROR, TAG, "address is null");
416 (*env)->ReleaseStringUTFChars(env, jaddress, address);
417 oc_mutex_unlock(g_deviceACDataListMutex);
421 if (!strcmp(setAddress, address))
423 OIC_LOG_V(DEBUG, TAG, "isAutoConnecting flag of [%s] is set to %d", address,
424 curData->isAutoConnecting);
425 curData->isAutoConnecting = flag;
426 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
427 (*env)->ReleaseStringUTFChars(env, jaddress, address);
428 oc_mutex_unlock(g_deviceACDataListMutex);
431 (*env)->ReleaseStringUTFChars(env, curData->address, setAddress);
434 OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in list", address);
435 (*env)->ReleaseStringUTFChars(env, jaddress, address);
436 oc_mutex_unlock(g_deviceACDataListMutex);
441 size_t CAManagerGetACDataLength()
443 return u_arraylist_length(g_deviceACDataList);
446 void CAManagerSetBTRecovery(bool flag)
448 g_isBTRecovery = flag;
449 OIC_LOG_V(DEBUG, TAG, "BT recovery flag is set to %d", g_isBTRecovery);
452 bool CAManagerIsRecoveryFlagSet()
454 return g_isBTRecovery;