diff options
Diffstat (limited to 'libempathy/empathy-utils.c')
-rw-r--r-- | libempathy/empathy-utils.c | 138 |
1 files changed, 120 insertions, 18 deletions
diff --git a/libempathy/empathy-utils.c b/libempathy/empathy-utils.c index a1047334d..9eec82e74 100644 --- a/libempathy/empathy-utils.c +++ b/libempathy/empathy-utils.c @@ -80,6 +80,16 @@ static struct { { NULL, }, }; +static gboolean +properties_contains (gchar **list, + gint length, + const gchar *property); + +static gboolean +check_writeable_property (TpConnection *connection, + FolksIndividual *individual, + gchar *property); + void empathy_init (void) { @@ -727,6 +737,12 @@ empathy_contact_dup_from_folks_individual (FolksIndividual *individual) } g_clear_object (&iter); + if (contact == NULL) + { + DEBUG ("Can't create an EmpathyContact for Individual %s", + folks_individual_get_id (individual)); + } + return contact; } @@ -798,10 +814,10 @@ empathy_connection_can_add_personas (TpConnection *connection) } gboolean -empathy_connection_can_alias_personas (TpConnection *connection) +empathy_connection_can_alias_personas (TpConnection *connection, + FolksIndividual *individual) { gboolean retval; - FolksPersonaStore *persona_store; g_return_val_if_fail (TP_IS_CONNECTION (connection), FALSE); @@ -809,22 +825,16 @@ empathy_connection_can_alias_personas (TpConnection *connection) TP_CONNECTION_STATUS_CONNECTED) return FALSE; - persona_store = FOLKS_PERSONA_STORE ( - empathy_dup_persona_store_for_connection (connection)); - - retval = (folks_persona_store_get_can_alias_personas (persona_store) == - FOLKS_MAYBE_BOOL_TRUE); - - g_clear_object (&persona_store); + retval = check_writeable_property (connection, individual, "alias"); return retval; } gboolean -empathy_connection_can_group_personas (TpConnection *connection) +empathy_connection_can_group_personas (TpConnection *connection, + FolksIndividual *individual) { gboolean retval; - FolksPersonaStore *persona_store; g_return_val_if_fail (TP_IS_CONNECTION (connection), FALSE); @@ -832,13 +842,7 @@ empathy_connection_can_group_personas (TpConnection *connection) TP_CONNECTION_STATUS_CONNECTED) return FALSE; - persona_store = FOLKS_PERSONA_STORE ( - empathy_dup_persona_store_for_connection (connection)); - - retval = (folks_persona_store_get_can_group_personas (persona_store) == - FOLKS_MAYBE_BOOL_TRUE); - - g_clear_object (&persona_store); + retval = check_writeable_property (connection, individual, "groups"); return retval; } @@ -988,3 +992,101 @@ empathy_account_has_uri_scheme_tel (TpAccount *account) return FALSE; } + +/* Return the TpContact on @conn associated with @individual, if any */ +TpContact * +empathy_get_tp_contact_for_individual (FolksIndividual *individual, + TpConnection *conn) +{ + TpContact *contact = NULL; + GeeSet *personas; + GeeIterator *iter; + + personas = folks_individual_get_personas (individual); + iter = gee_iterable_iterator (GEE_ITERABLE (personas)); + while (contact == NULL && gee_iterator_next (iter)) + { + TpfPersona *persona = gee_iterator_get (iter); + TpConnection *contact_conn; + TpContact *contact_cur = NULL; + + if (TPF_IS_PERSONA (persona)) + { + contact_cur = tpf_persona_get_contact (persona); + if (contact_cur != NULL) + { + contact_conn = tp_contact_get_connection (contact_cur); + + if (!tp_strdiff (tp_proxy_get_object_path (contact_conn), + tp_proxy_get_object_path (conn))) + contact = contact_cur; + } + } + + g_clear_object (&persona); + } + g_clear_object (&iter); + + return contact; +} + +static gboolean +properties_contains (gchar **list, + gint length, + const gchar *property) +{ + gint i; + + for (i = 0; i < length; i++) + { + if (!tp_strdiff (list[i], property)) + return TRUE; + } + + return FALSE; +} + +static gboolean +check_writeable_property (TpConnection *connection, + FolksIndividual *individual, + gchar *property) +{ + gchar **properties; + gint prop_len; + gboolean retval = FALSE; + GeeSet *personas; + GeeIterator *iter; + FolksPersonaStore *persona_store; + + persona_store = FOLKS_PERSONA_STORE ( + empathy_dup_persona_store_for_connection (connection)); + + properties = + folks_persona_store_get_always_writeable_properties (persona_store, + &prop_len); + retval = properties_contains (properties, prop_len, property); + if (retval == TRUE) + goto out; + + /* Lets see if the Individual contains a Persona with the given property */ + personas = folks_individual_get_personas (individual); + iter = gee_iterable_iterator (GEE_ITERABLE (personas)); + while (!retval && gee_iterator_next (iter)) + { + FolksPersona *persona = gee_iterator_get (iter); + + properties = + folks_persona_get_writeable_properties (persona, &prop_len); + retval = properties_contains (properties, prop_len, property); + + g_clear_object (&persona); + + if (retval == TRUE) + break; + } + g_clear_object (&iter); + +out: + g_clear_object (&persona_store); + return retval; +} |