2 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing,
11 * software distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <bluetooth.h>
21 #include "bt-main-ug.h"
24 #include "bt-string-define.h"
25 #include "bt-net-connection.h"
27 /**********************************************************************
29 ***********************************************************************/
31 gboolean _bt_util_get_service_mask_from_uuid_list(char **uuids,
33 bt_service_class_t *service_mask_list)
38 unsigned int service = 0;
40 bt_service_class_t service_mask = 0;
42 retvm_if(uuids == NULL, FALSE,
43 "Invalid argument: service_list_array is NULL\n");
45 BT_DBG("no_of_service = %d\n", no_of_service);
47 for (i = 0; i < no_of_service; i++) {
48 parts = g_strsplit(uuids[i], "-", -1);
50 if (parts == NULL || parts[0] == NULL) {
55 service = g_ascii_strtoull(parts[0], NULL, 16);
59 case BT_SPP_PROFILE_UUID:
60 service_mask |= BT_SC_SPP_SERVICE_MASK;
63 case BT_LAP_PROFILE_UUID:
64 service_mask |= BT_SC_LAP_SERVICE_MASK;
67 case BT_DUN_PROFILE_UUID:
68 service_mask |= BT_SC_DUN_SERVICE_MASK;
71 case BT_OBEX_IR_MC_SYNC_SERVICE_UUID:
72 service_mask |= BT_SC_SYNC_SERVICE_MASK;
75 case BT_OBEX_OBJECT_PUSH_SERVICE_UUID:
76 service_mask |= BT_SC_OPP_SERVICE_MASK;
79 case BT_OBEX_FILE_TRANSFER_UUID:
80 service_mask |= BT_SC_FTP_SERVICE_MASK;
83 case BT_HS_PROFILE_UUID:
84 service_mask |= BT_SC_HSP_SERVICE_MASK;
87 case BT_CTP_PROFILE_UUID:
88 service_mask |= BT_SC_CTP_SERVICE_MASK;
91 case BT_AUDIO_SOURCE_UUID:
92 service_mask |= BT_SC_NONE;
95 case BT_AUDIO_SINK_UUID:
96 service_mask |= BT_SC_A2DP_SERVICE_MASK;
99 case BT_VIDEO_SOURCE_UUID:
100 service_mask |= BT_SC_NONE;
103 case BT_VIDEO_SINK_UUID:
104 service_mask |= BT_SC_NONE;
107 case BT_AV_REMOTE_CONTROL_TARGET_UUID:
108 service_mask |= BT_SC_NONE;
111 case BT_ADVANCED_AUDIO_PROFILE_UUID:
112 service_mask |= BT_SC_A2DP_SERVICE_MASK;
115 case BT_AV_REMOTE_CONTROL_UUID:
116 service_mask |= BT_SC_AVRCP_SERVICE_MASK;
119 case BT_ICP_PROFILE_UUID:
120 service_mask |= BT_SC_ICP_SERVICE_MASK;
123 case BT_FAX_PROFILE_UUID:
124 service_mask |= BT_SC_FAX_SERVICE_MASK;
127 case BT_HEADSET_AG_SERVICE_UUID:
128 service_mask |= BT_SC_NONE; /* BT_SC_HSP_SERVICE_MASK */
131 case BT_PAN_PANU_PROFILE_UUID:
132 service_mask |= BT_SC_PANU_SERVICE_MASK;
135 case BT_PAN_NAP_PROFILE_UUID:
136 service_mask |= BT_SC_NAP_SERVICE_MASK;
139 case BT_PAN_GN_PROFILE_UUID:
140 service_mask |= BT_SC_GN_SERVICE_MASK;
143 case BT_REFERENCE_PRINTING:
144 service_mask |= BT_SC_NONE;
147 case BT_OBEX_IMAGING_UUID:
148 service_mask |= BT_SC_NONE;
151 case BT_OBEX_IMAGING_RESPONDER_UUID:
152 service_mask |= BT_SC_BIP_SERVICE_MASK;
155 case BT_HF_PROFILE_UUID:
156 service_mask |= BT_SC_HFP_SERVICE_MASK;
159 case BT_HFG_PROFILE_UUID:
160 service_mask |= BT_SC_NONE;
163 case BT_DIRECT_PRINTING_REFERENCE_OBJ_UUID:
164 service_mask |= BT_SC_NONE;
167 case BT_BASIC_PRINTING:
168 service_mask |= BT_SC_NONE;
171 case BT_HID_PROFILE_UUID:
172 service_mask |= BT_SC_HID_SERVICE_MASK;
175 case BT_SIM_ACCESS_PROFILE_UUID:
176 service_mask |= BT_SC_SAP_SERVICE_MASK;
179 case BT_OBEX_PBA_PROFILE_UUID:
180 service_mask |= BT_SC_PBAP_SERVICE_MASK;
183 case BT_OBEX_BPPS_PROFILE_UUID:
184 service_mask |= BT_SC_BPP_SERVICE_MASK;
187 case BT_PNP_INFORMATION_UUID:
188 service_mask |= BT_SC_NONE;
191 case BT_OBEX_PRINTING_STATUS_UUID:
192 service_mask |= BT_SC_BPP_SERVICE_MASK;
195 case BT_HCR_PROFILE_UUID:
196 service_mask |= BT_SC_NONE;
199 case BT_OBEX_SYNCML_TRANSFER_UUID:
200 service_mask |= BT_SC_NONE;
209 *service_mask_list = service_mask;
210 BT_DBG("service_mask = %x, service_mask_lis = %x\n", service_mask,
217 int _bt_util_parse_file_list(const char *bundle_txt, char ***filelist,
221 retv_if(bundle_txt == NULL || filelist == NULL, BT_UG_FAIL);
227 param = (char *)bundle_txt;
228 while (((token = strstr(param, "?")) != NULL) && i < number_of_files) {
230 *filelist[i] = param;
231 BT_DBG("File [%d] [%s]\n", i, *filelist[i]);
235 if (i == (number_of_files - 1)) {
236 *filelist[i] = param;
237 BT_DBG("File [%d] [%s]\n", i, *filelist[i]);
239 BT_DBG("Not match : [%d] / [%d]\n", number_of_files, i);
244 return BT_UG_ERROR_NONE;
247 void _bt_util_set_value(const char *req, unsigned int *search_type,
248 unsigned int *op_mode)
252 ret_if(search_type == NULL);
253 ret_if(op_mode == NULL);
255 if (!strcasecmp(req, "send") || !strcasecmp(req, "browse")) {
256 *search_type = BT_COD_SC_OBJECT_TRANSFER;
257 *op_mode = BT_LAUNCH_SEND_FILE;
258 } else if (!strcasecmp(req, "print")) {
259 *search_type = BT_DEVICE_MAJOR_MASK_IMAGING;
260 *op_mode = BT_LAUNCH_PRINT_IMAGE;
261 } else if (!strcasecmp(req, "call") || !strcasecmp(req, "sound")) {
262 *search_type = BT_DEVICE_MAJOR_MASK_AUDIO;
263 *op_mode = BT_LAUNCH_CONNECT_HEADSET;
264 } else if (!strcasecmp(req, "nfc")) {
265 *search_type = BT_DEVICE_MAJOR_MASK_MISC;
266 *op_mode = BT_LAUNCH_USE_NFC;
267 } else if (!strcasecmp(req, "pick")) {
268 *search_type = BT_DEVICE_MAJOR_MASK_MISC;
269 *op_mode = BT_LAUNCH_PICK;
270 } else if (!strcasecmp(req, "visibility")) {
271 *search_type = BT_DEVICE_MAJOR_MASK_MISC;
272 *op_mode = BT_LAUNCH_VISIBILITY;
274 *search_type = BT_DEVICE_MAJOR_MASK_MISC;
275 *op_mode = BT_LAUNCH_NORMAL;
283 gboolean _bt_util_store_get_value(const char *key, bt_store_type_t store_type,
284 unsigned int size, void *value)
287 retv_if(value == NULL, FALSE);
292 gboolean *boolean = FALSE;
295 switch (store_type) {
296 case BT_STORE_BOOLEAN:
297 boolean = (gboolean *)value;
298 ret = vconf_get_bool(key, &int_value);
300 BT_DBG("Get bool is failed\n");
304 *boolean = (int_value != FALSE);
307 intval = (int *)value;
308 ret = vconf_get_int(key, intval);
310 BT_DBG("Get int is failed\n");
315 case BT_STORE_STRING:
316 str = vconf_get_str(key);
318 BT_DBG("Get string is failed\n");
322 strncpy((char *)value, str, size - 1);
327 BT_DBG("Unknown Store Type\n");
335 void _bt_util_set_phone_name(void)
337 char *phone_name = NULL;
340 phone_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
344 if (strlen(phone_name) != 0) {
345 if (!g_utf8_validate(phone_name, -1, (const char **)&ptr))
348 bt_adapter_set_name(phone_name);
354 int _bt_util_get_phone_name(char *phone_name, int size)
357 retv_if(phone_name == NULL, BT_UG_FAIL);
359 if (_bt_util_store_get_value(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
360 BT_STORE_STRING, size,
361 (void *)phone_name) < 0) {
362 g_strlcpy(phone_name, BT_DEFAULT_PHONE_NAME, size);
366 return BT_UG_ERROR_NONE;
369 int _bt_util_get_timeout_string(int timeout, char *buf, int size)
372 retv_if(buf == NULL, BT_UG_FAIL);
376 g_strlcpy(buf, BT_STR_OFF, size);
379 g_strlcpy(buf, BT_STR_TWO_MINUTES, size);
381 case BT_FIVE_MINUTES:
382 g_strlcpy(buf, BT_STR_FIVE_MINUTES, size);
385 g_strlcpy(buf, BT_STR_ONE_HOUR, size);
388 g_strlcpy(buf, BT_STR_ALWAYS_ON, size);
391 g_strlcpy(buf, BT_STR_OFF, size);
396 return BT_UG_ERROR_NONE;
399 int _bt_util_get_timeout_value(int index)
410 timeout = BT_TWO_MINUTES;
413 timeout = BT_FIVE_MINUTES;
416 timeout = BT_ONE_HOUR;
419 timeout = BT_ALWAYS_ON;
430 int _bt_util_get_timeout_index(int timeout)
443 case BT_FIVE_MINUTES:
457 BT_DBG("index: %d", index);
463 gboolean _bt_util_is_battery_low(void)
470 if (vconf_get_int(VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW, (void *)&charging))
471 BT_DBG("Get the battery charging status fail");
476 BT_DBG("charging: %d", charging);
478 if (vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, (void *)&value))
479 BT_DBG("Get the battery low status fail");
481 if (value <= VCONFKEY_SYSMAN_BAT_POWER_OFF)
488 gboolean _bt_util_is_flight_mode(void)
494 if (vconf_get_bool(VCONFKEY_SETAPPL_FLIGHT_MODE_BOOL, (void *)&mode)) {
495 BT_DBG("Get the flight mode fail");
499 BT_DBG("flight mode: %d", mode);
505 void _bt_util_show_device_list(Eina_List *list)
510 bt_dev_t *item = NULL;
513 retm_if(list == NULL, "Invalid argument: list is NULL\n");
515 EINA_LIST_FOREACH(list, l, item) {
517 BT_DBG("count: %d", index++);
518 BT_DBG("%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
519 item->bd_addr[0], item->bd_addr[1],
520 item->bd_addr[2], item->bd_addr[3],
521 item->bd_addr[4], item->bd_addr[5]);
522 BT_DBG("name: %s", item->name);
530 /* status - 0 : No operation, 1 : Activate , 2 : Deactivate, 3 : Search Test*/
531 /* run_type - No window change, 1 : Top window, 2 : Background*/
532 void _bt_util_launch_bt_service(int status, int run_type)
537 char status_val[5] = { 0, };
538 char run_type_val[5] = { 0, };
540 snprintf(status_val, sizeof(status_val), "%d", status);
541 snprintf(run_type_val, sizeof(run_type_val), "%d", run_type);
543 BT_DBG("status: %s, run_type: %s", status_val, run_type_val);
545 kb = bundle_create();
548 bundle_add(kb, "launch-type", "setstate");
549 bundle_add(kb, "status", status_val);
550 bundle_add(kb, "run-type", run_type_val);
552 aul_launch_app("com.samsung.bluetooth", kb);
559 void _bt_util_addr_type_to_addr_string(char *address,
564 ret_if(address == NULL);
565 ret_if(addr == NULL);
567 snprintf(address, BT_ADDRESS_STR_LEN, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", addr[0],
568 addr[1], addr[2], addr[3], addr[4], addr[5]);
573 void _bt_util_addr_type_to_addr_result_string(char *address,
578 ret_if(address == NULL);
579 ret_if(addr == NULL);
581 snprintf(address, BT_ADDRESS_STR_LEN, "%2.2X-%2.2X-%2.2X-%2.2X-%2.2X-%2.2X", addr[0],
582 addr[1], addr[2], addr[3], addr[4], addr[5]);
587 void _bt_util_addr_type_to_addr_net_string(char *address,
592 ret_if(address == NULL);
593 ret_if(addr == NULL);
595 snprintf(address, BT_ADDRESS_STR_LEN, "%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X", addr[0],
596 addr[1], addr[2], addr[3], addr[4], addr[5]);
601 void _bt_util_addr_string_to_addr_type(unsigned char *addr,
609 if (!address || !addr)
612 for (i = 0; i < BT_ADDRESS_LENGTH_MAX; i++) {
613 addr[i] = strtol(address, &ptr, 16);
616 BT_DBG("Unexpected string\n");
627 void _bt_util_convert_time_to_string(unsigned int remain_time,
634 ret_if(remain_time > BT_TIMEOUT_MAX);
635 ret_if(size < BT_EXTRA_STR_LEN);
639 second = remain_time % 60;
642 minute = remain_time / 60;
644 snprintf(buf, size, "%d:%02d", minute, second);
649 void _bt_util_launch_no_event(void *data, void *obj, void *event)
653 ("End key is pressed. But there is no action to process in popup");
657 void _bt_util_set_list_disabled(Evas_Object *genlist, Eina_Bool disable)
659 Elm_Object_Item *item = NULL;
660 Elm_Object_Item *next = NULL;
662 item = elm_genlist_first_item_get(genlist);
664 while (item != NULL) {
665 next = elm_genlist_item_next_get(item);
666 elm_object_item_disabled_set(item, disable);
667 elm_genlist_item_update(item);
672 void _bt_util_free_device_uuids(bt_dev_t *item)
676 ret_if(item == NULL);
679 for (i = 0; item->uuids[i] != NULL; i++)
680 g_free(item->uuids[i]);
687 void _bt_util_free_device_item(bt_dev_t *item)
689 ret_if(item == NULL);
691 _bt_util_free_device_uuids(item);
692 _bt_unset_profile_state_changed_cb(item->net_profile);