diff options
Diffstat (limited to 'input')
-rw-r--r-- | input/device.c | 187 | ||||
-rw-r--r-- | input/manager.c | 13 |
2 files changed, 77 insertions, 123 deletions
diff --git a/input/device.c b/input/device.c index 1794cf58..1a8e0eee 100644 --- a/input/device.c +++ b/input/device.c @@ -402,7 +402,7 @@ static void rfcomm_connect_cb(GIOChannel *chan, int err, const bdaddr_t *src, /* Replying to the requestor */ reply = dbus_message_new_method_return(idev->pending_connect); - send_message_and_unref(idev->conn, reply); + g_dbus_send_message(idev->conn, reply); /* Sending the Connected signal */ path = dbus_message_get_path(idev->pending_connect); @@ -545,6 +545,7 @@ static int hidp_connadd(bdaddr_t *src, bdaddr_t *dst, } err = ioctl(ctl, HIDPCONNADD, &req); + cleanup: close(ctl); @@ -580,8 +581,7 @@ static void interrupt_connect_cb(GIOChannel *chan, int err, const bdaddr_t *src, DBUS_TYPE_INVALID); /* Replying to the requestor */ - send_message_and_unref(idev->conn, - dbus_message_new_method_return(idev->pending_connect)); + g_dbus_send_reply(idev->conn, idev->pending_connect, DBUS_TYPE_INVALID); goto cleanup; @@ -698,6 +698,7 @@ static int disconnect(struct device *idev, uint32_t flags) close(ctl); return 0; + fail: err = errno; close(ctl); @@ -736,10 +737,28 @@ static int is_connected(struct device *idev) return 1; } +static inline DBusMessage *in_progress(DBusMessage *msg) +{ + return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress", + "Device connection already in progress"); +} + +static inline DBusMessage *already_connected(DBusMessage *msg) +{ + return g_dbus_create_error(msg, ERROR_INTERFACE ".AlreadyConnected", + "Already connected to a device"); +} + +static inline DBusMessage *connection_attempt_failed(DBusMessage *msg, int err) +{ + return g_dbus_create_error(msg, ERROR_INTERFACE ".ConnectionAttemptFailed", + err ? strerror(err) : "Connection attempt failed"); +} + /* * Input Device methods */ -static DBusHandlerResult device_connect(DBusConnection *conn, +static DBusMessage *device_connect(DBusConnection *conn, DBusMessage *msg, void *data) { struct device *idev = data; @@ -747,11 +766,10 @@ static DBusHandlerResult device_connect(DBusConnection *conn, int err; if (idev->pending_connect) - return error_in_progress(conn, msg, - "Device connection already in progress"); + return in_progress(msg); if (is_connected(idev)) - return error_already_connected(conn, msg); + return already_connected(msg); idev->pending_connect = dbus_message_ref(msg); @@ -763,153 +781,103 @@ static DBusHandlerResult device_connect(DBusConnection *conn, error("Connect failed: %s(%d)", str, err); dbus_message_unref(idev->pending_connect); idev->pending_connect = NULL; - return error_connection_attempt_failed(conn, - msg, err); + return connection_attempt_failed(msg, err); } fake->flags |= FI_FLAG_CONNECTED; - return DBUS_HANDLER_RESULT_HANDLED; + return NULL; } /* HID devices */ - err = bt_l2cap_connect(&idev->src, &idev->dst, L2CAP_PSM_HIDP_CTRL, 0, - control_connect_cb, idev); + err = bt_l2cap_connect(&idev->src, &idev->dst, L2CAP_PSM_HIDP_CTRL, + 0, control_connect_cb, idev); if (err < 0) { error("L2CAP connect failed: %s(%d)", strerror(-err), -err); dbus_message_unref(idev->pending_connect); idev->pending_connect = NULL; - return error_connection_attempt_failed(conn, msg, -err); + return connection_attempt_failed(msg, -err); } - return DBUS_HANDLER_RESULT_HANDLED; + return NULL; } -static DBusHandlerResult device_disconnect(DBusConnection *conn, +static DBusMessage *device_disconnect(DBusConnection *conn, DBusMessage *msg, void *data) { struct device *idev = data; + int err; - if (disconnect(idev, 0) < 0) - return error_failed_errno(conn, msg, errno); + err = disconnect(idev, 0); + if (err < 0) + return create_errno_message(msg, -err); - /* Replying to the requestor */ - return send_message_and_unref(conn, - dbus_message_new_method_return(msg)); + return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); } -static DBusHandlerResult device_is_connected(DBusConnection *conn, +static DBusMessage *device_is_connected(DBusConnection *conn, DBusMessage *msg, void *data) { struct device *idev = data; - DBusMessage *reply; - dbus_bool_t connected; - - connected = is_connected(idev); - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; + dbus_bool_t connected = is_connected(idev); - dbus_message_append_args(reply, - DBUS_TYPE_BOOLEAN, &connected, - DBUS_TYPE_INVALID); - - return send_message_and_unref(conn, reply); + return g_dbus_create_reply(msg, DBUS_TYPE_BOOLEAN, &connected, + DBUS_TYPE_INVALID); } -static DBusHandlerResult device_get_adapter(DBusConnection *conn, +static DBusMessage *device_get_adapter(DBusConnection *conn, DBusMessage *msg, void *data) { struct device *idev = data; - DBusMessage *reply; char addr[18]; const char *paddr = addr; ba2str(&idev->src, addr); - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - - dbus_message_append_args(reply, - DBUS_TYPE_STRING, &paddr, - DBUS_TYPE_INVALID); - - return send_message_and_unref(conn, reply); + return g_dbus_create_reply(msg, DBUS_TYPE_STRING, &paddr, + DBUS_TYPE_INVALID); } -static DBusHandlerResult device_get_address(DBusConnection *conn, +static DBusMessage *device_get_address(DBusConnection *conn, DBusMessage *msg, void *data) { struct device *idev = data; - DBusMessage *reply; char addr[18]; const char *paddr = addr; ba2str(&idev->dst, addr); - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - - dbus_message_append_args(reply, - DBUS_TYPE_STRING, &paddr, - DBUS_TYPE_INVALID); - - return send_message_and_unref(conn, reply); + return g_dbus_create_reply(msg, DBUS_TYPE_STRING, &paddr, + DBUS_TYPE_INVALID); } -static DBusHandlerResult device_get_name(DBusConnection *conn, +static DBusMessage *device_get_name(DBusConnection *conn, DBusMessage *msg, void *data) { struct device *idev = data; - DBusMessage *reply; const char *pname = (idev->name ? idev->name : ""); - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - - dbus_message_append_args(reply, - DBUS_TYPE_STRING, &pname, - DBUS_TYPE_INVALID); - - return send_message_and_unref(conn, reply); + return g_dbus_create_reply(msg, DBUS_TYPE_STRING, &pname, + DBUS_TYPE_INVALID); } -static DBusHandlerResult device_get_product_id(DBusConnection *conn, +static DBusMessage *device_get_product_id(DBusConnection *conn, DBusMessage *msg, void *data) { struct device *idev = data; - DBusMessage *reply; - - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - - dbus_message_append_args(reply, - DBUS_TYPE_UINT16, &idev->product, - DBUS_TYPE_INVALID); - return send_message_and_unref(conn, reply); + return g_dbus_create_reply(msg, DBUS_TYPE_UINT16, &idev->product, + DBUS_TYPE_INVALID); } -static DBusHandlerResult device_get_vendor_id(DBusConnection *conn, +static DBusMessage *device_get_vendor_id(DBusConnection *conn, DBusMessage *msg, void *data) { struct device *idev = data; - DBusMessage *reply; - - reply = dbus_message_new_method_return(msg); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - dbus_message_append_args(reply, - DBUS_TYPE_UINT16, &idev->vendor, - DBUS_TYPE_INVALID); - - return send_message_and_unref(conn, reply); + return g_dbus_create_reply(msg, DBUS_TYPE_UINT16, &idev->vendor, + DBUS_TYPE_INVALID); } -static void device_unregister(DBusConnection *conn, void *data) +static void device_unregister(void *data) { struct device *idev = data; @@ -918,22 +886,23 @@ static void device_unregister(DBusConnection *conn, void *data) device_free(idev); } -static DBusMethodVTable device_methods[] = { - { "Connect", device_connect, "", "" }, - { "Disconnect", device_disconnect, "", "" }, - { "IsConnected", device_is_connected, "", "b" }, - { "GetAdapter", device_get_adapter, "", "s" }, - { "GetAddress", device_get_address, "", "s" }, - { "GetName", device_get_name, "", "s" }, - { "GetProductId", device_get_product_id, "", "q" }, - { "GetVendorId", device_get_vendor_id, "", "q" }, - { NULL, NULL, NULL, NULL } +static GDBusMethodTable device_methods[] = { + { "Connect", "", "", device_connect, + G_DBUS_METHOD_FLAG_ASYNC }, + { "Disconnect", "", "", device_disconnect }, + { "IsConnected", "", "b", device_is_connected }, + { "GetAdapter", "", "s", device_get_adapter }, + { "GetAddress", "", "s", device_get_address }, + { "GetName", "", "s", device_get_name }, + { "GetProductId", "", "q", device_get_product_id }, + { "GetVendorId", "", "q", device_get_vendor_id }, + { } }; -static DBusSignalVTable device_signals[] = { +static GDBusSignalTable device_signals[] = { { "Connected", "" }, { "Disconnected", "" }, - { NULL, NULL } + { } }; /* @@ -941,19 +910,11 @@ static DBusSignalVTable device_signals[] = { */ static int register_path(DBusConnection *conn, const char *path, struct device *idev) { - if (!dbus_connection_create_object_path(conn, path, - idev, device_unregister)) { - error("Input device path registration failed"); - return -EINVAL; - } - - if (!dbus_connection_register_interface(conn, path, - INPUT_DEVICE_INTERFACE, - device_methods, - device_signals, NULL)) { + if (g_dbus_register_interface(conn, path, INPUT_DEVICE_INTERFACE, + device_methods, device_signals, NULL, + NULL, device_unregister) == FALSE) { error("Failed to register %s interface to %s", - INPUT_DEVICE_INTERFACE, path); - dbus_connection_destroy_object_path(conn, path); + INPUT_DEVICE_INTERFACE, path); return -1; } diff --git a/input/manager.c b/input/manager.c index b65ccb16..aae101fd 100644 --- a/input/manager.c +++ b/input/manager.c @@ -332,7 +332,7 @@ static int create_bonding(struct pending_req *pr) char address[18], *addr_ptr = address; msg = dbus_message_new_method_call("org.bluez", pr->adapter_path, - "org.bluez.Adapter", "CreateBonding"); + "org.bluez.Adapter", "CreateBonding"); if (!msg) { error("Unable to allocate new method call"); return -1; @@ -589,7 +589,6 @@ static DBusMessage *create_device(DBusConnection *conn, static DBusMessage *remove_device(DBusConnection *conn, DBusMessage *msg, void *data) { - DBusMessage *reply; GSList *l; const char *path; int err; @@ -602,20 +601,14 @@ static DBusMessage *remove_device(DBusConnection *conn, if (!l) return does_not_exist(msg); - reply = dbus_message_new_method_return(msg); - if (!reply) - return NULL; - err = input_device_unregister(conn, path); - if (err < 0) { - dbus_message_unref(reply); + if (err < 0) return create_errno_message(msg, -err); - } g_free(l->data); device_paths = g_slist_remove(device_paths, l->data); - return reply; + return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); } static DBusMessage *list_devices(DBusConnection *conn, |