forked from enlightenment/enlightenment
e/connman: allow to connect and disconnect
Networks that don't require agent interations (i.e. passphrases) can be (dis)connected now. SVN revision: 76054
This commit is contained in:
parent
339cd51087
commit
e5f228edba
|
@ -62,6 +62,14 @@ struct Connman_Service
|
||||||
enum Connman_State state;
|
enum Connman_State state;
|
||||||
enum Connman_Service_Type type;
|
enum Connman_Service_Type type;
|
||||||
uint8_t strength;
|
uint8_t strength;
|
||||||
|
|
||||||
|
/* Private */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
DBusPendingCall *connect;
|
||||||
|
DBusPendingCall *disconnect;
|
||||||
|
void *data;
|
||||||
|
} pending;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Ecore Events */
|
/* Ecore Events */
|
||||||
|
@ -80,6 +88,11 @@ unsigned int e_connman_system_shutdown(void);
|
||||||
*/
|
*/
|
||||||
struct Connman_Service *econnman_manager_find_service(struct Connman_Manager *cm, const char *path) EINA_ARG_NONNULL(1, 2);
|
struct Connman_Service *econnman_manager_find_service(struct Connman_Manager *cm, const char *path) EINA_ARG_NONNULL(1, 2);
|
||||||
|
|
||||||
|
typedef void (*Econnman_Simple_Cb)(void *data, const char *error);
|
||||||
|
|
||||||
|
bool econnman_service_connect(struct Connman_Service *cs, Econnman_Simple_Cb cb, void *data);
|
||||||
|
bool econnman_service_disconnect(struct Connman_Service *cs, Econnman_Simple_Cb cb, void *data);
|
||||||
|
|
||||||
/* UI calls from econnman */
|
/* UI calls from econnman */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -13,6 +13,9 @@
|
||||||
#define CONNMAN_MANAGER_IFACE CONNMAN_BUS_NAME ".Manager"
|
#define CONNMAN_MANAGER_IFACE CONNMAN_BUS_NAME ".Manager"
|
||||||
#define CONNMAN_SERVICE_IFACE CONNMAN_BUS_NAME ".Service"
|
#define CONNMAN_SERVICE_IFACE CONNMAN_BUS_NAME ".Service"
|
||||||
|
|
||||||
|
#define MILLI_PER_SEC 1000
|
||||||
|
#define CONNMAN_CONNECTION_TIMEOUT 60 * MILLI_PER_SEC
|
||||||
|
|
||||||
static unsigned int init_count;
|
static unsigned int init_count;
|
||||||
static E_DBus_Connection *conn;
|
static E_DBus_Connection *conn;
|
||||||
static char *bus_owner;
|
static char *bus_owner;
|
||||||
|
@ -253,11 +256,28 @@ static void _service_prop_changed(void *data, DBusMessage *msg)
|
||||||
_service_parse_prop_changed(cs, name, &var);
|
_service_parse_prop_changed(cs, name, &var);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct connection_data {
|
||||||
|
struct Connman_Service *cs;
|
||||||
|
Econnman_Simple_Cb cb;
|
||||||
|
void *user_data;
|
||||||
|
};
|
||||||
|
|
||||||
static void _service_free(struct Connman_Service *cs)
|
static void _service_free(struct Connman_Service *cs)
|
||||||
{
|
{
|
||||||
if (!cs)
|
if (!cs)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (cs->pending.connect)
|
||||||
|
{
|
||||||
|
dbus_pending_call_cancel(cs->pending.connect);
|
||||||
|
free(cs->pending.data);
|
||||||
|
}
|
||||||
|
if (cs->pending.disconnect)
|
||||||
|
{
|
||||||
|
dbus_pending_call_cancel(cs->pending.disconnect);
|
||||||
|
free(cs->pending.data);
|
||||||
|
}
|
||||||
|
|
||||||
free(cs->name);
|
free(cs->name);
|
||||||
_eina_str_array_clean(cs->security);
|
_eina_str_array_clean(cs->security);
|
||||||
eina_array_free(cs->security);
|
eina_array_free(cs->security);
|
||||||
|
@ -287,6 +307,96 @@ static struct Connman_Service *_service_new(const char *path, DBusMessageIter *p
|
||||||
return cs;
|
return cs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _service_connection_cb(void *data, DBusMessage *reply,
|
||||||
|
DBusError *err)
|
||||||
|
{
|
||||||
|
struct connection_data *cd = data;
|
||||||
|
|
||||||
|
if (cd->cb)
|
||||||
|
{
|
||||||
|
const char *s = dbus_error_is_set(err) ? err->message : NULL;
|
||||||
|
cd->cb(cd->user_data, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
cd->cs->pending.connect = NULL;
|
||||||
|
cd->cs->pending.disconnect = NULL;
|
||||||
|
cd->cs->pending.data = NULL;
|
||||||
|
|
||||||
|
free(cd);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool econnman_service_connect(struct Connman_Service *cs,
|
||||||
|
Econnman_Simple_Cb cb, void *data)
|
||||||
|
{
|
||||||
|
DBusMessage *msg;
|
||||||
|
struct connection_data *cd;
|
||||||
|
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN_VAL(cs, false);
|
||||||
|
|
||||||
|
if (cs->pending.connect || cs->pending.disconnect)
|
||||||
|
{
|
||||||
|
ERR("Pending connection: connect=%p disconnect=%p", cs->pending.connect,
|
||||||
|
cs->pending.disconnect);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
msg = dbus_message_new_method_call(CONNMAN_BUS_NAME, cs->obj.path,
|
||||||
|
CONNMAN_SERVICE_IFACE, "Connect");
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN_VAL(msg, false);
|
||||||
|
|
||||||
|
cd = calloc(1, sizeof(*cd));
|
||||||
|
EINA_SAFETY_ON_NULL_GOTO(cd, fail);
|
||||||
|
|
||||||
|
cd->cs = cs;
|
||||||
|
cd->cb = cb;
|
||||||
|
cd->user_data = data;
|
||||||
|
|
||||||
|
cs->pending.connect = e_dbus_message_send(conn, msg,
|
||||||
|
_service_connection_cb, CONNMAN_CONNECTION_TIMEOUT, cd);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
dbus_message_unref(msg);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool econnman_service_disconnect(struct Connman_Service *cs,
|
||||||
|
Econnman_Simple_Cb cb, void *data)
|
||||||
|
{
|
||||||
|
DBusMessage *msg;
|
||||||
|
struct connection_data *cd;
|
||||||
|
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN_VAL(cs, false);
|
||||||
|
|
||||||
|
if (cs->pending.connect || cs->pending.disconnect)
|
||||||
|
{
|
||||||
|
ERR("Pending connection: connect=%p disconnect=%p", cs->pending.connect,
|
||||||
|
cs->pending.disconnect);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
msg = dbus_message_new_method_call(CONNMAN_BUS_NAME, cs->obj.path,
|
||||||
|
CONNMAN_SERVICE_IFACE, "Disconnect");
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN_VAL(msg, false);
|
||||||
|
|
||||||
|
cd = calloc(1, sizeof(*cd));
|
||||||
|
EINA_SAFETY_ON_NULL_GOTO(cd, fail);
|
||||||
|
|
||||||
|
cd->cs = cs;
|
||||||
|
cd->cb = cb;
|
||||||
|
cd->user_data = data;
|
||||||
|
|
||||||
|
cs->pending.connect = e_dbus_message_send(conn, msg,
|
||||||
|
_service_connection_cb, -1, cd);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
dbus_message_unref(msg);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static struct Connman_Service *_manager_find_service_stringshared(
|
static struct Connman_Service *_manager_find_service_stringshared(
|
||||||
struct Connman_Manager *cm, const char *path)
|
struct Connman_Manager *cm, const char *path)
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,6 +52,54 @@ static Evas_Object * _econnman_service_new_icon(struct Connman_Service *cs,
|
||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _econnman_disconnect_cb(void *data, const char *error)
|
||||||
|
{
|
||||||
|
const char *path = data;
|
||||||
|
|
||||||
|
if (error == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ERR("Could not disconnect %s: %s", path, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _econnman_connect_cb(void *data, const char *error)
|
||||||
|
{
|
||||||
|
const char *path = data;
|
||||||
|
|
||||||
|
if (error == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ERR("Could not connect %s: %s", path, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _econnman_popup_selected_cb(void *data)
|
||||||
|
{
|
||||||
|
E_Connman_Instance *inst = data;
|
||||||
|
const char *path;
|
||||||
|
struct Connman_Service *cs;
|
||||||
|
|
||||||
|
path = e_widget_ilist_selected_value_get(inst->ui.popup.list);
|
||||||
|
if (path == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cs = econnman_manager_find_service(inst->ctxt->cm, path);
|
||||||
|
if (cs == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (cs->state)
|
||||||
|
{
|
||||||
|
case CONNMAN_STATE_READY:
|
||||||
|
case CONNMAN_STATE_ONLINE:
|
||||||
|
INF("Disconnect %s", path);
|
||||||
|
econnman_service_disconnect(cs, _econnman_disconnect_cb, (void *) path);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
INF("Connect %s", path);
|
||||||
|
econnman_service_connect(cs, _econnman_connect_cb, (void *) path);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void _econnman_popup_update(struct Connman_Manager *cm,
|
static void _econnman_popup_update(struct Connman_Manager *cm,
|
||||||
E_Connman_Instance *inst)
|
E_Connman_Instance *inst)
|
||||||
{
|
{
|
||||||
|
@ -67,7 +115,8 @@ static void _econnman_popup_update(struct Connman_Manager *cm,
|
||||||
EINA_INLIST_FOREACH(cm->services, cs)
|
EINA_INLIST_FOREACH(cm->services, cs)
|
||||||
{
|
{
|
||||||
Evas_Object *icon = _econnman_service_new_icon(cs, evas);
|
Evas_Object *icon = _econnman_service_new_icon(cs, evas);
|
||||||
e_widget_ilist_append(list, icon, cs->name, NULL, NULL, cs->obj.path);
|
e_widget_ilist_append(list, icon, cs->name, _econnman_popup_selected_cb,
|
||||||
|
inst, cs->obj.path);
|
||||||
}
|
}
|
||||||
|
|
||||||
e_widget_ilist_thaw(list);
|
e_widget_ilist_thaw(list);
|
||||||
|
|
Loading…
Reference in New Issue