diff options
Diffstat (limited to 'hcid/dbus-adapter.c')
| -rw-r--r-- | hcid/dbus-adapter.c | 217 | 
1 files changed, 92 insertions, 125 deletions
| diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c index 7c06eab7..6c38597d 100644 --- a/hcid/dbus-adapter.c +++ b/hcid/dbus-adapter.c @@ -177,26 +177,6 @@ static DBusHandlerResult handle_dev_get_company_req(DBusConnection *conn, DBusMe  	return send_reply_and_unref(conn, reply);  } -static DBusHandlerResult handle_dev_get_features_req(DBusConnection *conn, DBusMessage *msg, void *data) -{ -	DBusMessage *reply; -	DBusMessageIter iter; -	DBusMessageIter array_iter; - -	reply = dbus_message_new_method_return(msg); -	if (!reply) -		return error_out_of_memory(conn, msg); - -	dbus_message_iter_init_append(reply, &iter); - -	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, -				DBUS_TYPE_STRING_AS_STRING, &array_iter); - -	dbus_message_iter_close_container(&iter, &array_iter); - -	return send_reply_and_unref(conn, reply); -} -  static DBusHandlerResult handle_dev_get_mode_req(DBusConnection *conn, DBusMessage *msg, void *data)  {  	const struct hci_dbus_data *dbus_data = data; @@ -231,60 +211,6 @@ static DBusHandlerResult handle_dev_get_mode_req(DBusConnection *conn, DBusMessa  	return send_reply_and_unref(conn, reply);  } -static DBusHandlerResult handle_dev_list_minor_classes_req(DBusConnection *conn, DBusMessage *msg, void *data) -{ -	const struct hci_dbus_data *dbus_data = data; -	DBusMessage *reply = NULL; -	DBusMessageIter iter; -	DBusMessageIter array_iter; -	const char **minor_ptr; -	uint8_t cls[3]; -	uint8_t major_class; -	int dd, size, i; - -	dd = hci_open_dev(dbus_data->dev_id); -	if (dd < 0) -		return error_no_such_adapter(conn, msg); - -	if (hci_read_class_of_dev(dd, cls, 1000) < 0) { -		error("Can't read class of device on hci%d: %s(%d)", -				dbus_data->dev_id, strerror(errno), errno); -		hci_close_dev(dd); -		return error_failed(conn, msg, errno); -	} - -	hci_close_dev(dd); - -	major_class = cls[1] & 0x1F; - -	switch (major_class) { -	case 1: /* computer */ -		minor_ptr = computer_minor_cls; -		size = sizeof(computer_minor_cls) / sizeof(*computer_minor_cls); -		break; -	case 2: /* phone */ -		minor_ptr = phone_minor_cls; -		size = sizeof(phone_minor_cls) / sizeof(*phone_minor_cls); -		break; -	default: -		return error_unsupported_major_class(conn, msg); -	} - -	reply = dbus_message_new_method_return(msg); -	if (!reply) -		return error_out_of_memory(conn, msg); - -	dbus_message_iter_init_append(reply, &iter); -	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, -					 	DBUS_TYPE_STRING_AS_STRING, &array_iter); -	for (i = 0; i < size; i++) -		dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &minor_ptr[i]); - -	dbus_message_iter_close_container(&iter, &array_iter); - -	return send_reply_and_unref(conn, reply); -} -  static DBusHandlerResult handle_dev_set_mode_req(DBusConnection *conn, DBusMessage *msg, void *data)  {  	const struct hci_dbus_data *dbus_data = data; @@ -439,6 +365,60 @@ static DBusHandlerResult handle_dev_get_major_class_req(DBusConnection *conn, DB  	return send_reply_and_unref(conn, reply);  } +static DBusHandlerResult handle_dev_list_minor_classes_req(DBusConnection *conn, DBusMessage *msg, void *data) +{ +	const struct hci_dbus_data *dbus_data = data; +	DBusMessage *reply = NULL; +	DBusMessageIter iter; +	DBusMessageIter array_iter; +	const char **minor_ptr; +	uint8_t cls[3]; +	uint8_t major_class; +	int dd, size, i; + +	dd = hci_open_dev(dbus_data->dev_id); +	if (dd < 0) +		return error_no_such_adapter(conn, msg); + +	if (hci_read_class_of_dev(dd, cls, 1000) < 0) { +		error("Can't read class of device on hci%d: %s(%d)", +				dbus_data->dev_id, strerror(errno), errno); +		hci_close_dev(dd); +		return error_failed(conn, msg, errno); +	} + +	hci_close_dev(dd); + +	major_class = cls[1] & 0x1F; + +	switch (major_class) { +	case 1: /* computer */ +		minor_ptr = computer_minor_cls; +		size = sizeof(computer_minor_cls) / sizeof(*computer_minor_cls); +		break; +	case 2: /* phone */ +		minor_ptr = phone_minor_cls; +		size = sizeof(phone_minor_cls) / sizeof(*phone_minor_cls); +		break; +	default: +		return error_unsupported_major_class(conn, msg); +	} + +	reply = dbus_message_new_method_return(msg); +	if (!reply) +		return error_out_of_memory(conn, msg); + +	dbus_message_iter_init_append(reply, &iter); +	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, +					 	DBUS_TYPE_STRING_AS_STRING, &array_iter); +	for (i = 0; i < size; i++) +		dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &minor_ptr[i]); + +	dbus_message_iter_close_container(&iter, &array_iter); + +	return send_reply_and_unref(conn, reply); +} +  static DBusHandlerResult handle_dev_get_minor_class_req(DBusConnection *conn, DBusMessage *msg, void *data)  {  	struct hci_dbus_data *dbus_data = data; @@ -1285,59 +1265,46 @@ static DBusHandlerResult handle_dev_cancel_discovery_req(DBusConnection *conn, D  	return send_reply_and_unref(conn, reply);  } -static DBusHandlerResult handle_dev_discover_cache_req(DBusConnection *conn, DBusMessage *msg, void *data) -{ -	return error_not_implemented(conn, msg); -} - -static DBusHandlerResult handle_dev_discover_service_req(DBusConnection *conn, DBusMessage *msg, void *data) -{ -	return error_not_implemented(conn, msg); -} -  static struct service_data dev_services[] = { -	{ DEV_GET_ADDRESS,		handle_dev_get_address_req,		}, -	{ DEV_GET_VERSION,		handle_dev_get_version_req,		}, -	{ DEV_GET_REVISION,		handle_dev_get_revision_req,		}, -	{ DEV_GET_MANUFACTURER,		handle_dev_get_manufacturer_req,	}, -	{ DEV_GET_COMPANY,		handle_dev_get_company_req,		}, -	{ DEV_GET_FEATURES,		handle_dev_get_features_req,		}, -	{ DEV_GET_MODE,			handle_dev_get_mode_req,		}, -	{ DEV_LIST_MINOR_CLASSES,	handle_dev_list_minor_classes_req,	}, -	{ DEV_SET_MODE,			handle_dev_set_mode_req,		}, -	{ DEV_GET_DISCOVERABLE_TO,	handle_dev_get_discoverable_to_req,	}, -	{ DEV_SET_DISCOVERABLE_TO,	handle_dev_set_discoverable_to_req,	}, -	{ DEV_IS_CONNECTABLE,		handle_dev_is_connectable_req,		}, -	{ DEV_IS_DISCOVERABLE,		handle_dev_is_discoverable_req,		}, -	{ DEV_GET_MAJOR_CLASS,		handle_dev_get_major_class_req,		}, -	{ DEV_GET_MINOR_CLASS,		handle_dev_get_minor_class_req,		}, -	{ DEV_SET_MINOR_CLASS,		handle_dev_set_minor_class_req,		}, -	{ DEV_GET_SERVICE_CLASSES,	handle_dev_get_service_classes_req,	}, -	{ DEV_GET_NAME,			handle_dev_get_name_req,		}, -	{ DEV_SET_NAME,			handle_dev_set_name_req,		}, +	{ "GetAddress",			handle_dev_get_address_req,		}, +	{ "GetVersion",			handle_dev_get_version_req,		}, +	{ "GetRevision",		handle_dev_get_revision_req,		}, +	{ "GetManufacturer",		handle_dev_get_manufacturer_req,	}, +	{ "GetCompany",			handle_dev_get_company_req,		}, +	{ "GetMode",			handle_dev_get_mode_req,		}, +	{ "SetMode",			handle_dev_set_mode_req,		}, +	{ "GetDiscoverableTimeout",	handle_dev_get_discoverable_to_req,	}, +	{ "SetDiscoverableTimeout",	handle_dev_set_discoverable_to_req,	}, +	{ "IsConnectable",		handle_dev_is_connectable_req,		}, +	{ "IsDiscoverable",		handle_dev_is_discoverable_req,		}, +	{ "GetMajorClass",		handle_dev_get_major_class_req,		}, +	{ "ListAvailableMinorClasses",	handle_dev_list_minor_classes_req,	}, +	{ "GetMinorClass",		handle_dev_get_minor_class_req,		}, +	{ "SetMinorClass",		handle_dev_set_minor_class_req,		}, +	{ "GetServicesClasses",		handle_dev_get_service_classes_req,	}, +	{ "GetName",			handle_dev_get_name_req,		}, +	{ "SetName",			handle_dev_set_name_req,		}, -	{ DEV_GET_REMOTE_VERSION,	handle_dev_get_remote_version_req,	}, -	{ DEV_GET_REMOTE_REVISION,	handle_dev_get_remote_revision_req,	}, -	{ DEV_GET_REMOTE_MANUFACTURER,	handle_dev_get_remote_manufacturer_req,	}, -	{ DEV_GET_REMOTE_COMPANY,	handle_dev_get_remote_company_req,	}, -	{ DEV_GET_REMOTE_NAME,		handle_dev_get_remote_name_req,		}, -	{ DEV_GET_REMOTE_ALIAS,		handle_dev_get_remote_alias_req,	}, -	{ DEV_SET_REMOTE_ALIAS,		handle_dev_set_remote_alias_req,	}, - -	{ DEV_LAST_SEEN,		handle_dev_last_seen_req,		}, -	{ DEV_LAST_USED,		handle_dev_last_used_req,		}, - -	{ DEV_CREATE_BONDING,		handle_dev_create_bonding_req,		}, -	{ DEV_REMOVE_BONDING,		handle_dev_remove_bonding_req,		}, -	{ DEV_HAS_BONDING_NAME,		handle_dev_has_bonding_req,		}, -	{ DEV_LIST_BONDINGS,		handle_dev_list_bondings_req,		}, -	{ DEV_GET_PIN_CODE_LENGTH,	handle_dev_get_pin_code_length_req,	}, -	{ DEV_GET_ENCRYPTION_KEY_SIZE,	handle_dev_get_encryption_key_size_req,	}, - -	{ DEV_DISCOVER_DEVICES,		handle_dev_discover_devices_req,	}, -	{ DEV_CANCEL_DISCOVERY,		handle_dev_cancel_discovery_req,	}, -	{ DEV_DISCOVER_CACHE,		handle_dev_discover_cache_req,		}, -	{ DEV_DISCOVER_SERVICE,		handle_dev_discover_service_req,	}, +	{ "GetRemoteVersion",		handle_dev_get_remote_version_req,	}, +	{ "GetRemoteRevision",		handle_dev_get_remote_revision_req,	}, +	{ "GetRemoteManufacturer",	handle_dev_get_remote_manufacturer_req,	}, +	{ "GetRemoteCompany",		handle_dev_get_remote_company_req,	}, +	{ "GetRemoteName",		handle_dev_get_remote_name_req,		}, +	{ "GetRemoteAlias",		handle_dev_get_remote_alias_req,	}, +	{ "SetRemoteAlias",		handle_dev_set_remote_alias_req,	}, + +	{ "LastSeen",			handle_dev_last_seen_req,		}, +	{ "LastUsed",			handle_dev_last_used_req,		}, + +	{ "CreateBonding",		handle_dev_create_bonding_req,		}, +	{ "RemoveBonding",		handle_dev_remove_bonding_req,		}, +	{ "HasBonding",			handle_dev_has_bonding_req,		}, +	{ "ListBondings",		handle_dev_list_bondings_req,		}, +	{ "GetPinCodeLength",		handle_dev_get_pin_code_length_req,	}, +	{ "GetEncryptionKeySize",	handle_dev_get_encryption_key_size_req,	}, + +	{ "DiscoverDevices",		handle_dev_discover_devices_req,	}, +	{ "CancelDiscovery",		handle_dev_cancel_discovery_req,	},  	{ NULL, NULL }  }; | 
