aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanielle Madeley <danielle.madeley@collabora.co.uk>2011-02-09 14:24:27 +0800
committerChandni Verma <chandniverma2112@gmail.com>2011-03-08 09:07:29 +0800
commit6da159d09091d68a102c142b10747ae58755de51 (patch)
treecc09647e5650e7d4beb0ddc26d97c1fdd1c467fd
parent4f3b2d373b9f22abdbf2679a8c87ec68c1ae1d20 (diff)
downloadgsoc2013-empathy-6da159d09091d68a102c142b10747ae58755de51.tar
gsoc2013-empathy-6da159d09091d68a102c142b10747ae58755de51.tar.gz
gsoc2013-empathy-6da159d09091d68a102c142b10747ae58755de51.tar.bz2
gsoc2013-empathy-6da159d09091d68a102c142b10747ae58755de51.tar.lz
gsoc2013-empathy-6da159d09091d68a102c142b10747ae58755de51.tar.xz
gsoc2013-empathy-6da159d09091d68a102c142b10747ae58755de51.tar.zst
gsoc2013-empathy-6da159d09091d68a102c142b10747ae58755de51.zip
Add contact blocking support to EmpathyIndividualManager
-rw-r--r--libempathy/empathy-individual-manager.c104
-rw-r--r--libempathy/empathy-individual-manager.h18
2 files changed, 122 insertions, 0 deletions
diff --git a/libempathy/empathy-individual-manager.c b/libempathy/empathy-individual-manager.c
index 894ae648b..a2432effe 100644
--- a/libempathy/empathy-individual-manager.c
+++ b/libempathy/empathy-individual-manager.c
@@ -30,6 +30,7 @@
#include <telepathy-glib/util.h>
#include <folks/folks.h>
+#include <folks/folks-telepathy.h>
#include <extensions/extensions.h>
@@ -483,6 +484,77 @@ empathy_individual_manager_remove (EmpathyIndividualManager *self,
aggregator_remove_individual_cb, self);
}
+/**
+ * empathy_individual_manager_supports_blocking
+ * @self: the #EmpathyIndividualManager
+ * @individual: an individual to check
+ *
+ * Indicates whether any personas of an @individual can be blocked.
+ *
+ * Returns: %TRUE if any persona supports contact blocking
+ */
+gboolean
+empathy_individual_manager_supports_blocking (EmpathyIndividualManager *self,
+ FolksIndividual *individual)
+{
+ EmpathyIndividualManagerPriv *priv;
+ GList *personas, *l;
+
+ g_return_val_if_fail (EMPATHY_IS_INDIVIDUAL_MANAGER (self), FALSE);
+
+ priv = GET_PRIV (self);
+
+ personas = folks_individual_get_personas (individual);
+
+ for (l = personas; l != NULL; l = l->next)
+ {
+ TpfPersona *persona = l->data;
+ TpConnection *conn;
+
+ if (!TPF_IS_PERSONA (persona))
+ continue;
+
+ conn = tp_contact_get_connection (tpf_persona_get_contact (persona));
+
+ if (empathy_individual_manager_get_flags_for_connection (self, conn) &
+ EMPATHY_INDIVIDUAL_MANAGER_CAN_BLOCK)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void
+empathy_individual_manager_set_blocked (EmpathyIndividualManager *self,
+ FolksIndividual *individual,
+ gboolean blocked)
+{
+ EmpathyIndividualManagerPriv *priv;
+ GList *personas, *l;
+
+ g_return_if_fail (EMPATHY_IS_INDIVIDUAL_MANAGER (self));
+
+ priv = GET_PRIV (self);
+
+ personas = folks_individual_get_personas (individual);
+
+ for (l = personas; l != NULL; l = l->next)
+ {
+ TpfPersona *persona = l->data;
+ EmpathyContact *contact;
+
+ if (!TPF_IS_PERSONA (persona))
+ continue;
+
+ contact = empathy_contact_dup_from_tp_contact (
+ tpf_persona_get_contact (persona));
+ empathy_contact_set_persona (contact, FOLKS_PERSONA (persona));
+ empathy_contact_list_set_blocked (
+ EMPATHY_CONTACT_LIST (priv->contact_manager),
+ contact, blocked);
+ }
+}
+
static void
groups_change_group_cb (GObject *source,
GAsyncResult *result,
@@ -526,6 +598,38 @@ empathy_individual_manager_remove_group (EmpathyIndividualManager *manager,
(gpointer) group);
}
+EmpathyIndividualManagerFlags
+empathy_individual_manager_get_flags_for_connection (
+ EmpathyIndividualManager *self,
+ TpConnection *connection)
+{
+ EmpathyIndividualManagerPriv *priv;
+ EmpathyContactListFlags list_flags;
+ EmpathyIndividualManagerFlags flags;
+
+ g_return_val_if_fail (EMPATHY_IS_INDIVIDUAL_MANAGER (self),
+ EMPATHY_INDIVIDUAL_MANAGER_NO_FLAGS);
+
+ priv = GET_PRIV (self);
+
+ list_flags = empathy_contact_manager_get_flags_for_connection (
+ priv->contact_manager, connection);
+
+ flags = EMPATHY_INDIVIDUAL_MANAGER_NO_FLAGS;
+ if (list_flags & EMPATHY_CONTACT_LIST_CAN_ADD)
+ flags |= EMPATHY_INDIVIDUAL_MANAGER_CAN_ADD;
+ if (list_flags & EMPATHY_CONTACT_LIST_CAN_REMOVE)
+ flags |= EMPATHY_INDIVIDUAL_MANAGER_CAN_REMOVE;
+ if (list_flags & EMPATHY_CONTACT_LIST_CAN_ALIAS)
+ flags |= EMPATHY_INDIVIDUAL_MANAGER_CAN_ALIAS;
+ if (list_flags & EMPATHY_CONTACT_LIST_CAN_GROUP)
+ flags |= EMPATHY_INDIVIDUAL_MANAGER_CAN_GROUP;
+ if (list_flags & EMPATHY_CONTACT_LIST_CAN_BLOCK)
+ flags |= EMPATHY_INDIVIDUAL_MANAGER_CAN_BLOCK;
+
+ return flags;
+}
+
static void
link_personas_cb (FolksIndividualAggregator *aggregator,
GAsyncResult *async_result,
diff --git a/libempathy/empathy-individual-manager.h b/libempathy/empathy-individual-manager.h
index f2f5f5b56..daa7ec86a 100644
--- a/libempathy/empathy-individual-manager.h
+++ b/libempathy/empathy-individual-manager.h
@@ -36,6 +36,16 @@ G_BEGIN_DECLS
#define EMPATHY_IS_INDIVIDUAL_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EMPATHY_TYPE_INDIVIDUAL_MANAGER))
#define EMPATHY_INDIVIDUAL_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_INDIVIDUAL_MANAGER, EmpathyIndividualManagerClass))
+typedef enum
+{
+ EMPATHY_INDIVIDUAL_MANAGER_NO_FLAGS = 0,
+ EMPATHY_INDIVIDUAL_MANAGER_CAN_ADD = 1 << 0,
+ EMPATHY_INDIVIDUAL_MANAGER_CAN_REMOVE = 1 << 1,
+ EMPATHY_INDIVIDUAL_MANAGER_CAN_ALIAS = 1 << 2,
+ EMPATHY_INDIVIDUAL_MANAGER_CAN_GROUP = 1 << 3,
+ EMPATHY_INDIVIDUAL_MANAGER_CAN_BLOCK = 1 << 4,
+} EmpathyIndividualManagerFlags;
+
typedef struct _EmpathyIndividualManager EmpathyIndividualManager;
typedef struct _EmpathyIndividualManagerClass EmpathyIndividualManagerClass;
@@ -81,5 +91,13 @@ void empathy_individual_manager_unlink_individual (
EmpathyIndividualManager *self,
FolksIndividual *individual);
+gboolean empathy_individual_manager_supports_blocking (
+ EmpathyIndividualManager *self,
+ FolksIndividual *individual);
+
+void empathy_individual_manager_set_blocked (EmpathyIndividualManager *self,
+ FolksIndividual *individual,
+ gboolean blocked);
+
G_END_DECLS
#endif /* __EMPATHY_INDIVIDUAL_MANAGER_H__ */