summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVinicius Costa Gomes <vinicius.gomes@openbossa.org>2013-01-23 15:27:56 -0300
committerDenis Kenzior <denkenz@gmail.com>2013-01-23 14:19:53 -0600
commita90f0441d62cbdde0cbd75f5ce8999106e33d860 (patch)
tree7ee872bb28e822e0546531a91f8509ed39488671
parent71986b67a3857645a1d1f6647b29ed713c2f165f (diff)
downloadofono-a90f0441d62cbdde0cbd75f5ce8999106e33d860.tar.bz2
hfp_hf_bluez5: Handle NewConnection from BlueZ
Parse the essential arguments in the message, in this case only the file descriptor, and register the modem if it is not already registered. This is necessary because in some cases, we may receive a NewConnection call, and the SDP process is still taking place.
-rw-r--r--plugins/hfp_hf_bluez5.c51
1 files changed, 48 insertions, 3 deletions
diff --git a/plugins/hfp_hf_bluez5.c b/plugins/hfp_hf_bluez5.c
index 91bafafc..d4f158e9 100644
--- a/plugins/hfp_hf_bluez5.c
+++ b/plugins/hfp_hf_bluez5.c
@@ -24,6 +24,8 @@
#endif
#include <errno.h>
+#include <unistd.h>
+
#include <glib.h>
#include <gdbus.h>
@@ -124,11 +126,54 @@ static struct ofono_modem_driver hfp_driver = {
static DBusMessage *profile_new_connection(DBusConnection *conn,
DBusMessage *msg, void *user_data)
{
+ struct ofono_modem *modem;
+ DBusMessageIter iter;
+ GDBusProxy *proxy;
+ DBusMessageIter entry;
+ const char *device, *alias;
+ int fd;
+
DBG("Profile handler NewConnection");
- return g_dbus_create_error(msg, BLUEZ_ERROR_INTERFACE
- ".NotImplemented",
- "Implementation not provided");
+ if (dbus_message_iter_init(msg, &entry) == FALSE)
+ goto invalid;
+
+ if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_OBJECT_PATH)
+ goto invalid;
+
+ dbus_message_iter_get_basic(&entry, &device);
+
+ proxy = g_hash_table_lookup(devices_proxies, device);
+ if (proxy == NULL)
+ return g_dbus_create_error(msg, BLUEZ_ERROR_INTERFACE
+ ".Rejected",
+ "Unknown Bluetooth device");
+
+ g_dbus_proxy_get_property(proxy, "Alias", &iter);
+
+ dbus_message_iter_get_basic(&iter, &alias);
+
+ dbus_message_iter_next(&entry);
+ if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_UNIX_FD)
+ goto invalid;
+
+ dbus_message_iter_get_basic(&entry, &fd);
+ if (fd < 0)
+ goto invalid;
+
+ modem = modem_register(device, alias);
+ if (modem == NULL) {
+ close(fd);
+ return g_dbus_create_error(msg, BLUEZ_ERROR_INTERFACE
+ ".Rejected",
+ "Could not register HFP modem");
+ }
+
+ return NULL;
+
+invalid:
+ return g_dbus_create_error(msg, BLUEZ_ERROR_INTERFACE ".Rejected",
+ "Invalid arguments in method call");
}
static DBusMessage *profile_release(DBusConnection *conn,