From: Marcel Holtmann Date: Mon, 22 Dec 2008 13:42:03 +0000 (+0100) Subject: Add command to list device objects X-Git-Tag: 0.6~168 X-Git-Url: https://vcs.maemo.org/git/?a=commitdiff_plain;h=72cf57e982f6da1e1bfe3147de4ca1c7d7dc8b89;p=connman Add command to list device objects --- diff --git a/client/main.c b/client/main.c index cb28257..bb1c39f 100644 --- a/client/main.c +++ b/client/main.c @@ -35,6 +35,37 @@ #define CONNMAN_MANAGER_INTERFACE CONNMAN_SERVICE ".Manager" #define CONNMAN_MANAGER_PATH "/" +static DBusMessage *get_properties(DBusConnection *connection) +{ + DBusMessage *message, *reply; + DBusError error; + + message = dbus_message_new_method_call(CONNMAN_SERVICE, + CONNMAN_MANAGER_PATH, + CONNMAN_MANAGER_INTERFACE, + "GetProperties"); + if (message == NULL) + return NULL; + + dbus_error_init(&error); + + reply = dbus_connection_send_with_reply_and_block(connection, + message, -1, &error); + if (reply == NULL) { + if (dbus_error_is_set(&error) == TRUE) { + fprintf(stderr, "%s\n", error.message); + dbus_error_free(&error); + } else + fprintf(stderr, "Failed to get properties\n"); + dbus_message_unref(message); + return NULL; + } + + dbus_message_unref(message); + + return reply; +} + static const char *extract_state(DBusMessage *message) { DBusMessageIter array, dict; @@ -68,40 +99,66 @@ static const char *extract_state(DBusMessage *message) return NULL; } -static int cmd_status(DBusConnection *connection) +static void print_objects(DBusMessageIter *array) { - DBusMessage *message, *reply; - DBusError error; - const char *state; + DBusMessageIter value; - message = dbus_message_new_method_call(CONNMAN_SERVICE, - CONNMAN_MANAGER_PATH, - CONNMAN_MANAGER_INTERFACE, - "GetProperties"); - if (message == NULL) - return -ENOMEM; + if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_ARRAY) + return; - dbus_error_init(&error); + dbus_message_iter_recurse(array, &value); - reply = dbus_connection_send_with_reply_and_block(connection, - message, -1, &error); - if (reply == NULL) { - if (dbus_error_is_set(&error) == TRUE) { - fprintf(stderr, "%s\n", error.message); - dbus_error_free(&error); - } else - fprintf(stderr, "Failed to get properties\n"); - dbus_message_unref(message); - return -EIO; + while (dbus_message_iter_get_arg_type(&value) == DBUS_TYPE_OBJECT_PATH) { + const char *path; + + dbus_message_iter_get_basic(&value, &path); + + printf("%s\n", path); + + dbus_message_iter_next(&value); } +} - dbus_message_unref(message); +static void extract_devices(DBusMessage *message) +{ + DBusMessageIter array, dict; - dbus_error_init(&error); + dbus_message_iter_init(message, &array); + dbus_message_iter_recurse(&array, &dict); - state = extract_state(reply); + while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) { + DBusMessageIter entry, value; + const char *key; + + dbus_message_iter_recurse(&dict, &entry); + dbus_message_iter_get_basic(&entry, &key); - dbus_message_unref(reply); + dbus_message_iter_next(&entry); + + dbus_message_iter_recurse(&entry, &value); + + //type = dbus_message_iter_get_arg_type(&value); + //dbus_message_iter_get_basic(&value, &val); + + if (strcmp(key, "Devices") == 0) { + print_objects(&value); + return; + } + + dbus_message_iter_next(&dict); + } +} + +static int cmd_status(DBusConnection *connection) +{ + DBusMessage *message; + const char *state; + + message = get_properties(connection); + + state = extract_state(message); + + dbus_message_unref(message); if (state == NULL) return -EINVAL; @@ -111,17 +168,52 @@ static int cmd_status(DBusConnection *connection) return 0; } +static int cmd_devices(DBusConnection *connection) +{ + DBusMessage *message; + + message = get_properties(connection); + + extract_devices(message); + + dbus_message_unref(message); + + return 0; +} + +static void usage(const char *program) +{ + printf("ConnMan utility ver %s\n\n", VERSION); + + printf("Usage:\n" + "\t%s \n\n", program); + + printf("Commands:\n" + "\thelp\n" + "\tdev\n" + "\n"); +} + int main(int argc, char *argv[]) { DBusConnection *conn; + if (argc > 1 && strcmp(argv[1], "help") == 0) { + usage(argv[0]); + exit(0); + } + conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL); if (!conn) { fprintf(stderr, "Can't get on system bus\n"); exit(1); } - cmd_status(conn); + if (argc > 1) { + if (strcmp(argv[1], "dev") == 0) + cmd_devices(conn); + } else + cmd_status(conn); dbus_connection_unref(conn);