diff options
author | Paulo Borges <paulo.borges@openbossa.org> | 2013-03-20 19:26:30 -0300 |
---|---|---|
committer | Daniel Wagner <daniel.wagner@bmw-carit.de> | 2013-03-24 13:18:54 +0100 |
commit | 63f92d60b50dde964a705d4ffa531d2ad928507c (patch) | |
tree | 39be97cd45e60955fee7217d18f36384344e0b8b /dundee/bluetooth.c | |
parent | 2864624c56dd79eaf8a7122a3dbde1b4c85d8657 (diff) | |
download | ofono-63f92d60b50dde964a705d4ffa531d2ad928507c.tar.bz2 |
dundee: Rename dundee BlueZ 4 support
The BlueZ 4 support file for dundee has now been renamed to
bluez4.c to make it easier to add a BlueZ 5 support file.
Diffstat (limited to 'dundee/bluetooth.c')
-rw-r--r-- | dundee/bluetooth.c | 297 |
1 files changed, 0 insertions, 297 deletions
diff --git a/dundee/bluetooth.c b/dundee/bluetooth.c deleted file mode 100644 index 58355d31..00000000 --- a/dundee/bluetooth.c +++ /dev/null @@ -1,297 +0,0 @@ -/* - * oFono - Open Source Telephony - * - * Copyright (C) 2008-2012 Intel Corporation. All rights reserved. - * Copyright (C) 2012 BMW Car IT GmbH. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <string.h> -#include <errno.h> -#include <sys/socket.h> - -#include <glib.h> - -#include "plugins/bluez4.h" - -#include "dundee.h" - -static GHashTable *bluetooth_hash; - -struct bluetooth_device { - struct dundee_device *device; - - char *path; - char *address; - char *name; - - int fd; - - DBusPendingCall *call; -}; - -static void bt_disconnect(struct dundee_device *device, - dundee_device_disconnect_cb_t cb, void *data) -{ - struct bluetooth_device *bt = dundee_device_get_data(device); - - DBG("%p", bt); - - shutdown(bt->fd, SHUT_RDWR); - - CALLBACK_WITH_SUCCESS(cb, data); -} - -static void bt_connect_reply(DBusPendingCall *call, gpointer user_data) -{ - struct cb_data *cbd = user_data; - dundee_device_connect_cb_t cb = cbd->cb; - struct bluetooth_device *bt = cbd->user; - DBusMessage *reply; - DBusError derr; - int fd; - - DBG("%p", bt); - - reply = dbus_pending_call_steal_reply(call); - - bt->call = NULL; - - dbus_error_init(&derr); - if (dbus_set_error_from_message(&derr, reply)) { - DBG("Connection to bt serial returned with error: %s, %s", - derr.name, derr.message); - - dbus_error_free(&derr); - - CALLBACK_WITH_FAILURE(cb, -1, cbd->data); - goto done; - } - - dbus_message_get_args(reply, NULL, DBUS_TYPE_UNIX_FD, &fd, - DBUS_TYPE_INVALID); - - DBG("%p fd %d", bt, fd); - - if (fd < 0) { - CALLBACK_WITH_FAILURE(cb, -1, cbd->data); - goto done; - } - - bt->fd = fd; - - CALLBACK_WITH_SUCCESS(cb, fd, cbd->data); - -done: - dbus_message_unref(reply); - g_free(cbd); -} - -static void bt_connect(struct dundee_device *device, - dundee_device_connect_cb_t cb, void *data) -{ - struct bluetooth_device *bt = dundee_device_get_data(device); - struct cb_data *cbd = cb_data_new(cb, data); - char *profile = "dun"; - int status; - - DBG("%p", bt); - - cbd->user = bt; - - status = bluetooth_send_with_reply(bt->path, - BLUEZ_SERIAL_INTERFACE, "ConnectFD", - &bt->call, bt_connect_reply, - cbd, NULL, DBUS_TIMEOUT, - DBUS_TYPE_STRING, &profile, - DBUS_TYPE_INVALID); - if (status == 0) - return; - - g_free(cbd); - - CALLBACK_WITH_FAILURE(cb, -1, cbd->data); -} - -struct dundee_device_driver bluetooth_driver = { - .name = "bluetooth", - .connect = bt_connect, - .disconnect = bt_disconnect, -}; - -static int bt_probe(const char *path, const char *dev_addr, - const char *adapter_addr, const char *alias) -{ - struct bluetooth_device *bt; - struct dundee_device *device; - char buf[256]; - - DBG(""); - - /* We already have this device in our hash, ignore */ - if (g_hash_table_lookup(bluetooth_hash, path) != NULL) - return -EALREADY; - - ofono_info("Using device: %s, devaddr: %s, adapter: %s", - path, dev_addr, adapter_addr); - - strcpy(buf, "dun/"); - bluetooth_create_path(dev_addr, adapter_addr, buf + 4, sizeof(buf) - 4); - - bt = g_try_new0(struct bluetooth_device, 1); - if (bt == NULL) - return -ENOMEM; - - DBG("%p", bt); - - device = dundee_device_create(&bluetooth_driver); - if (device == NULL) - goto free; - - dundee_device_set_data(device, bt); - - bt->path = g_strdup(path); - if (bt->path == NULL) - goto free; - - bt->address = g_strdup(dev_addr); - if (bt->address == NULL) - goto free; - - bt->name = g_strdup(alias); - if (bt->name == NULL) - goto free; - - dundee_device_set_name(device, bt->name); - - if (dundee_device_register(device) < 0) { - g_free(device); - goto free; - } - - bt->device = device; - g_hash_table_insert(bluetooth_hash, g_strdup(path), bt); - - return 0; - -free: - g_free(bt->path); - g_free(bt->address); - g_free(bt->name); - g_free(bt); - - return -ENOMEM; -} - -static void destroy_device(gpointer user) -{ - struct bluetooth_device *bt = user; - - DBG("%p", bt); - - if (bt->call != NULL) - dbus_pending_call_cancel(bt->call); - - g_free(bt->path); - g_free(bt->address); - - g_free(bt); -} - -static gboolean bt_remove_device(gpointer key, gpointer value, - gpointer user_data) -{ - struct bluetooth_device *bt = value; - const char *path = key; - const char *prefix = user_data; - - DBG("%p", bt); - - if (prefix && g_str_has_prefix(path, prefix) == FALSE) - return FALSE; - - dundee_device_unregister(bt->device); - - return TRUE; -} - -static void bt_remove(const char *prefix) -{ - DBG("%s", prefix); - - if (bluetooth_hash == NULL) - return; - - g_hash_table_foreach_remove(bluetooth_hash, bt_remove_device, - (gpointer) prefix); -} - -static void bt_set_alias(const char *path, const char *alias) -{ - struct bluetooth_device *bt; - - DBG(""); - - if (path == NULL || alias == NULL) - return; - - bt = g_hash_table_lookup(bluetooth_hash, path); - if (bt == NULL) - return; - - g_free(bt->name); - bt->name = g_strdup(alias); - - dundee_device_set_name(bt->device, bt->name); -} - -static struct bluetooth_profile dun_profile = { - .name = "dun_dt", - .probe = bt_probe, - .remove = bt_remove, - .set_alias = bt_set_alias, -}; - -int __dundee_bluetooth_init(void) -{ - int err; - - DBG(""); - - err = bluetooth_register_uuid(DUN_GW_UUID, &dun_profile); - if (err < 0) - return err; - - bluetooth_hash = g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, destroy_device); - - return 0; -} - -void __dundee_bluetooth_cleanup(void) -{ - DBG(""); - - bluetooth_unregister_uuid(DUN_GW_UUID); - g_hash_table_destroy(bluetooth_hash); -} |