[empathy: 10/35] Add contact blocking to EmpathyContactList and friends



commit 35500a8b9e672f703059707039a1ccee23dd3597
Author: Danielle Madeley <danielle madeley collabora co uk>
Date:   Mon Feb 7 13:41:40 2011 +1100

    Add contact blocking to EmpathyContactList and friends

 libempathy/empathy-contact-list.c    |   23 ++++++++++++
 libempathy/empathy-contact-list.h    |   12 ++++++
 libempathy/empathy-contact-manager.c |   41 +++++++++++++++++++++
 libempathy/empathy-tp-contact-list.c |   64 ++++++++++++++++++++++++++++++---
 libempathy/empathy-tp-contact-list.h |    1 +
 5 files changed, 135 insertions(+), 6 deletions(-)
---
diff --git a/libempathy/empathy-contact-list.c b/libempathy/empathy-contact-list.c
index 631bb4a..d8af893 100644
--- a/libempathy/empathy-contact-list.c
+++ b/libempathy/empathy-contact-list.c
@@ -278,3 +278,26 @@ empathy_contact_list_remove_from_favourites (EmpathyContactList *list,
 			contact);
 	}
 }
+
+void
+empathy_contact_list_set_blocked (EmpathyContactList *list,
+				  EmpathyContact     *contact,
+				  gboolean            blocked)
+{
+	EmpathyContactListIface *iface = EMPATHY_CONTACT_LIST_GET_IFACE (list);
+
+	if (iface->set_blocked != NULL)
+		iface->set_blocked (list, contact, blocked);
+}
+
+gboolean
+empathy_contact_list_get_blocked (EmpathyContactList *list,
+				  EmpathyContact     *contact)
+{
+	EmpathyContactListIface *iface = EMPATHY_CONTACT_LIST_GET_IFACE (list);
+
+	if (iface->get_blocked != NULL)
+		return iface->get_blocked (list, contact);
+	else
+		return FALSE;
+}
diff --git a/libempathy/empathy-contact-list.h b/libempathy/empathy-contact-list.h
index 3817af8..6839749 100644
--- a/libempathy/empathy-contact-list.h
+++ b/libempathy/empathy-contact-list.h
@@ -39,6 +39,7 @@ typedef enum {
 	EMPATHY_CONTACT_LIST_CAN_REMOVE		= 1 << 1,
 	EMPATHY_CONTACT_LIST_CAN_ALIAS		= 1 << 2,
 	EMPATHY_CONTACT_LIST_CAN_GROUP		= 1 << 3,
+	EMPATHY_CONTACT_LIST_CAN_BLOCK		= 1 << 4,
 } EmpathyContactListFlags;
 
 typedef struct _EmpathyContactListIface EmpathyContactListIface;
@@ -77,6 +78,11 @@ struct _EmpathyContactListIface {
 					       EmpathyContact     *contact);
 	void             (*remove_favourite)  (EmpathyContactList *list,
 					       EmpathyContact     *contact);
+	void             (*set_blocked)       (EmpathyContactList *list,
+			                       EmpathyContact     *contact,
+					       gboolean            blocked);
+	gboolean         (*get_blocked)       (EmpathyContactList *list,
+			                       EmpathyContact     *contact);
 };
 
 GType    empathy_contact_list_get_type          (void) G_GNUC_CONST;
@@ -116,6 +122,12 @@ void     empathy_contact_list_remove_from_favourites
                                                 (EmpathyContactList *list,
 						 EmpathyContact     *contact);
 
+void     empathy_contact_list_set_blocked       (EmpathyContactList *list,
+		                                 EmpathyContact     *contact,
+						 gboolean            blocked);
+gboolean empathy_contact_list_get_blocked       (EmpathyContactList *list,
+						 EmpathyContact     *contact);
+
 
 G_END_DECLS
 
diff --git a/libempathy/empathy-contact-manager.c b/libempathy/empathy-contact-manager.c
index a900fa6..2242159 100644
--- a/libempathy/empathy-contact-manager.c
+++ b/libempathy/empathy-contact-manager.c
@@ -865,6 +865,45 @@ contact_manager_remove_group (EmpathyContactList *manager,
 }
 
 static void
+contact_manager_set_blocked (EmpathyContactList *manager,
+			     EmpathyContact     *contact,
+			     gboolean            blocked)
+{
+	EmpathyContactManagerPriv *priv = GET_PRIV (manager);
+	EmpathyContactList        *list;
+	TpConnection              *connection;
+
+	g_return_if_fail (EMPATHY_IS_CONTACT_MANAGER (manager));
+
+	connection = empathy_contact_get_connection (contact);
+	list = g_hash_table_lookup (priv->lists, connection);
+
+	if (list != NULL) {
+		empathy_contact_list_set_blocked (list, contact, blocked);
+	}
+}
+
+static gboolean
+contact_manager_get_blocked (EmpathyContactList *manager,
+			     EmpathyContact     *contact)
+{
+	EmpathyContactManagerPriv *priv = GET_PRIV (manager);
+	EmpathyContactList        *list;
+	TpConnection              *connection;
+
+	g_return_val_if_fail (EMPATHY_IS_CONTACT_MANAGER (manager), FALSE);
+
+	connection = empathy_contact_get_connection (contact);
+	list = g_hash_table_lookup (priv->lists, connection);
+
+	if (list != NULL) {
+		return empathy_contact_list_get_blocked (list, contact);
+	} else {
+		return FALSE;
+	}
+}
+
+static void
 contact_manager_iface_init (EmpathyContactListIface *iface)
 {
 	iface->add               = contact_manager_add;
@@ -880,6 +919,8 @@ contact_manager_iface_init (EmpathyContactListIface *iface)
 	iface->is_favourite      = contact_manager_is_favourite;
 	iface->remove_favourite  = contact_manager_remove_favourite;
 	iface->add_favourite     = contact_manager_add_favourite;
+	iface->set_blocked	 = contact_manager_set_blocked;
+	iface->get_blocked	 = contact_manager_get_blocked;
 }
 
 EmpathyContactListFlags
diff --git a/libempathy/empathy-tp-contact-list.c b/libempathy/empathy-tp-contact-list.c
index 263c379..ec4f172 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);
 }
-
diff --git a/libempathy/empathy-tp-contact-list.h b/libempathy/empathy-tp-contact-list.h
index 071fc0b..9a555bc 100644
--- a/libempathy/empathy-tp-contact-list.h
+++ b/libempathy/empathy-tp-contact-list.h
@@ -26,6 +26,7 @@
 #include <glib.h>
 #include <telepathy-glib/connection.h>
 
+#include <libempathy/empathy-contact.h>
 
 G_BEGIN_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]