OSDN Git Service

Add an API to set the link timeout.
authorJaikumar Ganesh <jaikumar@google.com>
Tue, 9 Mar 2010 23:35:00 +0000 (15:35 -0800)
committerJaikumar Ganesh <jaikumar@google.com>
Wed, 10 Mar 2010 00:46:11 +0000 (16:46 -0800)
Change-Id: I5abd8fc37e20a7916e84e624f883c7a1987b0587

src/adapter.c
src/device.c
src/device.h

index 9e9bacd..bb2f320 100644 (file)
@@ -1735,7 +1735,6 @@ static DBusMessage *add_rfcomm_service_record(DBusConnection *conn,
                                ERROR_INTERFACE ".Failed",
                                "Failed to register sdp record");
 
-       printf("npelly new handle %X\n", record->handle);
        reply = dbus_message_new_method_return(msg);
        dbus_message_append_args(reply,
                        DBUS_TYPE_UINT32, &record->handle,
@@ -1763,6 +1762,49 @@ static DBusMessage *remove_service_record(DBusConnection *conn,
        return dbus_message_new_method_return(msg);
 }
 
+static DBusMessage *set_link_timeout(DBusConnection *conn,
+                                       DBusMessage *msg, void *data)
+{
+       struct btd_adapter *adapter = data;
+        struct btd_device *device;
+       const char *path;
+       GSList *l;
+       uint32_t num_slots;
+        int dd, err;
+
+       if (!dbus_message_get_args(msg, NULL,
+                       DBUS_TYPE_OBJECT_PATH, &path,
+                       DBUS_TYPE_UINT32, &num_slots,
+                       DBUS_TYPE_INVALID))
+               return invalid_args(msg);
+
+        l = g_slist_find_custom(adapter->devices,
+                        path, (GCompareFunc) device_path_cmp);
+        if (!l)
+                return g_dbus_create_error(msg,
+                                ERROR_INTERFACE ".DoesNotExist",
+                                "Device does not exist");
+       device = l->data;
+       dd = hci_open_dev(adapter->dev_id);
+
+       if (dd < 0) {
+               err = -errno;
+               goto fail;
+       }
+
+       err = hci_write_link_supervision_timeout(dd,
+                       htobs(device_get_handle(device)), htobs(num_slots), 1000);
+       hci_close_dev(dd);
+
+       if (err < 0) {
+               err = -errno;
+               goto fail;
+       }
+       return dbus_message_new_method_return(msg);
+fail:
+       return failed_strerror(msg, errno);
+}
+
 static GDBusMethodTable adapter_methods[] = {
        { "GetProperties",      "",     "a{sv}",get_properties          },
        { "SetProperty",        "sv",   "",     set_property,
@@ -1788,6 +1830,7 @@ static GDBusMethodTable adapter_methods[] = {
        { "UnregisterAgent",    "o",    "",     unregister_agent        },
        { "AddRfcommServiceRecord",     "sttq", "u",    add_rfcomm_service_record },
        { "RemoveServiceRecord",        "u",    "",     remove_service_record },
+       { "SetLinkTimeout",     "ou",   "",     set_link_timeout        },
        { }
 };
 
index 2aaf5b8..5328db9 100644 (file)
@@ -857,6 +857,11 @@ gboolean device_has_connection(struct btd_device *device, uint16_t handle)
        return (handle == device->handle);
 }
 
+uint16_t device_get_handle(struct btd_device *device)
+{
+       return device->handle;
+}
+
 guint device_add_disconnect_watch(struct btd_device *device,
                                disconnect_watch watch, void *user_data,
                                GDestroyNotify destroy)
index 7f297c1..c6677dc 100644 (file)
@@ -80,6 +80,7 @@ void device_set_authorizing(struct btd_device *device, gboolean auth);
 void device_set_renewed_key(struct btd_device *device, gboolean renewed);
 void device_add_connection(struct btd_device *device, DBusConnection *conn,
                                uint16_t handle);
+uint16_t device_get_handle(struct btd_device *device);
 void device_remove_connection(struct btd_device *device, DBusConnection *conn,
                                uint16_t handle);
 gboolean device_has_connection(struct btd_device *device, uint16_t handle);