⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adapter.c

📁 Linux的蓝牙操作工具。配合bluez-lib使用
💻 C
📖 第 1 页 / 共 5 页
字号:
	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,				DBUS_TYPE_STRING_AS_STRING, &array_iter);	for (i = 0; i < (sizeof(service_cls) / sizeof(*service_cls)); i++) {		if (adapter->class[2] & (1 << i)) {			str_ptr = service_cls[i];			dbus_message_iter_append_basic(&array_iter,						DBUS_TYPE_STRING, &str_ptr);		}	}	dbus_message_iter_close_container(&iter, &array_iter);	return send_message_and_unref(conn, reply);}static DBusHandlerResult adapter_get_name(DBusConnection *conn,						DBusMessage *msg, void *data){	struct adapter *adapter = data;	DBusMessage *reply;	char str[249], *str_ptr = str;	int err;	bdaddr_t ba;	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING))		return error_invalid_arguments(conn, msg, NULL);	str2ba(adapter->address, &ba);	err = read_local_name(&ba, str);	if (err < 0) {		if (!adapter->up)			return error_not_ready(conn, msg);		err = get_device_name(adapter->dev_id, str, sizeof(str));		if (err < 0)			return error_failed_errno(conn, msg, -err);	}	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply, DBUS_TYPE_STRING, &str_ptr,					DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static DBusHandlerResult adapter_set_name(DBusConnection *conn,						DBusMessage *msg, void *data){	struct adapter *adapter = data;	DBusMessage *reply;	bdaddr_t bdaddr;	char *str_ptr;	int ecode;	if (!dbus_message_get_args(msg, NULL,				DBUS_TYPE_STRING, &str_ptr,				DBUS_TYPE_INVALID))		return error_invalid_arguments(conn, msg, NULL);	if (!g_utf8_validate(str_ptr, -1, NULL)) {		error("Name change failed: the supplied name isn't valid UTF-8");		return error_invalid_arguments(conn, msg, NULL);	}	str2ba(adapter->address, &bdaddr);	write_local_name(&bdaddr, str_ptr);	if (!adapter->up)		goto done;	ecode = set_device_name(adapter->dev_id, str_ptr);	if (ecode < 0)		return error_failed_errno(conn, msg, -ecode);done:	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	return send_message_and_unref(conn, reply);}static DBusHandlerResult adapter_get_remote_info(DBusConnection *conn,						DBusMessage *msg, void *data){	struct adapter *adapter = data;	DBusMessage *reply;	DBusMessageIter iter;	DBusMessageIter dict;	bdaddr_t src, dst;	const char *addr_ptr;	char filename[PATH_MAX + 1];	char buf[64];	const char *ptr;	char *str;	dbus_bool_t boolean;	uint32_t class;	int compid, ver, subver;	if (!dbus_message_get_args(msg, NULL,				DBUS_TYPE_STRING, &addr_ptr,				DBUS_TYPE_INVALID))		return error_invalid_arguments(conn, msg, NULL);	if (check_address(addr_ptr) < 0)		return error_invalid_arguments(conn, msg, NULL);	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_iter_init_append(reply, &iter);	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,			DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING			DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING			DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);	/* Name */	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address, "names");	str = textfile_caseget(filename, addr_ptr);	if (str) {		dbus_message_iter_append_dict_entry(&dict, "name",				DBUS_TYPE_STRING, &str);		free(str);	}	str2ba(adapter->address, &src);	str2ba(addr_ptr, &dst);	/* Remote device class */	if (read_remote_class(&src, &dst, &class) == 0) {		dbus_message_iter_append_dict_entry(&dict, "class",				DBUS_TYPE_UINT32, &class);		ptr = major_class_str(class);		dbus_message_iter_append_dict_entry(&dict, "major_class",				DBUS_TYPE_STRING, &ptr);		ptr = minor_class_str(class);		dbus_message_iter_append_dict_entry(&dict, "minor_class",				DBUS_TYPE_STRING, &ptr);	}	/* Alias */	if (get_device_alias(adapter->dev_id, &dst, buf, sizeof(buf)) > 0) {		ptr = buf;		dbus_message_iter_append_dict_entry(&dict, "alias",				DBUS_TYPE_STRING, &ptr);	}	/* Bonded */	create_name(filename, PATH_MAX, STORAGEDIR,			adapter->address, "linkkeys");	str = textfile_caseget(filename, addr_ptr);	if (str) {		boolean = TRUE;		free(str);	} else {		boolean = FALSE;	}	dbus_message_iter_append_dict_entry(&dict, "bonded",			DBUS_TYPE_BOOLEAN, &boolean);	/* Trusted */	boolean = read_trust(&src, addr_ptr, GLOBAL_TRUST);	dbus_message_iter_append_dict_entry(&dict, "trusted",			DBUS_TYPE_BOOLEAN, &boolean);	/* Connected */	if (g_slist_find_custom(adapter->active_conn, &dst,				active_conn_find_by_bdaddr))		boolean = TRUE;	else		boolean = FALSE;	dbus_message_iter_append_dict_entry(&dict, "connected",			DBUS_TYPE_BOOLEAN, &boolean);	/* HCI Revision/Manufacturer/Version */	create_name(filename, PATH_MAX, STORAGEDIR,			adapter->address, "manufacturers");	str = textfile_caseget(filename, addr_ptr);	if (!str)		goto done;	if (sscanf(str, "%d %d %d", &compid, &ver, &subver) != 3) {		/* corrupted file data */		free(str);		goto done;	}	free(str);	ptr = buf;	snprintf(buf, 16, "HCI 0x%X", subver);	dbus_message_iter_append_dict_entry(&dict, "revision",			DBUS_TYPE_STRING, &ptr);	ptr = bt_compidtostr(compid);	dbus_message_iter_append_dict_entry(&dict, "manufacturer",			DBUS_TYPE_STRING, &ptr);	str = lmp_vertostr(ver);	snprintf(buf, 64, "Bluetooth %s", str);	bt_free(str);	create_name(filename, PATH_MAX, STORAGEDIR,			adapter->address, "features");	str = textfile_caseget(filename, addr_ptr);	if (str) {		if (strlen(str) == 16) {			uint8_t features;			/* Getting the third byte */			features  = ((str[6] - 48) << 4) | (str[7] - 48);			if (features & (LMP_EDR_ACL_2M | LMP_EDR_ACL_3M))				snprintf(buf, 64, "Bluetooth %s + EDR", ptr);		}		free(str);	}	ptr = buf;	dbus_message_iter_append_dict_entry(&dict, "version",			DBUS_TYPE_STRING, &ptr);done:	dbus_message_iter_close_container(&iter, &dict);	return send_message_and_unref(conn, reply);}static DBusHandlerResult adapter_get_remote_svc(DBusConnection *conn,						DBusMessage *msg, void *data){	return get_remote_svc_rec(conn, msg, data, SDP_FORMAT_BINARY);}static DBusHandlerResult adapter_get_remote_svc_xml(DBusConnection *conn,						DBusMessage *msg, void *data){	return get_remote_svc_rec(conn, msg, data, SDP_FORMAT_XML);}static DBusHandlerResult adapter_get_remote_svc_handles(DBusConnection *conn,							DBusMessage *msg,							void *data){	return get_remote_svc_handles(conn, msg, data);}static DBusHandlerResult adapter_get_remote_svc_identifiers(DBusConnection *conn,								DBusMessage *msg,								void *data){	return get_remote_svc_identifiers(conn, msg, data);}static DBusHandlerResult adapter_finish_sdp_transact(DBusConnection *conn,							DBusMessage *msg,							void *data){	return finish_remote_svc_transact(conn, msg, data);}static DBusHandlerResult adapter_get_remote_version(DBusConnection *conn,						DBusMessage *msg, void *data){	struct adapter *adapter = data;	DBusMessage *reply;	char filename[PATH_MAX + 1];	char *addr_ptr, *str;	char *str_ver = NULL;	char info_array[64], *info = info_array;	int compid, ver, subver;	memset(info_array, 0, 64);	if (!dbus_message_get_args(msg, NULL,				DBUS_TYPE_STRING, &addr_ptr,				DBUS_TYPE_INVALID))		return error_invalid_arguments(conn, msg, NULL);	if (check_address(addr_ptr) < 0)		return error_invalid_arguments(conn, msg, NULL);	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address,			"manufacturers");	str = textfile_caseget(filename, addr_ptr);	if (!str)		return error_not_available(conn, msg);	if (sscanf(str, "%d %d %d", &compid, &ver, &subver) != 3) {		/* corrupted file data */		free(str);		goto failed;	}	free(str);	str_ver = lmp_vertostr(ver);	/* Default value */	snprintf(info, 64, "Bluetooth %s", str_ver);	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address,			"features");	str = textfile_caseget(filename, addr_ptr);	if (!str)		goto failed;	/* Check if the data is not corrupted */	if (strlen(str) == 16) {		uint8_t features;		/* Getting the third byte */		features  = ((str[6] - 48) << 4) | (str[7] - 48);		if (features & (LMP_EDR_ACL_2M | LMP_EDR_ACL_3M))			snprintf(info, 64, "Bluetooth %s + EDR", str_ver);	}	free(str);failed:	if (str_ver)		bt_free(str_ver);	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply, DBUS_TYPE_STRING, &info,					DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static DBusHandlerResult adapter_get_remote_revision(DBusConnection *conn,						DBusMessage *msg, void *data){	struct adapter *adapter = data;	DBusMessage *reply;	char filename[PATH_MAX + 1];	char *addr_ptr, *str;	char info_array[16], *info = info_array;	int compid, ver, subver;	memset(info_array, 0, 16);	if (!dbus_message_get_args(msg, NULL,				DBUS_TYPE_STRING, &addr_ptr,				DBUS_TYPE_INVALID))		return error_invalid_arguments(conn, msg, NULL);	if (check_address(addr_ptr) < 0)		return error_invalid_arguments(conn, msg, NULL);	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address,			"manufacturers");	str = textfile_caseget(filename, addr_ptr);	if (!str)		return error_not_available(conn, msg);	if (sscanf(str, "%d %d %d", &compid, &ver, &subver) == 3)		snprintf(info, 16, "HCI 0x%X", subver);	free(str);	dbus_message_append_args(reply, DBUS_TYPE_STRING, &info,					DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static DBusHandlerResult adapter_get_remote_manufacturer(DBusConnection *conn,							DBusMessage *msg,							void *data){	struct adapter *adapter = data;	DBusMessage *reply;	char filename[PATH_MAX + 1];	char *addr_ptr, *str;	char info_array[64], *info = info_array;	int compid, ver, subver;	memset(info_array, 0, 64);	if (!dbus_message_get_args(msg, NULL,				DBUS_TYPE_STRING, &addr_ptr,				DBUS_TYPE_INVALID))		return error_invalid_arguments(conn, msg, NULL);	if (check_address(addr_ptr) < 0)		return error_invalid_arguments(conn, msg, NULL);	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address,			"manufacturers");	str = textfile_caseget(filename, addr_ptr);	if (!str)		return error_not_available(conn, msg);	if (sscanf(str, "%d %d %d", &compid, &ver, &subver) == 3)		info = bt_compidtostr(compid);	free(str);	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply, DBUS_TYPE_STRING, &info,					DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static DBusHandlerResult adapter_get_remote_company(DBusConnection *conn,						DBusMessage *msg, void *data){	DBusMessage *reply;	bdaddr_t bdaddr;	char oui[9], *str_bdaddr, *tmp;	if (!dbus_message_get_args(msg, NULL,				DBUS_TYPE_STRING, &str_bdaddr,				DBUS_TYPE_INVALID))		return error_invalid_arguments(conn, msg, NULL);	str2ba(str_bdaddr, &bdaddr);	ba2oui(&bdaddr, oui);	tmp = ouitocomp(oui);	if (!tmp)		return error_not_available(conn, msg);	reply = dbus_message_new_method_return(msg);	if (!reply) {		free(tmp);		return DBUS_HANDLER_RESULT_NEED_MEMORY;	}	dbus_message_append_args(reply, DBUS_TYPE_STRING, &tmp,					DBUS_TYPE_INVALID);	free(tmp);	return send_message_and_unref(conn, reply);}static int get_remote_class(DBusConnection *conn, DBusMessage *msg, void *data,				uint32_t *class){	struct adapter *adapter = data;	char *addr_peer;	bdaddr_t local, peer;	int ecode;	if (!dbus_message_get_args(msg, NULL,				DBUS_TYPE_STRING, &addr_peer,				DBUS_TYPE_INVALID)) {		error_invalid_arguments(conn, msg, NULL);		return -1;	}	if (check_address(addr_peer) < 0) {		error_invalid_arguments(conn, msg, NULL);		return -1;	}	str2ba(addr_peer, &peer);	str2ba(adapter->address, &local);	ecode = read_remote_class(&local, &peer, class);	if (ecode < 0) {		error_not_available(conn, msg);		return -1;	}	return 0;}static DBusHandlerResult adapter_get_remote_major_class(DBusConnection *conn,							DBusMessage *msg,							void *data){	DBusMessage *reply;	const char *major_class;	uint32_t class;	if (get_remote_class(conn, msg, data, &class) < 0)		return DBUS_HANDLER_RESULT_HANDLED;	major_class = major_class_str(class);	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply, DBUS_TYPE_STRING, &major_class,					DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static DBusHandlerResult adapter_get_remote_minor_class(DBusConnection *conn,							DBusMessage *msg,							void *data)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -