+static void
+contacts_added_to_group (EmpathyTpContactList *list,
+ TpChannel *channel,
+ GArray *added)
+{
+ EmpathyTpContactListPriv *priv = GET_PRIV (list);
+ const gchar *group_name;
+ guint i;
+
+ group_name = tp_channel_get_identifier (channel);
+
+ for (i = 0; i < added->len; i++) {
+ EmpathyContact *contact;
+ TpHandle handle;
+
+ handle = g_array_index (added, TpHandle, i);
+ contact = g_hash_table_lookup (priv->members,
+ GUINT_TO_POINTER (handle));
+ if (contact == NULL) {
+ continue;
+ }
+
+ DEBUG ("Contact %s (%d) added to group %s",
+ empathy_contact_get_id (contact), handle, group_name);
+ g_signal_emit_by_name (list, "groups-changed", contact,
+ group_name,
+ TRUE);
+ }
+}
+
+static void
+tp_contact_list_group_members_changed_cb (TpChannel *channel,
+ gchar *message,
+ GArray *added,
+ GArray *removed,
+ GArray *local_pending,
+ GArray *remote_pending,
+ guint actor,
+ guint reason,
+ EmpathyTpContactList *list)
+{
+ EmpathyTpContactListPriv *priv = GET_PRIV (list);
+ const gchar *group_name;
+ guint i;
+
+ contacts_added_to_group (list, channel, added);
+
+ group_name = tp_channel_get_identifier (channel);
+
+ for (i = 0; i < removed->len; i++) {
+ EmpathyContact *contact;
+ TpHandle handle;
+
+ handle = g_array_index (removed, TpHandle, i);
+ contact = g_hash_table_lookup (priv->members,
+ GUINT_TO_POINTER (handle));
+ if (contact == NULL) {
+ continue;
+ }
+
+ DEBUG ("Contact %s (%d) removed from group %s",
+ empathy_contact_get_id (contact), handle, group_name);
+
+ g_signal_emit_by_name (list, "groups-changed", contact,
+ group_name,
+ FALSE);
+ }
+}
+