X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fprofile.c;h=8984872fe8677a034fca9e9a3137eae9b99b322b;hb=99e2ce4aae8dcfa02a4c772053396177648bdebf;hp=bba803c88ff9cf0caf4515f4adfc6d11bafb3918;hpb=10fb79650eded22a5deb030653f56da9b1baeba1;p=connman diff --git a/src/profile.c b/src/profile.c index bba803c..8984872 100644 --- a/src/profile.c +++ b/src/profile.c @@ -28,380 +28,139 @@ #include "connman.h" -#define PROFILE_DEFAULT "/profile/default" - -enum connman_service_state { - CONNMAN_SERVICE_STATE_UNKNOWN = 0, - CONNMAN_SERVICE_STATE_IDLE = 1, -}; - -struct connman_group { - GSequenceIter *iter; - char *id; - char *path; - char *type; - char *name; - char *mode; - char *security; - connman_uint8_t strength; - connman_bool_t favorite; - enum connman_service_state state; - struct connman_network *network; -}; - -static GSequence *groups = NULL; +#define PROFILE_DEFAULT_IDENT "default" static DBusConnection *connection = NULL; -static const char *state2string(enum connman_service_state state) -{ - switch (state) { - case CONNMAN_SERVICE_STATE_UNKNOWN: - break; - case CONNMAN_SERVICE_STATE_IDLE: - return "idle"; - } - - return NULL; -} - -static DBusMessage *get_properties(DBusConnection *conn, - DBusMessage *msg, void *data) +const char *__connman_profile_active_ident(void) { - struct connman_group *group = data; - DBusMessage *reply; - DBusMessageIter array, dict; - const char *str; - - DBG("conn %p", conn); - - reply = dbus_message_new_method_return(msg); - if (reply == NULL) - return NULL; - - dbus_message_iter_init_append(reply, &array); - - dbus_message_iter_open_container(&array, 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); - - str = state2string(group->state); - if (str != NULL) - connman_dbus_dict_append_variant(&dict, "State", - DBUS_TYPE_STRING, &str); - - if (group->type != NULL) - connman_dbus_dict_append_variant(&dict, "Type", - DBUS_TYPE_STRING, &group->type); - - if (group->name != NULL) - connman_dbus_dict_append_variant(&dict, "Name", - DBUS_TYPE_STRING, &group->name); - - if (group->mode != NULL) - connman_dbus_dict_append_variant(&dict, "Mode", - DBUS_TYPE_STRING, &group->mode); - - if (group->security != NULL) - connman_dbus_dict_append_variant(&dict, "Security", - DBUS_TYPE_STRING, &group->security); - - if (group->strength > 0) - connman_dbus_dict_append_variant(&dict, "Strength", - DBUS_TYPE_BYTE, &group->strength); - - connman_dbus_dict_append_variant(&dict, "Favorite", - DBUS_TYPE_BOOLEAN, &group->favorite); - - dbus_message_iter_close_container(&array, &dict); - - return reply; -} - -static DBusMessage *connect_service(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - return __connman_error_not_implemented(msg); -} - -static DBusMessage *disconnect_service(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - return __connman_error_not_implemented(msg); -} + DBG(""); -static DBusMessage *remove_service(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - return __connman_error_not_implemented(msg); + return PROFILE_DEFAULT_IDENT; } -static DBusMessage *move_before(DBusConnection *conn, - DBusMessage *msg, void *data) +const char *__connman_profile_active_path(void) { - return __connman_error_not_implemented(msg); -} + DBG(""); -static DBusMessage *move_after(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - return __connman_error_not_implemented(msg); + return "/profile/" PROFILE_DEFAULT_IDENT; } -static GDBusMethodTable service_methods[] = { - { "GetProperties", "", "a{sv}", get_properties }, - { "Connect", "", "", connect_service }, - { "Disconnect", "", "", disconnect_service }, - { "Remove", "", "", remove_service }, - { "MoveBefore", "o", "", move_before }, - { "MoveAfter", "o", "", move_after }, - { }, -}; - -static GDBusSignalTable service_signals[] = { - { "PropertyChanged", "sv" }, - { }, -}; - -static void free_group(gpointer data) +static void append_services(DBusMessageIter *entry) { - struct connman_group *group = data; - - DBG("group %p", group); + DBusMessageIter value, iter; + const char *key = "Services"; - g_dbus_unregister_interface(connection, group->path, - CONNMAN_SERVICE_INTERFACE); + dbus_message_iter_append_basic(entry, DBUS_TYPE_STRING, &key); - g_free(group->security); - g_free(group->mode); - g_free(group->name); - g_free(group->type); - g_free(group->path); - g_free(group->id); - g_free(group); -} + dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT, + DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING, + &value); -static gint compare_group(gconstpointer a, gconstpointer b, gpointer user_data) -{ - struct connman_group *group = (void *) a; + dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY, + DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter); + __connman_service_list(&iter); + dbus_message_iter_close_container(&value, &iter); - return g_strcmp0(group->id, user_data); + dbus_message_iter_close_container(entry, &value); } -static struct connman_group *lookup_group(const char *name) +void __connman_profile_changed(void) { - GSequenceIter *iter; - struct connman_group *group; - - DBG("name %s", name); + const char *path = __connman_profile_active_path(); + DBusMessage *signal; + DBusMessageIter entry; - if (name == NULL) - return NULL; - - iter = g_sequence_search(groups, NULL, compare_group, (char *) name); - if (g_sequence_iter_is_begin(iter) == FALSE && - g_sequence_iter_is_end(iter) == FALSE) { - group = g_sequence_get(iter); - if (group != NULL) - goto done; - } - - group = g_try_new0(struct connman_group, 1); - if (group == NULL) - return NULL; - - group->id = g_strdup(name); - - group->type = CONNMAN_ELEMENT_TYPE_UNKNOWN; - group->path = g_strdup_printf("%s/%s", PROFILE_DEFAULT, name); - - group->favorite = FALSE; - - group->state = CONNMAN_SERVICE_STATE_IDLE; - - group->iter = g_sequence_append(groups, group); + signal = dbus_message_new_signal(path, + CONNMAN_PROFILE_INTERFACE, "PropertyChanged"); + if (signal == NULL) + return; - g_dbus_register_interface(connection, group->path, - CONNMAN_SERVICE_INTERFACE, - service_methods, service_signals, - NULL, group, NULL); + dbus_message_iter_init_append(signal, &entry); + append_services(&entry); + g_dbus_send_message(connection, signal); -done: - DBG("group %p", group); + signal = dbus_message_new_signal(CONNMAN_MANAGER_PATH, + CONNMAN_MANAGER_INTERFACE, "PropertyChanged"); + if (signal == NULL) + return; - return group; + dbus_message_iter_init_append(signal, &entry); + append_services(&entry); + g_dbus_send_message(connection, signal); } int __connman_profile_add_device(struct connman_device *device) { - struct connman_group *group; - char *name; + struct connman_service *service; DBG("device %p", device); - name = g_strdup_printf("%s_%d", __connman_device_get_type(device), - connman_device_get_index(device)); - group = lookup_group(name); - g_free(name); - - if (group == NULL) + service = __connman_service_create_from_device(device); + if (service == NULL) return -EINVAL; - group->type = g_strdup(__connman_device_get_type(device)); - return 0; } int __connman_profile_remove_device(struct connman_device *device) { - struct connman_group *group; - char *name; + struct connman_service *service; DBG("device %p", device); - name = g_strdup_printf("%s_%d", __connman_device_get_type(device), - connman_device_get_index(device)); - group = lookup_group(name); - g_free(name); - - if (group == NULL) + service = __connman_service_lookup_from_device(device); + if (service == NULL) return -EINVAL; + __connman_service_put(service); + return 0; } int __connman_profile_add_network(struct connman_network *network) { - struct connman_group *group; - char *name; + struct connman_service *service; DBG("network %p", network); - if (__connman_network_get_group(network) == NULL) - return -EINVAL; - - name = g_strdup_printf("%s_%s", __connman_network_get_type(network), - __connman_network_get_group(network)); - group = lookup_group(name); - g_free(name); - - if (group == NULL) + service = __connman_service_create_from_network(network); + if (service == NULL) return -EINVAL; - g_free(group->type); - g_free(group->name); - - group->type = g_strdup(__connman_network_get_type(network)); - group->name = g_strdup(connman_network_get_string(network, "Name")); - - group->strength = connman_network_get_uint8(network, "Strength"); - - if (group->network == NULL) { - group->network = network; - - group->mode = g_strdup(connman_network_get_string(network, - "WiFi.Mode")); - group->security = g_strdup(connman_network_get_string(network, - "WiFi.Security")); - } - return 0; } int __connman_profile_remove_network(struct connman_network *network) { - struct connman_group *group; - char *name; + struct connman_service *service; DBG("network %p", network); - if (__connman_network_get_group(network) == NULL) - return -EINVAL; - - name = g_strdup_printf("%s_%s", __connman_network_get_type(network), - __connman_network_get_group(network)); - group = lookup_group(name); - g_free(name); - - if (group == NULL) + service = __connman_service_lookup_from_network(network); + if (service == NULL) return -EINVAL; - if (group->network == network) { - g_free(group->security); - group->security = NULL; - - g_free(group->mode); - group->mode = NULL; - - group->network = NULL; - } + __connman_service_put(service); return 0; } -const char *__connman_profile_active(void) -{ - DBG(""); - - return PROFILE_DEFAULT; -} - void __connman_profile_list(DBusMessageIter *iter) { - const char *path = __connman_profile_active(); + const char *path = __connman_profile_active_path(); DBG(""); dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path); } -static void append_path(gpointer value, gpointer user_data) -{ - struct connman_group *group = value; - DBusMessageIter *iter = user_data; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, - &group->path); -} - -void __connman_profile_list_services(DBusMessageIter *iter) -{ - DBG(""); - - g_sequence_foreach(groups, append_path, iter); -} - -static void append_services(DBusMessageIter *dict) -{ - DBusMessageIter entry, value, iter; - const char *key = "Services"; - - dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY, - NULL, &entry); - - dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key); - - dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT, - DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING, - &value); - - dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY, - DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter); - __connman_profile_list_services(&iter); - dbus_message_iter_close_container(&value, &iter); - - dbus_message_iter_close_container(&entry, &value); - - dbus_message_iter_close_container(dict, &entry); -} - -static DBusMessage *profile_properties(DBusConnection *conn, +static DBusMessage *get_properties(DBusConnection *conn, DBusMessage *msg, void *data) { const char *name = "Default"; DBusMessage *reply; - DBusMessageIter array, dict; + DBusMessageIter array, dict, entry; DBG("conn %p", conn); @@ -419,7 +178,10 @@ static DBusMessage *profile_properties(DBusConnection *conn, connman_dbus_dict_append_variant(&dict, "Name", DBUS_TYPE_STRING, &name); - append_services(&dict); + dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY, + NULL, &entry); + append_services(&entry); + dbus_message_iter_close_container(&dict, &entry); dbus_message_iter_close_container(&array, &dict); @@ -427,38 +189,42 @@ static DBusMessage *profile_properties(DBusConnection *conn, } static GDBusMethodTable profile_methods[] = { - { "GetProperties", "", "a{sv}", profile_properties }, + { "GetProperties", "", "a{sv}", get_properties }, + { }, +}; + +static GDBusSignalTable profile_signals[] = { + { "PropertyChanged", "sv" }, { }, }; int __connman_profile_init(DBusConnection *conn) { + const char *path = __connman_profile_active_path(); + DBG("conn %p", conn); connection = dbus_connection_ref(conn); if (connection == NULL) return -1; - groups = g_sequence_new(free_group); - - g_dbus_register_interface(connection, PROFILE_DEFAULT, - CONNMAN_PROFILE_INTERFACE, - profile_methods, - NULL, NULL, NULL, NULL); + g_dbus_register_interface(connection, path, + CONNMAN_PROFILE_INTERFACE, + profile_methods, profile_signals, + NULL, NULL, NULL); return 0; } void __connman_profile_cleanup(void) { + const char *path = __connman_profile_active_path(); + DBG("conn %p", connection); - g_dbus_unregister_interface(connection, PROFILE_DEFAULT, + g_dbus_unregister_interface(connection, path, CONNMAN_PROFILE_INTERFACE); - g_sequence_free(groups); - groups = NULL; - if (connection == NULL) return;