Only allow WiFi devices to create networks for now
[connman] / src / element.c
index 098bbae..1145053 100644 (file)
@@ -145,6 +145,28 @@ static const char *subtype2string(enum connman_element_subtype type)
        return NULL;
 }
 
+static const char *subtype2description(enum connman_element_subtype type)
+{
+       switch (type) {
+       case CONNMAN_ELEMENT_SUBTYPE_UNKNOWN:
+       case CONNMAN_ELEMENT_SUBTYPE_FAKE:
+       case CONNMAN_ELEMENT_SUBTYPE_NETWORK:
+               return NULL;
+       case CONNMAN_ELEMENT_SUBTYPE_ETHERNET:
+               return "Ethernet";
+       case CONNMAN_ELEMENT_SUBTYPE_WIFI:
+               return "Wireless";
+       case CONNMAN_ELEMENT_SUBTYPE_WIMAX:
+               return "WiMAX";
+       case CONNMAN_ELEMENT_SUBTYPE_MODEM:
+               return "Modem";
+       case CONNMAN_ELEMENT_SUBTYPE_BLUETOOTH:
+               return "Bluetooth";
+       }
+
+       return NULL;
+}
+
 const char *__connman_element_policy2string(enum connman_element_policy policy)
 {
        switch (policy) {
@@ -356,6 +378,39 @@ static void emit_enabled_signal(DBusConnection *conn,
        g_dbus_send_message(conn, signal);
 }
 
+static void emit_scanning_signal(DBusConnection *conn,
+                                       struct connman_element *element)
+{
+       DBusMessage *signal;
+       DBusMessageIter entry, value;
+       const char *key = "Scanning";
+
+       DBG("conn %p", conn);
+
+       if (element == NULL)
+               return;
+
+       if (element->type != CONNMAN_ELEMENT_TYPE_DEVICE)
+               return;
+
+       signal = dbus_message_new_signal(element->path,
+                               CONNMAN_DEVICE_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_BOOLEAN_AS_STRING, &value);
+       dbus_message_iter_append_basic(&value, DBUS_TYPE_BOOLEAN,
+                                                       &element->scanning);
+       dbus_message_iter_close_container(&entry, &value);
+
+       g_dbus_send_message(conn, signal);
+}
+
 static DBusMessage *do_update(DBusConnection *conn,
                                        DBusMessage *msg, void *data)
 {
@@ -465,6 +520,15 @@ static DBusMessage *device_get_properties(DBusConnection *conn,
                        DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
                        DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
 
+       str = subtype2description(element->subtype);
+       if (str != NULL && element->devname != NULL) {
+               char *name = g_strdup_printf("%s (%s)", str, element->devname);
+               if (name != NULL)
+                       connman_dbus_dict_append_variant(&dict, "Name",
+                                               DBUS_TYPE_STRING, &name);
+               g_free(name);
+       }
+
        str = subtype2string(element->subtype);
        if (str != NULL)
                connman_dbus_dict_append_variant(&dict, "Type",
@@ -479,7 +543,11 @@ static DBusMessage *device_get_properties(DBusConnection *conn,
                                        DBUS_TYPE_BOOLEAN, &element->enabled);
 
        if (element->subtype == CONNMAN_ELEMENT_SUBTYPE_WIFI ||
-                       element->subtype == CONNMAN_ELEMENT_SUBTYPE_WIMAX) {
+                       element->subtype == CONNMAN_ELEMENT_SUBTYPE_WIMAX ||
+                       element->subtype == CONNMAN_ELEMENT_SUBTYPE_BLUETOOTH) {
+               connman_dbus_dict_append_variant(&dict, "Scanning",
+                                       DBUS_TYPE_BOOLEAN, &element->scanning);
+
                dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY,
                                                                NULL, &entry);
                append_networks(element, &entry);
@@ -569,6 +637,9 @@ static DBusMessage *device_create_network(DBusConnection *conn,
 
        DBG("conn %p", conn);
 
+       if (element->subtype != CONNMAN_ELEMENT_SUBTYPE_WIFI)
+               return __connman_error_invalid_arguments(msg);
+
        if (dbus_message_iter_init(msg, &iter) == FALSE)
                return __connman_error_invalid_arguments(msg);
 
@@ -628,6 +699,10 @@ static DBusMessage *network_get_properties(DBusConnection *conn,
                        DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
                        DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
 
+       if (element->parent)
+               connman_dbus_dict_append_variant(&dict, "Device",
+                               DBUS_TYPE_OBJECT_PATH, &element->parent->path);
+
        str = __connman_element_policy2string(element->policy);
        if (str != NULL)
                connman_dbus_dict_append_variant(&dict, "Policy",
@@ -1988,7 +2063,9 @@ static gboolean remove_element(GNode *node, gpointer user_data)
        }
 
        if (element->type == CONNMAN_ELEMENT_TYPE_CONNECTION) {
-               emit_state_change(connection, "offline");
+               if (__connman_element_count(NULL,
+                                       CONNMAN_ELEMENT_TYPE_CONNECTION) == 0)
+                       emit_state_change(connection, "offline");
                emit_connections_signal(connection);
 
                g_dbus_unregister_interface(connection, element->path,
@@ -2089,6 +2166,19 @@ int connman_element_set_enabled(struct connman_element *element,
        return 0;
 }
 
+int connman_element_set_scanning(struct connman_element *element,
+                                                       gboolean scanning)
+{
+       if (element->scanning == scanning)
+               return 0;
+
+       element->scanning = scanning;
+
+       emit_scanning_signal(connection, element);
+
+       return 0;
+}
+
 int __connman_element_init(DBusConnection *conn, const char *device)
 {
        struct connman_element *element;