This will permit to change the peer's state relevantly either from the
wifi plugin or after configuring the ipconfig which will come later.

Currently only connect and disconnect basics are handled.
---
 include/peer.h | 12 ++++++++
 src/peer.c     | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 93 insertions(+), 6 deletions(-)

diff --git a/include/peer.h b/include/peer.h
index 674cc3e..260c4af 100644
--- a/include/peer.h
+++ b/include/peer.h
@@ -26,6 +26,16 @@
 extern "C" {
 #endif
 
+enum connman_peer_state {
+       CONNMAN_PEER_STATE_UNKNOWN       = 0,
+       CONNMAN_PEER_STATE_IDLE          = 1,
+       CONNMAN_PEER_STATE_ASSOCIATION   = 2,
+       CONNMAN_PEER_STATE_CONFIGURATION = 3,
+       CONNMAN_PEER_STATE_READY         = 4,
+       CONNMAN_PEER_STATE_DISCONNECT    = 5,
+       CONNMAN_PEER_STATE_FAILURE       = 6,
+};
+
 struct connman_peer;
 
 struct connman_peer *connman_peer_create(const char *identifier);
@@ -46,6 +56,8 @@ void connman_peer_set_name(struct connman_peer *peer, const 
char *name);
 void connman_peer_set_device(struct connman_peer *peer,
                                struct connman_device *device);
 struct connman_device *connman_peer_get_device(struct connman_peer *peer);
+int connman_peer_set_state(struct connman_peer *peer,
+                                       enum connman_peer_state new_state);
 
 int connman_peer_register(struct connman_peer *peer);
 void connman_peer_unregister(struct connman_peer *peer);
diff --git a/src/peer.c b/src/peer.c
index a2c8eeb..a0134d7 100644
--- a/src/peer.c
+++ b/src/peer.c
@@ -34,12 +34,19 @@ static GHashTable *peers_table = NULL;
 
 static struct connman_peer_driver *peer_driver;
 
+struct _peers_notify {
+       int id;
+       GHashTable *add;
+       GHashTable *remove;
+} *peers_notify;
+
 struct connman_peer {
        int refcount;
        struct connman_device *device;
        char *identifier;
        char *name;
        char *path;
+       enum connman_peer_state state;
        bool registered;
 };
 
@@ -65,9 +72,40 @@ static void peer_free(gpointer data)
        g_free(peer);
 }
 
+static const char *state2string(enum connman_peer_state state)
+{
+       switch (state) {
+       case CONNMAN_PEER_STATE_UNKNOWN:
+               break;
+       case CONNMAN_PEER_STATE_IDLE:
+               return "idle";
+       case CONNMAN_PEER_STATE_ASSOCIATION:
+               return "association";
+       case CONNMAN_PEER_STATE_CONFIGURATION:
+               return "configuration";
+       case CONNMAN_PEER_STATE_READY:
+               return "ready";
+       case CONNMAN_PEER_STATE_DISCONNECT:
+               return "disconnect";
+       case CONNMAN_PEER_STATE_FAILURE:
+               return "failure";
+       }
+
+       return NULL;
+}
+
+static bool allow_property_changed(struct connman_peer *peer)
+{
+       if (g_hash_table_lookup_extended(peers_notify->add, peer->path,
+                                                               NULL, NULL))
+               return false;
+
+       return true;
+}
+
 static void append_properties(DBusMessageIter *iter, struct connman_peer *peer)
 {
-       const char *state = "disconnected";
+       const char *state = state2string(peer->state);
        DBusMessageIter dict;
 
        connman_dbus_dict_open(iter, &dict);
@@ -113,11 +151,18 @@ static void append_peer_struct(gpointer key, gpointer 
value,
        dbus_message_iter_close_container(array, &entry);
 }
 
-struct _peers_notify {
-       int id;
-       GHashTable *add;
-       GHashTable *remove;
-} *peers_notify;
+static void state_changed(struct connman_peer *peer)
+{
+       const char *state;
+
+       state = state2string(peer->state);
+       if (!state || !allow_property_changed(peer))
+               return;
+
+       connman_dbus_property_changed_basic(peer->path,
+                                        CONNMAN_PEER_INTERFACE, "State",
+                                        DBUS_TYPE_STRING, &state);
+}
 
 static void append_existing_and_new_peers(gpointer key,
                                        gpointer value, gpointer user_data)
@@ -225,6 +270,7 @@ struct connman_peer *connman_peer_create(const char 
*identifier)
 
        peer = g_malloc0(sizeof(struct connman_peer));
        peer->identifier = g_strdup(identifier);
+       peer->state = CONNMAN_PEER_STATE_IDLE;
 
        peer->refcount = 1;
 
@@ -289,6 +335,35 @@ struct connman_device *connman_peer_get_device(struct 
connman_peer *peer)
        return peer->device;
 }
 
+int connman_peer_set_state(struct connman_peer *peer,
+                                       enum connman_peer_state new_state)
+{
+       enum connman_peer_state old_state = peer->state;
+
+       if (old_state == new_state)
+               return -EALREADY;
+
+       switch (new_state) {
+       case CONNMAN_PEER_STATE_UNKNOWN:
+               return -EINVAL;
+       case CONNMAN_PEER_STATE_IDLE:
+       case CONNMAN_PEER_STATE_ASSOCIATION:
+       case CONNMAN_PEER_STATE_CONFIGURATION:
+               break;
+       case CONNMAN_PEER_STATE_READY:
+               break;
+       case CONNMAN_PEER_STATE_DISCONNECT:
+               break;
+       case CONNMAN_PEER_STATE_FAILURE:
+               break;
+       };
+
+       peer->state = new_state;
+       state_changed(peer);
+
+       return 0;
+}
+
 static const GDBusMethodTable peer_methods[] = {
        { GDBUS_METHOD("GetProperties",
                        NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
-- 
1.8.5.5

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

Reply via email to