When using network-manager compatibility mode in connman applications, for example pidgin and firefox, didn't notice when connman changed states from offline to online (and vice versa) and applications would notice the new state only after restarting them.
The problem was that connman wasn't sending StateChanged signals. After adding them pidgin and firefox will notice the new states immeadiately. --- src/manager.c | 49 +++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/manager.c b/src/manager.c index 0f66560..728a828 100644 --- a/src/manager.c +++ b/src/manager.c @@ -27,6 +27,14 @@ #include "connman.h" +enum { + NM_STATE_UNKNOWN = 0, + NM_STATE_ASLEEP, + NM_STATE_CONNECTING, + NM_STATE_CONNECTED, + NM_STATE_DISCONNECTED +}; + static DBusMessage *get_properties(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -303,10 +311,43 @@ static void technology_notify(enum connman_service_type type, technology_reply(0); } +static void nm_send_signal(const char *name, dbus_uint32_t state) +{ + DBusMessage *signal; + + signal = dbus_message_new_signal(NM_PATH, NM_INTERFACE, name); + if (signal == NULL) + return; + + dbus_message_append_args(signal, DBUS_TYPE_UINT32, &state, + DBUS_TYPE_INVALID); + + g_dbus_send_message(connection, signal); +} + +static void default_changed(struct connman_service *service) +{ + dbus_uint32_t state; + + if (service != NULL) + state = NM_STATE_CONNECTED; + else + state = NM_STATE_DISCONNECTED; + + DBG("%p %d", service, state); + + /* older deprecated signal, in case applications still use this */ + nm_send_signal("StateChange", state); + + /* the preferred current signal */ + nm_send_signal("StateChanged", state); +} + static struct connman_notifier technology_notifier = { .name = "manager", .priority = CONNMAN_NOTIFIER_PRIORITY_HIGH, .service_enabled= technology_notify, + .default_changed= default_changed, }; static DBusMessage *enable_technology(DBusConnection *conn, @@ -684,14 +725,6 @@ static DBusMessage *nm_wake(DBusConnection *conn, return reply; } -enum { - NM_STATE_UNKNOWN = 0, - NM_STATE_ASLEEP, - NM_STATE_CONNECTING, - NM_STATE_CONNECTED, - NM_STATE_DISCONNECTED -}; - static DBusMessage *nm_state(DBusConnection *conn, DBusMessage *msg, void *data) { _______________________________________________ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman