---
 src/service.c |   78 +++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 67 insertions(+), 11 deletions(-)

diff --git a/src/service.c b/src/service.c
index 2cfbdb8..fbf9431 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1148,6 +1148,19 @@ static struct connman_service 
*__connman_service_lookup(const char *identifier)
        return NULL;
 }
 
+static void convert_name(const char *ssid, char *name,
+                                       unsigned int ssid_len)
+{
+       unsigned int i;
+
+       for (i = 0; i < ssid_len; i++) {
+               if (g_ascii_isprint(ssid[i]))
+                       name[i] = ssid[i];
+               else
+                       name[i] = ' ';
+       }
+}
+
 int __connman_service_create_and_connect(DBusMessage *msg)
 {
        struct connman_service *service;
@@ -1155,6 +1168,7 @@ int __connman_service_create_and_connect(DBusMessage *msg)
        DBusMessageIter iter, array;
        const char *mode = "managed", *security = "none";
        const char *type = NULL, *ssid = NULL, *passphrase = NULL;
+       unsigned int ssid_len = 0;
        const char *ident;
        char *name, *group;
        int err;
@@ -1202,6 +1216,7 @@ int __connman_service_create_and_connect(DBusMessage *msg)
        if (ssid == NULL)
                return -EINVAL;
 
+       ssid_len = strlen(ssid);
        device = __connman_element_find_device(CONNMAN_DEVICE_TYPE_WIFI);
        if (device == NULL)
                return -EOPNOTSUPP;
@@ -1211,14 +1226,12 @@ int __connman_service_create_and_connect(DBusMessage 
*msg)
                return -EOPNOTSUPP;
 
        group = connman_wifi_build_group_name((unsigned char *) ssid,
-                                               strlen(ssid), mode, security);
+                                               ssid_len, mode, security);
        if (group == NULL)
                return -EINVAL;
 
        name = g_strdup_printf("%s_%s_%s", type, ident, group);
 
-       g_free(group);
-
        service = __connman_service_lookup(name);
 
        g_free(name);
@@ -1228,19 +1241,62 @@ int __connman_service_create_and_connect(DBusMessage 
*msg)
                        g_free(service->passphrase);
                        service->passphrase = g_strdup(passphrase);
                }
+       } else {
+               struct connman_network *network;
+               char *net_name;
+               int index;
+
+               network = connman_network_create("00_00_00_00_00_00",
+                                               CONNMAN_NETWORK_TYPE_WIFI);
+               if (network == NULL) {
+                       g_free(group);
+                       return -ENOMEM;
+               }
 
-               err = __connman_service_connect(service);
-               if (err < 0 && err != -EINPROGRESS)
-                       return err;
+               connman_network_set_blob(network, "WiFi.SSID", ssid, ssid_len);
 
-               g_dbus_send_reply(connection, msg,
-                                       DBUS_TYPE_OBJECT_PATH, &service->path,
-                                                       DBUS_TYPE_INVALID);
+               net_name = g_try_malloc0(ssid_len + 1);
+               if (name == NULL) {
+                       g_free(group);
+                       return -ENOMEM;
+               }
 
-               return 0;
+               convert_name(ssid, net_name, ssid_len);
+               connman_network_set_name(network, net_name);
+               g_free(net_name);
+
+               connman_network_set_string(network, "WiFi.Mode", mode);
+               connman_network_set_string(network, "WiFi.Security", security);
+               connman_network_set_string(network, "WiFi.Passphrase", 
passphrase);
+
+               connman_network_set_group(network, group);
+
+               index = connman_device_get_index(device);
+               connman_network_set_index(network, index);
+
+               connman_network_set_protocol(network,
+                               CONNMAN_NETWORK_PROTOCOL_IP);
+
+               connman_device_add_network(device, network);
+
+               connman_network_set_available(network, TRUE);
+
+               service = __connman_service_lookup_from_network(network);
        }
 
-       return -EOPNOTSUPP;
+       g_free(group);
+
+       if (service == NULL)
+               return -EOPNOTSUPP;
+
+       err = __connman_service_connect(service);
+       if (err < 0 && err != -EINPROGRESS)
+               return err;
+
+       g_dbus_send_reply(connection, msg,
+                               DBUS_TYPE_OBJECT_PATH, &service->path,
+                                                       DBUS_TYPE_INVALID);
+       return 0;
 }
 
 /**
-- 
1.6.1.3

_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to