📄 adapter.c
字号:
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 + -