X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftechnology.c;h=3781b0c14a711f22345b67a887bdabab5aea4f03;hb=89077bfd2abf7984027552c8cee223a0c6dab57c;hp=2b34f50816ee134cb81f5ceee19c4c8dc92a00f1;hpb=a4990946d6ae42a4f66439acca63668c61690990;p=framework%2Fconnectivity%2Fconnman.git diff --git a/src/technology.c b/src/technology.c index 2b34f50..3781b0c 100644 --- a/src/technology.c +++ b/src/technology.c @@ -2,7 +2,7 @@ * * Connection Manager * - * Copyright (C) 2007-2010 Intel Corporation. All rights reserved. + * Copyright (C) 2007-2012 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 version 2 as @@ -91,7 +91,7 @@ static void rfkill_check(gpointer key, gpointer value, gpointer user_data) /* Calling _technology_rfkill_add will update the tech. */ if (rfkill->type == type) - __connman_technology_add_rfkill(rfkill->index, type, + __connman_technology_add_rfkill(rfkill->index, type, rfkill->softblock, rfkill->hardblock); } @@ -292,64 +292,73 @@ static const char *get_name(enum connman_service_type type) return NULL; } -static void load_state(struct connman_technology *technology) +static void save_state(struct connman_technology *technology) { GKeyFile *keyfile; gchar *identifier; - GError *error = NULL; - connman_bool_t enable; DBG("technology %p", technology); keyfile = __connman_storage_load_global(); - /* Fallback on disabling technology if file not found. */ - if (keyfile == NULL) { - technology->enable_persistent = FALSE; - return; - } + if (keyfile == NULL) + keyfile = g_key_file_new(); identifier = g_strdup_printf("%s", get_name(technology->type)); if (identifier == NULL) goto done; - enable = g_key_file_get_boolean(keyfile, identifier, "Enable", &error); - if (error == NULL) - technology->enable_persistent = enable; - else { - technology->enable_persistent = FALSE; - g_clear_error(&error); - } + g_key_file_set_boolean(keyfile, identifier, "Enable", + technology->enable_persistent); + done: g_free(identifier); + __connman_storage_save_global(keyfile); + g_key_file_free(keyfile); return; } -static void save_state(struct connman_technology *technology) +static void load_state(struct connman_technology *technology) { GKeyFile *keyfile; gchar *identifier; + GError *error = NULL; + connman_bool_t enable; DBG("technology %p", technology); keyfile = __connman_storage_load_global(); - if (keyfile == NULL) - keyfile = g_key_file_new(); + /* Fallback on disabling technology if file not found. */ + if (keyfile == NULL) { + if (technology->type == CONNMAN_SERVICE_TYPE_ETHERNET) + /* We enable ethernet by default */ + technology->enable_persistent = TRUE; + else + technology->enable_persistent = FALSE; + return; + } identifier = g_strdup_printf("%s", get_name(technology->type)); if (identifier == NULL) goto done; - g_key_file_set_boolean(keyfile, identifier, "Enable", - technology->enable_persistent); + enable = g_key_file_get_boolean(keyfile, identifier, "Enable", &error); + if (error == NULL) + technology->enable_persistent = enable; + else { + if (technology->type == CONNMAN_SERVICE_TYPE_ETHERNET) + technology->enable_persistent = TRUE; + else + technology->enable_persistent = FALSE; + save_state(technology); + g_clear_error(&error); + } done: g_free(identifier); - __connman_storage_save_global(keyfile); - g_key_file_free(keyfile); return; @@ -387,12 +396,12 @@ static connman_bool_t connman_technology_load_offlinemode() /* If there is a error, we enable offlinemode */ keyfile = __connman_storage_load_global(); if (keyfile == NULL) - return TRUE; + return FALSE; offlinemode = g_key_file_get_boolean(keyfile, "global", "OfflineMode", &error); if (error != NULL) { - offlinemode = TRUE; + offlinemode = FALSE; g_clear_error(&error); } @@ -600,7 +609,10 @@ done: technology->pending_timeout = g_timeout_add_seconds(10, technology_pending_reply, technology); } else { - reply = __connman_error_failed(msg, -err); + if (err == -EALREADY) + reply = __connman_error_already_enabled(msg); + else + reply = __connman_error_failed(msg, -err); if (reply != NULL) g_dbus_send_message(connection, reply); } @@ -661,7 +673,10 @@ done: technology->pending_timeout = g_timeout_add_seconds(10, technology_pending_reply, technology); } else { - reply = __connman_error_failed(msg, -err); + if (err == -EALREADY) + reply = __connman_error_already_disabled(msg); + else + reply = __connman_error_failed(msg, -err); if (reply != NULL) g_dbus_send_message(connection, reply); } @@ -822,7 +837,7 @@ void __connman_technology_scan_stopped(struct connman_device *device) if (__connman_device_get_service_type(other_device) != type) continue; - if (__connman_device_scanning(other_device)) + if (connman_device_get_scanning(other_device) == TRUE) count += 1; } @@ -849,16 +864,20 @@ static DBusMessage *scan(DBusConnection *conn, DBusMessage *msg, void *data) return NULL; } -static GDBusMethodTable technology_methods[] = { - { "GetProperties", "", "a{sv}", get_properties }, - { "SetProperty", "sv", "", set_property }, - { "Scan", "", "", scan, - G_DBUS_METHOD_FLAG_ASYNC }, +static const GDBusMethodTable technology_methods[] = { + { GDBUS_DEPRECATED_METHOD("GetProperties", + NULL, GDBUS_ARGS({ "properties", "a{sv}" }), + get_properties) }, + { GDBUS_METHOD("SetProperty", + GDBUS_ARGS({ "name", "s" }, { "value", "v" }), + NULL, set_property) }, + { GDBUS_ASYNC_METHOD("Scan", NULL, NULL, scan) }, { }, }; -static GDBusSignalTable technology_signals[] = { - { "PropertyChanged", "sv" }, +static const GDBusSignalTable technology_signals[] = { + { GDBUS_SIGNAL("PropertyChanged", + GDBUS_ARGS({ "name", "s" }, { "value", "v" })) }, { }, }; @@ -1088,9 +1107,6 @@ int __connman_technology_remove_device(struct connman_device *device) return -ENXIO; } - if (__connman_device_scanning(device)) - __connman_technology_scan_stopped(device); - technology->device_list = g_slist_remove(technology->device_list, device); technology_put(technology); @@ -1121,8 +1137,10 @@ int __connman_technology_enabled(enum connman_service_type type) if (technology == NULL) return -ENXIO; - if (__sync_fetch_and_add(&technology->enabled, 1) == 0) - powered_changed(technology); + if (__sync_fetch_and_add(&technology->enabled, 1) != 0) + return -EALREADY; + + powered_changed(technology); if (technology->pending_reply != NULL) { g_dbus_send_reply(connection, technology->pending_reply, DBUS_TYPE_INVALID); @@ -1143,6 +1161,9 @@ int __connman_technology_disabled(enum connman_service_type type) if (technology == NULL) return -ENXIO; + if (__sync_fetch_and_sub(&technology->enabled, 1) != 1) + return -EINPROGRESS; + if (technology->pending_reply != NULL) { g_dbus_send_reply(connection, technology->pending_reply, DBUS_TYPE_INVALID); dbus_message_unref(technology->pending_reply); @@ -1151,8 +1172,7 @@ int __connman_technology_disabled(enum connman_service_type type) technology->pending_timeout = 0; } - if (__sync_fetch_and_sub(&technology->enabled, 1) == 1) - powered_changed(technology); + powered_changed(technology); return 0; } @@ -1346,6 +1366,9 @@ int __connman_technology_init(void) global_offlinemode = connman_technology_load_offlinemode(); + /* This will create settings file if it is missing */ + connman_technology_save_offlinemode(); + return 0; }