diff options
-rw-r--r-- | client/services.c | 120 | ||||
-rw-r--r-- | client/services.h | 3 |
2 files changed, 121 insertions, 2 deletions
diff --git a/client/services.c b/client/services.c index 56d26111..bdf24da7 100644 --- a/client/services.c +++ b/client/services.c @@ -2,7 +2,7 @@ * * Connection Manager * - * Copyright (C) 2012 Intel Corporation. All rights reserved. + * Copyright (C) 2012-2013 Intel Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -62,6 +62,124 @@ int parse_boolean(char *arg) return -1; } +static void print_service(char *path, DBusMessageIter *iter) +{ + char *name = "", *str = NULL; + int autoconn = 0, favorite = 0, count = 0; + char *property; + char state = ' '; + DBusMessageIter entry, val; + + while (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INVALID) { + + dbus_message_iter_recurse(iter, &entry); + dbus_message_iter_get_basic(&entry, &property); + if (strcmp(property, "Name") == 0) { + dbus_message_iter_next(&entry); + dbus_message_iter_recurse(&entry, &val); + dbus_message_iter_get_basic(&val, &name); + + } else if (strcmp(property, "State") == 0) { + dbus_message_iter_next(&entry); + dbus_message_iter_recurse(&entry, &val); + dbus_message_iter_get_basic(&val, &str); + + if (str != NULL) { + if (strcmp(str, "online") == 0) + state = 'O'; + else if (strcmp(str, "ready") == 0) + state = 'R'; + } + + } else if (strcmp(property, "AutoConnect") == 0) { + dbus_message_iter_next(&entry); + dbus_message_iter_recurse(&entry, &val); + dbus_message_iter_get_basic(&val, &autoconn); + + } else if (strcmp(property, "Favorite") == 0) { + dbus_message_iter_next(&entry); + dbus_message_iter_recurse(&entry, &val); + dbus_message_iter_get_basic(&val, &favorite); + } + + count++; + dbus_message_iter_next(iter); + } + + str = strrchr(path, '/'); + if (str != NULL) + str++; + else + str = path; + + if (count > 0) { + if (*name == '\0') + name = "<hidden>"; + + fprintf(stdout, "%c%c%c %-20s %s", favorite != 0 ? '*' : ' ', + autoconn != 0 ? 'A' : ' ', state, name, str); + } else + fprintf(stdout, "%-24s %s", "unchanged", str); + +} + +static void list_service_array(DBusMessageIter *iter) +{ + DBusMessageIter array, dict; + char *path = NULL; + + while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_STRUCT) { + + dbus_message_iter_recurse(iter, &array); + if (dbus_message_iter_get_arg_type(&array) + != DBUS_TYPE_OBJECT_PATH) + return; + + dbus_message_iter_get_basic(&array, &path); + + dbus_message_iter_next(&array); + if (dbus_message_iter_get_arg_type(&array) + == DBUS_TYPE_ARRAY) { + dbus_message_iter_recurse(&array, &dict); + print_service(path, &dict); + } + + if (dbus_message_iter_has_next(iter) == TRUE) + fprintf(stdout, "\n"); + + dbus_message_iter_next(iter); + } +} + +void __connmanctl_services_list(DBusMessageIter *iter) +{ + DBusMessageIter array; + char *path; + + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY) + return; + + dbus_message_iter_recurse(iter, &array); + list_service_array(&array); + + dbus_message_iter_next(iter); + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY) + return; + + fprintf(stdout, "\n}, {"); + + dbus_message_iter_recurse(iter, &array); + while (dbus_message_iter_get_arg_type(&array) + == DBUS_TYPE_OBJECT_PATH) { + dbus_message_iter_get_basic(&array, &path); + fprintf(stdout, "\n%-24s %s", "removed", path); + + dbus_message_iter_next(&array); + } + +} + + static int append_property_array(DBusMessageIter *iter, char *property, char **data, int num_args) { diff --git a/client/services.h b/client/services.h index e18fde18..9cec0e9c 100644 --- a/client/services.h +++ b/client/services.h @@ -2,7 +2,7 @@ * * Connection Manager * - * Copyright (C) 2012 Intel Corporation. All rights reserved. + * Copyright (C) 2012-2013 Intel Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,6 +34,7 @@ struct service_data { }; int parse_boolean(char *arg); +void __connmanctl_services_list(DBusMessageIter *iter); char *strip_service_path(char *service); void extract_service_name(DBusMessageIter *dict, struct service_data *service); int set_service_property(DBusConnection *connection, DBusMessage *message, |