Send signal when service strength changes
[connman] / src / service.c
index 605b9ef..a799477 100644 (file)
@@ -42,6 +42,7 @@ struct connman_service {
        enum connman_service_state state;
        connman_uint8_t strength;
        connman_bool_t favorite;
+       connman_bool_t hidden;
        GTimeVal modified;
        unsigned int order;
        char *name;
@@ -141,8 +142,8 @@ static const char *security2string(enum connman_service_security security)
                return "wep";
        case CONNMAN_SERVICE_SECURITY_WPA:
                return "wpa";
-       case CONNMAN_SERVICE_SECURITY_WPA2:
-               return "wpa2";
+       case CONNMAN_SERVICE_SECURITY_RSN:
+               return "rsn";
        }
 
        return NULL;
@@ -202,6 +203,36 @@ static void state_changed(struct connman_service *service)
        g_dbus_send_message(connection, signal);
 }
 
+static void strength_changed(struct connman_service *service)
+{
+       DBusMessage *signal;
+       DBusMessageIter entry, value;
+       const char *key = "Strength";
+
+       if (service->path == NULL)
+               return;
+
+       if (service->strength == 0)
+               return;
+
+       signal = dbus_message_new_signal(service->path,
+                               CONNMAN_SERVICE_INTERFACE, "PropertyChanged");
+       if (signal == NULL)
+               return;
+
+       dbus_message_iter_init_append(signal, &entry);
+
+       dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
+
+       dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
+                                       DBUS_TYPE_STRING_AS_STRING, &value);
+       dbus_message_iter_append_basic(&value, DBUS_TYPE_BYTE,
+                                                       &service->strength);
+       dbus_message_iter_close_container(&entry, &value);
+
+       g_dbus_send_message(connection, signal);
+}
+
 static DBusMessage *get_properties(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
@@ -357,10 +388,13 @@ static DBusMessage *connect_service(DBusConnection *conn,
        if (service->network != NULL) {
                int err;
 
+               if (service->hidden == TRUE)
+                       return __connman_error_invalid_service(msg);
+
                connman_network_set_string(service->network,
                                "WiFi.Passphrase", service->passphrase);
 
-               err = connman_network_connect(service->network);
+               err = __connman_network_connect(service->network);
                if (err < 0 && err != -EINPROGRESS)
                        return __connman_error_failed(msg, -err);
 
@@ -605,6 +639,7 @@ static void __connman_service_initialize(struct connman_service *service)
        service->state    = CONNMAN_SERVICE_STATE_UNKNOWN;
 
        service->favorite = FALSE;
+       service->hidden = FALSE;
 
        service->order = 0;
 }
@@ -818,6 +853,13 @@ int __connman_service_indicate_state(struct connman_service *service,
        return 0;
 }
 
+int __connman_service_indicate_default(struct connman_service *service)
+{
+       DBG("service %p", service);
+
+       return 0;
+}
+
 /**
  * __connman_service_lookup:
  * @identifier: service identifier
@@ -1068,8 +1110,8 @@ static enum connman_service_mode convert_wifi_security(const char *security)
                return CONNMAN_SERVICE_SECURITY_WEP;
        else if (g_str_equal(security, "wpa") == TRUE)
                return CONNMAN_SERVICE_SECURITY_WPA;
-       else if (g_str_equal(security, "wpa2") == TRUE)
-               return CONNMAN_SERVICE_SECURITY_WPA2;
+       else if (g_str_equal(security, "rsn") == TRUE)
+               return CONNMAN_SERVICE_SECURITY_RSN;
        else
                return CONNMAN_SERVICE_SECURITY_UNKNOWN;
 }
@@ -1085,6 +1127,11 @@ static void update_from_network(struct connman_service *service,
        if (str != NULL) {
                g_free(service->name);
                service->name = g_strdup(str);
+               service->hidden = FALSE;
+       } else {
+               g_free(service->name);
+               service->name = NULL;
+               service->hidden = TRUE;
        }
 
        service->strength = connman_network_get_uint8(network, "Strength");
@@ -1098,6 +1145,8 @@ static void update_from_network(struct connman_service *service,
        if (service->strength > strength && service->network != NULL) {
                connman_network_unref(service->network);
                service->network = NULL;
+
+               strength_changed(service);
        }
 
        if (service->network == NULL) {