Hi Tomasz,

only nitpicks :D

On 07/09/2014 02:36 PM, Tomasz Bursztyka wrote:
> This is an important signal as it will clearly help to tell to which
> group this peer belongs, and thus to be able to determine if this peer
> is connected or not.
> ---
>  gsupplicant/supplicant.c | 97 
> ++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 97 insertions(+)
> 
> diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c
> index 4c05299..d4779a8 100644
> --- a/gsupplicant/supplicant.c
> +++ b/gsupplicant/supplicant.c
> @@ -135,6 +135,8 @@ static struct strvalmap mode_capa_map[] = {
>  
>  static GHashTable *interface_table;
>  static GHashTable *bss_mapping;
> +static GHashTable *peer_mapping;
> +static GHashTable *group_mapping;
>  
>  struct _GSupplicantWpsCredentials {
>       unsigned char ssid[32];
> @@ -226,6 +228,8 @@ struct _GSupplicantPeer {
>       char *name;
>       char *identifier;
>       unsigned int wps_capabilities;
> +     GSList *groups;
> +     bool groups_changed;
>  };
>  
>  struct _GSupplicantGroup {
> @@ -560,6 +564,11 @@ static void remove_peer(gpointer data)
>  
>       callback_peer_lost(peer);
>  
> +     if (peer->groups)
> +             g_slist_free_full(peer->groups, g_free);
> +
> +     g_hash_table_remove(peer_mapping, peer->path);
> +
>       g_free(peer->path);
>       g_free(peer->name);
>       g_free(peer->identifier);
> @@ -2118,6 +2127,8 @@ static void signal_name_owner_changed(const char *path, 
> DBusMessageIter *iter)
>       if (strlen(old) > 0 && strlen(new) == 0) {
>               system_available = FALSE;
>               g_hash_table_remove_all(bss_mapping);
> +             g_hash_table_remove_all(peer_mapping);
> +             g_hash_table_remove_all(group_mapping);
>               g_hash_table_remove_all(interface_table);
>               callback_system_killed();
>       }
> @@ -2460,6 +2471,37 @@ static void create_peer_identifier(GSupplicantPeer 
> *peer)
>                                               peer->device_address[5]);
>  }
>  
> +struct peer_group_data {
> +     GSupplicantPeer *peer;
> +     GSList *old_groups;
> +};
> +
> +static void peer_groups_relation(DBusMessageIter *iter, void *user_data)
> +{
> +     struct peer_group_data *data = user_data;
> +     GSupplicantPeer *peer = data->peer;
> +     GSupplicantGroup *group;
> +     const char *str = NULL;
> +     GSList *elem;
> +
> +     dbus_message_iter_get_basic(iter, &str);
> +     if (!str)
> +             return;
> +
> +     group = g_hash_table_lookup(group_mapping, str);
> +     if (!group)
> +             return;
> +
> +     elem = g_slist_find_custom(data->old_groups, str, g_str_equal);
> +     if (elem) {
> +             data->old_groups = g_slist_remove_link(data->old_groups, elem);
> +             peer->groups = g_slist_concat(elem, peer->groups);
> +     } else {
> +             peer->groups = g_slist_prepend(peer->groups, g_strdup(str));
> +             peer->groups_changed = true;
> +     }
> +}
> +
>  static void peer_property(const char *key, DBusMessageIter *iter,
>                                                       void *user_data)
>  {
> @@ -2504,6 +2546,19 @@ static void peer_property(const char *key, 
> DBusMessageIter *iter,
>                       peer->wps_capabilities |= G_SUPPLICANT_WPS_PBC;
>               if (wps_config & ~G_SUPPLICANT_WPS_CONFIG_PBC)
>                       peer->wps_capabilities |= G_SUPPLICANT_WPS_PIN;
> +     } else if (g_strcmp0(key, "Groups") == 0) {
> +             struct peer_group_data data = {
> +                     .peer = peer,
> +                     .old_groups = peer->groups,
> +             };
> +             peer->groups = NULL;
> +
> +             supplicant_dbus_array_foreach(iter,
> +                                             peer_groups_relation, &data);
> +             if (g_slist_length(data.old_groups) > 0) {
> +                     g_slist_free_full(data.old_groups, g_free);
> +                     peer->groups_changed = true;
> +             }
>       }
>  }
>  
> @@ -2534,6 +2589,7 @@ static void signal_peer_found(const char *path, 
> DBusMessageIter *iter)
>       peer->interface = interface;
>       peer->path = g_strdup(obj_path);
>       g_hash_table_insert(interface->peer_table, peer->path, peer);
> +     g_hash_table_insert(peer_mapping, peer->path, interface);

g_hash_table_replace?

>  
>       dbus_message_iter_next(iter);
>       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INVALID) {
> @@ -2570,6 +2626,30 @@ static void signal_peer_lost(const char *path, 
> DBusMessageIter *iter)
>       g_hash_table_remove(interface->peer_table, obj_path);
>  }
>  
> +static void signal_peer_changed(const char *path, DBusMessageIter *iter)
> +{
> +     GSupplicantInterface *interface;
> +     GSupplicantPeer *peer;
> +
> +     SUPPLICANT_DBG("");
> +
> +     interface = g_hash_table_lookup(peer_mapping, path);
> +     if (!interface)
> +             return;
> +
> +     peer = g_hash_table_lookup(interface->peer_table, path);
> +     if (!peer) {
> +             g_hash_table_remove(peer_mapping, path);
> +             return;
> +     }
> +
> +     supplicant_dbus_property_foreach(iter, peer_property, peer);
> +     if (!peer->groups_changed)
> +             return;
> +
> +     peer->groups_changed = false;
> +}
> +
>  struct group_sig_data {
>       const char *peer_obj_path;
>       unsigned char iface_address[6];
> @@ -2694,6 +2774,7 @@ static void signal_group_started(const char *path, 
> DBusMessageIter *iter)
>       group->role = data.role;
>  
>       g_hash_table_insert(interface->group_table, group->path, group);
> +     g_hash_table_insert(group_mapping, group->path, group);

g_hash_table_replace?

>  }
>  
>  static void signal_group_finished(const char *path, DBusMessageIter *iter)
> @@ -2747,6 +2828,8 @@ static struct {
>       { SUPPLICANT_INTERFACE ".Interface.P2PDevice", "DeviceFound", 
> signal_peer_found },
>       { SUPPLICANT_INTERFACE ".Interface.P2PDevice", "DeviceLost",  
> signal_peer_lost  },
>  
> +     { SUPPLICANT_INTERFACE ".Peer", "PropertiesChanged", 
> signal_peer_changed },
> +
>       { SUPPLICANT_INTERFACE ".Interface.P2PDevice", "GONegotiationSuccess", 
> signal_group_success },
>       { SUPPLICANT_INTERFACE ".Interface.P2PDevice", "GONegotiationFailure", 
> signal_group_failure },
>       { SUPPLICANT_INTERFACE ".Interface.P2PDevice", "GroupStarted", 
> signal_group_started },
> @@ -4457,6 +4540,10 @@ int g_supplicant_register(const GSupplicantCallbacks 
> *callbacks)
>  
>       bss_mapping = g_hash_table_new_full(g_str_hash, g_str_equal,
>                                                               NULL, NULL);
> +     peer_mapping = g_hash_table_new_full(g_str_hash, g_str_equal,
> +                                                             NULL, NULL);
> +     group_mapping = g_hash_table_new_full(g_str_hash, g_str_equal,
> +                                                             NULL, NULL);
>  
>       supplicant_dbus_setup(connection);
>  
> @@ -4525,6 +4612,16 @@ void g_supplicant_unregister(const 
> GSupplicantCallbacks *callbacks)
>               bss_mapping = NULL;
>       }
>  
> +     if (peer_mapping) {
> +             g_hash_table_destroy(peer_mapping);
> +             peer_mapping = NULL;
> +     }
> +
> +     if (group_mapping) {
> +             g_hash_table_destroy(group_mapping);
> +             group_mapping = NULL;
> +     }
> +
>       if (system_available)
>               callback_system_killed();
>  
> 

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

Reply via email to