X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fprofile.c;h=8984872fe8677a034fca9e9a3137eae9b99b322b;hb=99e2ce4aae8dcfa02a4c772053396177648bdebf;hp=c94a76276c97df027b81cf10507324f9dbaac772;hpb=5d59515eb52adf085f9f124120bbaa2300d17c2e;p=connman diff --git a/src/profile.c b/src/profile.c index c94a762..8984872 100644 --- a/src/profile.c +++ b/src/profile.c @@ -28,163 +28,22 @@ #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) -{ - 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); -} - -static DBusMessage *remove_service(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - return __connman_error_not_implemented(msg); -} - -static DBusMessage *move_before(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - return __connman_error_not_implemented(msg); -} - -static DBusMessage *move_after(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - return __connman_error_not_implemented(msg); -} - -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" }, - { }, -}; - -const char *__connman_profile_active(void) +const char *__connman_profile_active_ident(void) { DBG(""); - return PROFILE_DEFAULT; + return PROFILE_DEFAULT_IDENT; } -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) +const char *__connman_profile_active_path(void) { DBG(""); - g_sequence_foreach(groups, append_path, iter); + return "/profile/" PROFILE_DEFAULT_IDENT; } static void append_services(DBusMessageIter *entry) @@ -200,15 +59,15 @@ static void append_services(DBusMessageIter *entry) dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter); - __connman_profile_list_services(&iter); + __connman_service_list(&iter); dbus_message_iter_close_container(&value, &iter); dbus_message_iter_close_container(entry, &value); } -static void emit_services_signal(void) +void __connman_profile_changed(void) { - const char *path = __connman_profile_active(); + const char *path = __connman_profile_active_path(); DBusMessage *signal; DBusMessageIter entry; @@ -231,225 +90,72 @@ static void emit_services_signal(void) g_dbus_send_message(connection, signal); } -static void free_group(gpointer data) -{ - struct connman_group *group = data; - - DBG("group %p", group); - - g_dbus_unregister_interface(connection, group->path, - CONNMAN_SERVICE_INTERFACE); - - 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); -} - -static gint compare_group(gconstpointer a, gconstpointer b, gpointer user_data) -{ - struct connman_group *group_a = (void *) a; - struct connman_group *group_b = (void *) b; - - if (group_a->favorite == TRUE && group_b->favorite == FALSE) - return -1; - - if (group_a->favorite == FALSE && group_b->favorite == TRUE) - return 1; - - return (gint) group_b->strength - (gint) group_a->strength; -} - -static gint search_group(gconstpointer a, gconstpointer b, gpointer user_data) -{ - struct connman_group *group = (void *) a; - - return g_strcmp0(group->id, user_data); -} - -static struct connman_group *lookup_group(const char *name) -{ - GSequenceIter *iter; - struct connman_group *group; - - DBG("name %s", name); - - if (name == NULL) - return NULL; - - iter = g_sequence_search(groups, NULL, search_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_insert_sorted(groups, group, - compare_group, NULL); - - g_dbus_register_interface(connection, group->path, - CONNMAN_SERVICE_INTERFACE, - service_methods, service_signals, - NULL, group, NULL); - -done: - DBG("group %p", group); - - return group; -} - 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)); - - g_sequence_sort_changed(group->iter, compare_group, NULL); - emit_services_signal(); - 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; - g_free(group->type); - group->type = NULL; - - g_sequence_sort_changed(group->iter, compare_group, NULL); - emit_services_signal(); + __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")); - } - - g_sequence_sort_changed(group->iter, compare_group, NULL); - emit_services_signal(); - 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) + service = __connman_service_lookup_from_network(network); + if (service == 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) - return -EINVAL; - - if (group->network == network) { - g_free(group->security); - group->security = NULL; - - g_free(group->mode); - group->mode = NULL; - - group->network = NULL; - } - - g_free(group->type); - group->type = NULL; - - g_sequence_sort_changed(group->iter, compare_group, NULL); - emit_services_signal(); + __connman_service_put(service); return 0; } 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 DBusMessage *profile_properties(DBusConnection *conn, +static DBusMessage *get_properties(DBusConnection *conn, DBusMessage *msg, void *data) { const char *name = "Default"; @@ -483,7 +189,7 @@ static DBusMessage *profile_properties(DBusConnection *conn, } static GDBusMethodTable profile_methods[] = { - { "GetProperties", "", "a{sv}", profile_properties }, + { "GetProperties", "", "a{sv}", get_properties }, { }, }; @@ -494,15 +200,15 @@ static GDBusSignalTable profile_signals[] = { 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, + g_dbus_register_interface(connection, path, CONNMAN_PROFILE_INTERFACE, profile_methods, profile_signals, NULL, NULL, NULL); @@ -512,14 +218,13 @@ int __connman_profile_init(DBusConnection *conn) 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;