summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2006-03-10 20:58:50 +0000
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2006-03-10 20:58:50 +0000
commit1c37ee6736011106383c591cb387c724b0ff494e (patch)
tree9e7ae3104f78ebe75693c02e524aea90af31bcdb
parenta1dc79f3257f774f5ebd4771c96e133a05734efe (diff)
Added list available minor class for computer and phone.
-rw-r--r--hcid/dbus-adapter.c68
-rw-r--r--hcid/dbus-error.c6
2 files changed, 73 insertions, 1 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c
index 984b7778..06eb40f6 100644
--- a/hcid/dbus-adapter.c
+++ b/hcid/dbus-adapter.c
@@ -63,6 +63,15 @@ static const char *computer_minor_cls[] = {
"wearable"
};
+static const char *phone_minor_cls[] = {
+ "uncategorized",
+ "cellular",
+ "cordless",
+ "smart phone",
+ "modem",
+ "isdn"
+};
+
static DBusMessage *handle_dev_get_address_req(DBusMessage *msg, void *data)
{
struct hci_dbus_data *dbus_data = data;
@@ -222,6 +231,62 @@ static DBusMessage *handle_dev_get_mode_req(DBusMessage *msg, void *data)
return reply;
}
+static DBusMessage *handle_dev_list_minor_classes_req(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(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);
+ reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET | errno);
+ goto failed;
+ }
+
+ 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:
+ reply = error_unsupported_major_class(msg);
+ goto failed;
+ }
+
+ reply = dbus_message_new_method_return(msg);
+ if (!reply)
+ return error_out_of_memory(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);
+
+failed:
+ hci_close_dev(dd);
+
+ return reply;
+}
+
static DBusMessage *handle_dev_set_mode_req(DBusMessage *msg, void *data)
{
const struct hci_dbus_data *dbus_data = data;
@@ -1252,6 +1317,7 @@ static const struct service_data dev_services[] = {
{ DEV_GET_COMPANY, handle_dev_get_company_req, DEV_GET_COMPANY_SIGNATURE },
{ DEV_GET_FEATURES, handle_dev_get_features_req, DEV_GET_FEATURES_SIGNATURE },
{ DEV_GET_MODE, handle_dev_get_mode_req, DEV_GET_MODE_SIGNATURE },
+ { DEV_LIST_MINOR_CLASSES, handle_dev_list_minor_classes_req, DEV_LIST_MINOR_CLASSES_SIGNATURE },
{ DEV_SET_MODE, handle_dev_set_mode_req, DEV_SET_MODE_SIGNATURE },
{ DEV_GET_DISCOVERABLE_TO, handle_dev_get_discoverable_to_req, DEV_GET_DISCOVERABLE_TO_SIGNATURE },
{ DEV_SET_DISCOVERABLE_TO, handle_dev_set_discoverable_to_req, DEV_SET_DISCOVERABLE_TO_SIGNATURE },
@@ -1263,7 +1329,7 @@ static const struct service_data dev_services[] = {
{ DEV_GET_SERVICE_CLASSES, handle_dev_get_service_classes_req, DEV_GET_SERVICE_CLASSES_SIGNATURE },
{ DEV_GET_NAME, handle_dev_get_name_req, DEV_GET_NAME_SIGNATURE },
{ DEV_SET_NAME, handle_dev_set_name_req, DEV_SET_NAME_SIGNATURE },
-
+
{ DEV_GET_REMOTE_VERSION, handle_dev_get_remote_version_req, DEV_GET_REMOTE_VERSION_SIGNATURE },
{ DEV_GET_REMOTE_REVISION, handle_dev_get_remote_revision_req, DEV_GET_REMOTE_REVISION_SIGNATURE },
{ DEV_GET_REMOTE_MANUFACTURER, handle_dev_get_remote_manufacturer_req, DEV_GET_REMOTE_MANUFACTURER_SIGNATURE },
diff --git a/hcid/dbus-error.c b/hcid/dbus-error.c
index c6a92124..988d3b34 100644
--- a/hcid/dbus-error.c
+++ b/hcid/dbus-error.c
@@ -206,6 +206,12 @@ DBusMessage *error_not_connected(DBusMessage *msg)
"Not connected");
}
+DBusMessage *error_unsupported_major_class(DBusMessage *msg)
+{
+ return dbus_message_new_error(msg, ERROR_INTERFACE ".UnsupportedMajorClass",
+ "Unsupported Major Class");
+}
+
static DBusMessage *error_already_exists(DBusMessage *msg, const char *str)
{
return dbus_message_new_error(msg, ERROR_INTERFACE ".AlreadyExists", str);