Add command to list device objects
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 22 Dec 2008 13:42:03 +0000 (14:42 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 22 Dec 2008 13:42:03 +0000 (14:42 +0100)
client/main.c

index cb28257..bb1c39f 100644 (file)
 #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 <command>\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);