4 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
22 #include <dbus/dbus-glib-lowlevel.h>
23 #include <dbus/dbus-glib.h>
24 #include <dbus/dbus.h>
31 #include "bluetooth-api.h"
32 #include "bt-service-common.h"
33 #include "bt-service-agent.h"
35 static DBusGConnection *system_conn;
36 static DBusGConnection *session_conn;
37 static DBusGProxy *manager_proxy;
38 static DBusGProxy *adapter_proxy;
40 static DBusGProxy *__bt_init_manager_proxy(void)
46 if (system_conn == NULL) {
47 system_conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL);
48 retv_if(system_conn == NULL, NULL);
51 proxy = dbus_g_proxy_new_for_name(system_conn, BT_BLUEZ_NAME,
52 BT_MANAGER_PATH, BT_MANAGER_INTERFACE);
54 retv_if(proxy == NULL, NULL);
56 manager_proxy = proxy;
61 static DBusGProxy *__bt_init_adapter_proxy(void)
63 DBusGProxy *manager_proxy;
65 char *adapter_path = NULL;
69 if (system_conn == NULL) {
70 system_conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL);
71 retv_if(system_conn == NULL, NULL);
74 manager_proxy = _bt_get_manager_proxy();
75 retv_if(manager_proxy == NULL, NULL);
77 if (!dbus_g_proxy_call(manager_proxy, "DefaultAdapter", NULL,
78 G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH,
79 &adapter_path, G_TYPE_INVALID)) {
80 BT_ERR("Fait to get DefaultAdapter");
84 adapter_path = g_strdup(adapter_path);
85 retv_if(adapter_path == NULL, NULL);
87 proxy = dbus_g_proxy_new_for_name(system_conn, BT_BLUEZ_NAME,
88 adapter_path, BT_ADAPTER_INTERFACE);
92 retv_if(proxy == NULL, NULL);
94 adapter_proxy = proxy;
99 DBusGConnection *__bt_init_system_gconn(void)
103 if (system_conn == NULL)
104 system_conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL);
109 DBusGConnection *__bt_init_session_conn(void)
111 if (session_conn == NULL)
112 session_conn = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
117 DBusGConnection *_bt_get_session_gconn(void)
119 return (session_conn) ? session_conn : __bt_init_session_conn();
122 DBusGConnection *_bt_get_system_gconn(void)
124 return (system_conn) ? system_conn : __bt_init_system_gconn();
127 DBusConnection *_bt_get_system_conn(void)
129 DBusGConnection *g_conn;
131 if (system_conn == NULL) {
132 g_conn = __bt_init_system_gconn();
134 g_conn = system_conn;
137 retv_if(g_conn == NULL, NULL);
139 return dbus_g_connection_get_connection(g_conn);
142 DBusGProxy *_bt_get_manager_proxy(void)
144 return (manager_proxy) ? manager_proxy : __bt_init_manager_proxy();
147 DBusGProxy *_bt_get_adapter_proxy(void)
149 return (adapter_proxy) ? adapter_proxy : __bt_init_adapter_proxy();
152 char *_bt_get_adapter_path(void)
154 char *adapter_path = NULL;
158 proxy = _bt_get_manager_proxy();
160 if (!dbus_g_proxy_call(proxy, "DefaultAdapter", &err,
161 G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH,
162 &adapter_path, G_TYPE_INVALID)) {
164 BT_ERR("Getting DefaultAdapter failed: [%s]\n",
174 void _bt_deinit_bluez_proxy(void)
177 g_object_unref(manager_proxy);
178 manager_proxy = NULL;
182 g_object_unref(adapter_proxy);
183 adapter_proxy = NULL;
187 void _bt_deinit_proxys(void)
190 _bt_deinit_bluez_proxy();
193 dbus_g_connection_unref(system_conn);
198 dbus_g_connection_unref(session_conn);
204 void _bt_convert_device_path_to_address(const char *device_path,
205 char *device_address)
207 char address[BT_ADDRESS_STRING_SIZE] = { 0 };
210 ret_if(device_path == NULL);
211 ret_if(device_address == NULL);
213 dev_addr = strstr(device_path, "dev_");
214 if (dev_addr != NULL) {
217 g_strlcpy(address, dev_addr, sizeof(address));
219 while ((pos = strchr(address, '_')) != NULL) {
223 g_strlcpy(device_address, address, BT_ADDRESS_STRING_SIZE);
228 void _bt_convert_addr_string_to_type(unsigned char *addr,
234 ret_if(address == NULL);
235 ret_if(addr == NULL);
237 for (i = 0; i < BT_ADDRESS_LENGTH_MAX; i++) {
238 addr[i] = strtol(address, &ptr, 16);
248 void _bt_convert_addr_type_to_string(char *address,
251 ret_if(address == NULL);
252 ret_if(addr == NULL);
254 snprintf(address, BT_ADDRESS_STRING_SIZE,
255 "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
256 addr[0], addr[1], addr[2],
257 addr[3], addr[4], addr[5]);
260 void _bt_print_device_address_t(const bluetooth_device_address_t *addr)
262 BT_DBG("%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n", addr->addr[0], addr->addr[1], addr->addr[2],
263 addr->addr[3], addr->addr[4], addr->addr[5]);
266 void _bt_divide_device_class(bluetooth_device_class_t *device_class,
269 ret_if(device_class == NULL);
271 device_class->major_class = (unsigned short)(cod & 0x00001F00) >> 8;
272 device_class->minor_class = (unsigned short)((cod & 0x000000FC));
273 device_class->service_class = (unsigned long)((cod & 0x00FF0000));
275 if (cod & 0x002000) {
276 device_class->service_class |=
277 BLUETOOTH_DEVICE_SERVICE_CLASS_LIMITED_DISCOVERABLE_MODE;
281 void _bt_free_device_info(bt_remote_dev_info_t *dev_info)
285 ret_if(dev_info == NULL);
287 g_free(dev_info->address);
288 g_free(dev_info->name);
290 if (dev_info->uuids) {
291 for (i = 0; dev_info->uuids[i] != NULL; i++)
292 g_free(dev_info->uuids[i]);
294 g_free(dev_info->uuids);
300 int _bt_register_osp_server_in_agent(int type, char *uuid)
302 if (!_bt_agent_register_osp_server( type, uuid))
303 return BLUETOOTH_ERROR_INTERNAL;
305 return BLUETOOTH_ERROR_NONE;
308 int _bt_unregister_osp_server_in_agent(int type, char *uuid)
310 if (!_bt_agent_unregister_osp_server( type, uuid))
311 return BLUETOOTH_ERROR_INTERNAL;
313 return BLUETOOTH_ERROR_NONE;
316 int _bt_set_socket_non_blocking(int socket_fd)
318 /* Set Nonblocking */
321 arg = fcntl(socket_fd, F_GETFL);
326 if (arg & O_NONBLOCK) {
327 BT_ERR("Already Non-blocking \n");
332 if (fcntl(socket_fd, F_SETFL, arg) < 0)
335 return BLUETOOTH_ERROR_NONE;
338 int _bt_set_non_blocking_tty(int sk)
340 struct termios ti = {0,};
343 err = _bt_set_socket_non_blocking(sk);
346 BT_ERR("Error in set non blocking!\n");
350 tcflush(sk, TCIOFLUSH);
352 /* Switch tty to RAW mode */
354 tcsetattr(sk, TCSANOW, &ti);
356 return BLUETOOTH_ERROR_NONE;
359 gboolean _bt_is_headset_class(int dev_class)
361 gboolean is_headset = FALSE;
363 switch ((dev_class & 0x1f00) >> 8) {
365 switch ((dev_class & 0xfc) >> 2) {
376 case 0x0c: /* Video Camera */
377 case 0x0d: /* Camcorder */
380 /* Other audio device */