extern int connman_network_set_available(struct connman_network *network,
connman_bool_t available);
extern connman_bool_t connman_network_get_available(struct connman_network *network);
+extern int connman_network_set_associating(struct connman_network *network,
+ connman_bool_t associating);
extern int connman_network_set_connected(struct connman_network *network,
connman_bool_t connected);
extern connman_bool_t connman_network_get_connected(struct connman_network *network);
connman_network_set_connected(task->network, FALSE);
connman_device_set_scanning(task->device, FALSE);
break;
+ case WPA_ASSOCIATING:
+ connman_network_set_associating(task->network, TRUE);
+ break;
default:
+ connman_network_set_associating(task->network, FALSE);
break;
}
}
enable_network(task);
+ connman_network_set_associating(task->network, TRUE);
+
return 0;
}
return -ENODEV;
service = __connman_element_get_service(element);
- __connman_service_ready(service);
+ __connman_service_indicate_state(service,
+ CONNMAN_SERVICE_STATE_READY);
if (gateway == NULL)
return 0;
DBG("element %p name %s", element, element->name);
service = __connman_element_get_service(element);
- __connman_service_disconnect(service);
+ __connman_service_indicate_state(service,
+ CONNMAN_SERVICE_STATE_DISCONNECT);
unregister_interface(element);
int __connman_dbus_init(DBusConnection *conn);
void __connman_dbus_cleanup(void);
-DBusMessage *__connman_error_failed(DBusMessage *msg);
+DBusMessage *__connman_error_failed(DBusMessage *msg, int errnum);
DBusMessage *__connman_error_invalid_arguments(DBusMessage *msg);
DBusMessage *__connman_error_permission_denied(DBusMessage *msg);
DBusMessage *__connman_error_not_supported(DBusMessage *msg);
int __connman_service_set_carrier(struct connman_service *service,
connman_bool_t carrier);
-int __connman_service_indicate_configuration(struct connman_service *service);
-int __connman_service_ready(struct connman_service *service);
-int __connman_service_disconnect(struct connman_service *service);
+int __connman_service_indicate_state(struct connman_service *service,
+ enum connman_service_state state);
#include <connman/notifier.h>
device->disconnected = FALSE;
- __connman_service_indicate_configuration(service);
+ __connman_service_indicate_state(service,
+ CONNMAN_SERVICE_STATE_CONFIGURATION);
}
} else
connman_element_unregister_children(&device->element);
err = set_powered(device, powered);
if (err < 0 && err != -EINPROGRESS)
- return __connman_error_failed(msg);
+ return __connman_error_failed(msg, -err);
} else if (g_str_equal(name, "Policy") == TRUE) {
enum connman_device_policy policy;
const char *str;
err = set_policy(conn, device, policy);
if (err < 0)
- return __connman_error_failed(msg);
+ return __connman_error_failed(msg, -err);
} else if (g_str_equal(name, "Priority") == TRUE) {
connman_uint8_t priority;
network = connman_network_create("00_00_00_00_00_00", type);
if (network == NULL)
- return __connman_error_failed(msg);
+ return __connman_error_failed(msg, ENOMEM);
while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
DBusMessageIter entry, value;
connman_network_unref(network);
if (err < 0)
- return __connman_error_failed(msg);
+ return __connman_error_failed(msg, -err);
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
return __connman_error_not_supported(msg);
if (device->powered == FALSE)
- return __connman_error_failed(msg);
+ return __connman_error_failed(msg, EINVAL);
err = device->driver->scan(device);
if (err < 0)
- return __connman_error_failed(msg);
+ return __connman_error_failed(msg, -err);
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
#include <config.h>
#endif
+#include <errno.h>
+#include <string.h>
+
#include <gdbus.h>
#include "connman.h"
-DBusMessage *__connman_error_failed(DBusMessage *msg)
+DBusMessage *__connman_error_failed(DBusMessage *msg, int errnum)
{
+ const char *str = strerror(errnum);
+
return g_dbus_create_error(msg, CONNMAN_ERROR_INTERFACE
- ".Failed", NULL);
+ ".Failed", str);
}
DBusMessage *__connman_error_invalid_arguments(DBusMessage *msg)
struct connman_element element;
enum connman_network_type type;
enum connman_network_protocol protocol;
+ connman_bool_t associating;
connman_bool_t secondary;
connman_bool_t available;
connman_bool_t connected;
return __connman_error_permission_denied(msg);
if (network->connected == TRUE)
- return __connman_error_failed(msg);
+ return __connman_error_failed(msg, EALREADY);
if (network->driver && network->driver->connect) {
enum connman_device_mode mode;
err = network->driver->connect(network);
if (err < 0 && err != -EINPROGRESS)
- return __connman_error_failed(msg);
+ return __connman_error_failed(msg, -err);
} else
network->connected = TRUE;
return __connman_error_permission_denied(msg);
if (network->connected == FALSE)
- return __connman_error_failed(msg);
+ return __connman_error_failed(msg, EINVAL);
connman_element_unregister_children(&network->element);
if (network->driver && network->driver->disconnect) {
err = network->driver->disconnect(network);
if (err < 0 && err != -EINPROGRESS)
- return __connman_error_failed(msg);
+ return __connman_error_failed(msg, -err);
} else
network->connected = FALSE;
static gboolean set_connected(gpointer user_data)
{
struct connman_network *network = user_data;
+ struct connman_service *service;
+
+ service = __connman_service_lookup_from_network(network);
if (network->connected == TRUE) {
struct connman_element *element;
if (connman_element_register(element,
&network->element) < 0)
connman_element_unref(element);
+
+ __connman_service_indicate_state(service,
+ CONNMAN_SERVICE_STATE_CONFIGURATION);
}
} else {
+ __connman_service_indicate_state(service,
+ CONNMAN_SERVICE_STATE_IDLE);
+
connman_element_unregister_children(&network->element);
__connman_device_set_network(network->device, NULL);
}
/**
+ * connman_network_set_associating:
+ * @network: network structure
+ * @associating: associating state
+ *
+ * Change associating state of network
+ */
+int connman_network_set_associating(struct connman_network *network,
+ connman_bool_t associating)
+{
+ DBG("network %p associating %d", network, associating);
+
+ if (network->associating == associating)
+ return -EALREADY;
+
+ network->associating = associating;
+
+ if (associating == TRUE) {
+ struct connman_service *service;
+
+ service = __connman_service_lookup_from_network(network);
+ __connman_service_indicate_state(service,
+ CONNMAN_SERVICE_STATE_ASSOCIATION);
+ }
+
+ return 0;
+}
+
+/**
* connman_network_set_connected:
* @network: network structure
* @connected: connected state
network->connected = connected;
+ if (connected == TRUE)
+ network->associating = FALSE;
+
if (network->registered == FALSE) {
g_idle_add(set_connected, network);
return 0;
if (service->network != NULL) {
int err;
+ connman_network_set_string(service->network,
+ "WiFi.Passphrase", service->passphrase);
+
err = connman_network_connect(service->network);
if (err < 0 && err != -EINPROGRESS)
- return __connman_error_failed(msg);
-
- service->state = CONNMAN_SERVICE_STATE_ASSOCIATION;
-
- state_changed(service);
+ return __connman_error_failed(msg, -err);
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
- }
-
- if (service->device != NULL) {
+ } else if (service->device != NULL) {
if (service->favorite == FALSE)
return __connman_error_no_carrier(msg);
if (__connman_device_connect(service->device) < 0)
- return __connman_error_failed(msg);
-
- service->state = CONNMAN_SERVICE_STATE_READY;
-
- state_changed(service);
+ return __connman_error_failed(msg, EINVAL);
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
err = __connman_network_disconnect(service->network);
if (err < 0 && err != -EINPROGRESS)
- return __connman_error_failed(msg);
-
- service->state = CONNMAN_SERVICE_STATE_DISCONNECT;
-
- state_changed(service);
+ return __connman_error_failed(msg, -err);
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
- }
+ } else if (service->device != NULL) {
+ int err;
- if (service->device != NULL) {
if (service->favorite == FALSE)
return __connman_error_no_carrier(msg);
- if (__connman_device_connect(service->device) < 0)
- return __connman_error_failed(msg);
-
- service->state = CONNMAN_SERVICE_STATE_IDLE;
-
- state_changed(service);
+ err = __connman_device_disconnect(service->device);
+ if (err < 0)
+ return __connman_error_failed(msg, -err);
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
err = __connman_network_disconnect(service->network);
if (err < 0 && err != -EINPROGRESS)
- return __connman_error_failed(msg);
-
- service->state = CONNMAN_SERVICE_STATE_DISCONNECT;
-
- state_changed(service);
+ return __connman_error_failed(msg, -err);
}
connman_service_set_favorite(service, FALSE);
break;
}
- if (carrier == TRUE)
- service->state = CONNMAN_SERVICE_STATE_CARRIER;
- else
- service->state = CONNMAN_SERVICE_STATE_IDLE;
+ if (carrier == FALSE) {
+ service->state = CONNMAN_SERVICE_STATE_DISCONNECT;
+ state_changed(service);
- state_changed(service);
+ service->state = CONNMAN_SERVICE_STATE_IDLE;
+ state_changed(service);
+ } else {
+ service->state = CONNMAN_SERVICE_STATE_CARRIER;
+ state_changed(service);
+ }
return connman_service_set_favorite(service, carrier);
}
-int __connman_service_indicate_configuration(struct connman_service *service)
+int __connman_service_indicate_state(struct connman_service *service,
+ enum connman_service_state state)
{
- DBG("service %p", service);
+ DBG("service %p state %d", service, state);
if (service == NULL)
return -EINVAL;
- service->state = CONNMAN_SERVICE_STATE_CONFIGURATION;
+ if (state == CONNMAN_SERVICE_STATE_CARRIER)
+ return __connman_service_set_carrier(service, TRUE);
- state_changed(service);
-
- return 0;
-}
-
-int __connman_service_ready(struct connman_service *service)
-{
- DBG("service %p", service);
+ if (service->state == state)
+ return -EALREADY;
- if (service == NULL)
+ if (service->state == CONNMAN_SERVICE_STATE_IDLE &&
+ state == CONNMAN_SERVICE_STATE_DISCONNECT)
return -EINVAL;
- service->state = CONNMAN_SERVICE_STATE_READY;
+ if (state == CONNMAN_SERVICE_STATE_IDLE &&
+ service->state != CONNMAN_SERVICE_STATE_DISCONNECT) {
+ service->state = CONNMAN_SERVICE_STATE_DISCONNECT;
+ state_changed(service);
+ }
+ service->state = state;
state_changed(service);
- return 0;
-}
-
-int __connman_service_disconnect(struct connman_service *service)
-{
- DBG("service %p", service);
-
- if (service == NULL)
- return -EINVAL;
-
- service->state = CONNMAN_SERVICE_STATE_DISCONNECT;
-
- state_changed(service);
+ if (state == CONNMAN_SERVICE_STATE_READY)
+ return connman_service_set_favorite(service, TRUE);
return 0;
}