aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy/empathy-tp-contact-list.c
diff options
context:
space:
mode:
authorDanielle Madeley <danielle.madeley@collabora.co.uk>2011-02-07 10:41:40 +0800
committerDanielle Madeley <danielle.madeley@collabora.co.uk>2011-02-09 10:03:57 +0800
commit61572ce5a33a31ec2d36ac676384a7a6d246d7b4 (patch)
treec889262633915c7ba8a2e9735701280d9f21d14e /libempathy/empathy-tp-contact-list.c
parente86fa5ff0136af2458971a4e8e309b862b35b11a (diff)
downloadgsoc2013-empathy-61572ce5a33a31ec2d36ac676384a7a6d246d7b4.tar
gsoc2013-empathy-61572ce5a33a31ec2d36ac676384a7a6d246d7b4.tar.gz
gsoc2013-empathy-61572ce5a33a31ec2d36ac676384a7a6d246d7b4.tar.bz2
gsoc2013-empathy-61572ce5a33a31ec2d36ac676384a7a6d246d7b4.tar.lz
gsoc2013-empathy-61572ce5a33a31ec2d36ac676384a7a6d246d7b4.tar.xz
gsoc2013-empathy-61572ce5a33a31ec2d36ac676384a7a6d246d7b4.tar.zst
gsoc2013-empathy-61572ce5a33a31ec2d36ac676384a7a6d246d7b4.zip
Add contact blocking to EmpathyContactList and friends
Diffstat (limited to 'libempathy/empathy-tp-contact-list.c')
-rw-r--r--libempathy/empathy-tp-contact-list.c64
1 files changed, 58 insertions, 6 deletions
diff --git a/libempathy/empathy-tp-contact-list.c b/libempathy/empathy-tp-contact-list.c
index 263c379f6..ec4f17245 100644
--- a/libempathy/empathy-tp-contact-list.c
+++ b/libempathy/empathy-tp-contact-list.c
@@ -46,6 +46,7 @@ typedef struct {
TpChannel *publish;
TpChannel *subscribe;
TpChannel *stored;
+ TpChannel *deny;
/* contact handle (TpHandle) => reffed (EmpathyContact *)
*
* Union of:
@@ -722,6 +723,10 @@ tp_contact_list_finalize (GObject *object)
g_object_unref (priv->stored);
}
+ if (priv->deny) {
+ g_object_unref (priv->deny);
+ }
+
if (priv->connection) {
g_object_unref (priv->connection);
}
@@ -773,6 +778,11 @@ got_list_channel (EmpathyTpContactList *list,
g_signal_connect (priv->subscribe, "group-members-changed",
G_CALLBACK (tp_contact_list_subscribe_group_members_changed_cb),
list);
+ } else if (!tp_strdiff (id, "deny")) {
+ if (priv->deny != NULL)
+ return;
+ DEBUG ("Got 'deny' channel");
+ priv->deny = g_object_ref (channel);
}
}
@@ -881,8 +891,8 @@ conn_ready_cb (TpConnection *connection,
NULL, NULL, G_OBJECT (list));
request = tp_asv_new (
- TP_IFACE_CHANNEL ".ChannelType", G_TYPE_STRING, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST,
- TP_IFACE_CHANNEL ".TargetHandleType", G_TYPE_UINT, TP_HANDLE_TYPE_LIST,
+ TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST,
+ TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT, TP_HANDLE_TYPE_LIST,
NULL);
/* Watch the NewChannels signal so if ensuring list channels fails (for
@@ -892,17 +902,22 @@ conn_ready_cb (TpConnection *connection,
priv->connection, new_channels_cb, NULL, NULL, G_OBJECT (list), NULL);
/* Request the 'stored' list. */
- tp_asv_set_static_string (request, TP_IFACE_CHANNEL ".TargetID", "stored");
+ tp_asv_set_static_string (request, TP_PROP_CHANNEL_TARGET_ID, "stored");
tp_cli_connection_interface_requests_call_ensure_channel (priv->connection,
G_MAXINT, request, list_ensure_channel_cb, list, NULL, G_OBJECT (list));
/* Request the 'publish' list. */
- tp_asv_set_static_string (request, TP_IFACE_CHANNEL ".TargetID", "publish");
+ tp_asv_set_static_string (request, TP_PROP_CHANNEL_TARGET_ID, "publish");
tp_cli_connection_interface_requests_call_ensure_channel (priv->connection,
G_MAXINT, request, list_ensure_channel_cb, list, NULL, G_OBJECT (list));
/* Request the 'subscribe' list. */
- tp_asv_set_static_string (request, TP_IFACE_CHANNEL ".TargetID", "subscribe");
+ tp_asv_set_static_string (request, TP_PROP_CHANNEL_TARGET_ID, "subscribe");
+ tp_cli_connection_interface_requests_call_ensure_channel (priv->connection,
+ G_MAXINT, request, list_ensure_channel_cb, list, NULL, G_OBJECT (list));
+
+ /* Request the 'deny' list */
+ tp_asv_set_static_string (request, TP_PROP_CHANNEL_TARGET_ID, "deny");
tp_cli_connection_interface_requests_call_ensure_channel (priv->connection,
G_MAXINT, request, list_ensure_channel_cb, list, NULL, G_OBJECT (list));
@@ -1289,10 +1304,46 @@ tp_contact_list_get_flags (EmpathyContactList *list)
}
}
+ if (priv->deny != NULL)
+ flags |= EMPATHY_CONTACT_LIST_CAN_BLOCK;
+
return flags;
}
static void
+tp_contact_list_set_blocked (EmpathyContactList *list,
+ EmpathyContact *contact,
+ gboolean blocked)
+{
+ EmpathyTpContactListPriv *priv = GET_PRIV (list);
+ TpHandle handle = empathy_contact_get_handle (contact);
+ GArray handles = { (char *) &handle, 1 };
+
+ g_return_if_fail (TP_IS_CHANNEL (priv->deny));
+
+ if (blocked)
+ tp_cli_channel_interface_group_call_add_members (
+ priv->deny, -1,
+ &handles, NULL, NULL, NULL, NULL, NULL);
+ else
+ tp_cli_channel_interface_group_call_remove_members (
+ priv->deny, -1,
+ &handles, NULL, NULL, NULL, NULL, NULL);
+}
+
+static gboolean
+tp_contact_list_get_blocked (EmpathyContactList *list,
+ EmpathyContact *contact)
+{
+ EmpathyTpContactListPriv *priv = GET_PRIV (list);
+
+ g_return_val_if_fail (TP_IS_CHANNEL (priv->deny), FALSE);
+
+ return tp_intset_is_member (tp_channel_group_get_members (priv->deny),
+ empathy_contact_get_handle (contact));
+}
+
+static void
tp_contact_list_iface_init (EmpathyContactListIface *iface)
{
iface->add = tp_contact_list_add;
@@ -1306,6 +1357,8 @@ tp_contact_list_iface_init (EmpathyContactListIface *iface)
iface->rename_group = tp_contact_list_rename_group;
iface->remove_group = tp_contact_list_remove_group;
iface->get_flags = tp_contact_list_get_flags;
+ iface->set_blocked = tp_contact_list_set_blocked;
+ iface->get_blocked = tp_contact_list_get_blocked;
}
void
@@ -1334,4 +1387,3 @@ empathy_tp_contact_list_remove_all (EmpathyTpContactList *list)
}
g_hash_table_remove_all (priv->pendings);
}
-