aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip Withnall <philip.withnall@collabora.co.uk>2010-07-06 21:40:35 +0800
committerTravis Reitter <treitter@gmail.com>2010-07-21 07:12:36 +0800
commite25fa2252ec8b46a9584f294d8604dee86ff7a38 (patch)
tree9294a9ab47fa8987fee86f584ff97af3c39e21a9
parent1acf1e0f3b5686b95f1b0787a5308e0a6298eb08 (diff)
downloadgsoc2013-empathy-e25fa2252ec8b46a9584f294d8604dee86ff7a38.tar
gsoc2013-empathy-e25fa2252ec8b46a9584f294d8604dee86ff7a38.tar.gz
gsoc2013-empathy-e25fa2252ec8b46a9584f294d8604dee86ff7a38.tar.bz2
gsoc2013-empathy-e25fa2252ec8b46a9584f294d8604dee86ff7a38.tar.lz
gsoc2013-empathy-e25fa2252ec8b46a9584f294d8604dee86ff7a38.tar.xz
gsoc2013-empathy-e25fa2252ec8b46a9584f294d8604dee86ff7a38.tar.zst
gsoc2013-empathy-e25fa2252ec8b46a9584f294d8604dee86ff7a38.zip
Hold a reference to the contact we're adding as an individual
In empathy_individual_manager_add_from_contact(), we must hold a reference to the contact we're adding throughout the entire async process, or the TpHandle which represents the contact could get unreffed and destroyed. This causes the new contact to get lost.
-rw-r--r--libempathy/empathy-individual-manager.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/libempathy/empathy-individual-manager.c b/libempathy/empathy-individual-manager.c
index db994327f..183996a3d 100644
--- a/libempathy/empathy-individual-manager.c
+++ b/libempathy/empathy-individual-manager.c
@@ -261,18 +261,21 @@ aggregator_add_persona_from_details_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
{
- EmpathyIndividualManager *self = EMPATHY_INDIVIDUAL_MANAGER (user_data);
- EmpathyIndividualManagerPriv *priv = GET_PRIV (self);
+ FolksIndividualAggregator *aggregator = FOLKS_INDIVIDUAL_AGGREGATOR (source);
+ EmpathyContact *contact = EMPATHY_CONTACT (user_data);
FolksPersona *persona;
GError *error = NULL;
persona = folks_individual_aggregator_add_persona_from_details_finish (
- priv->aggregator, result, &error);
+ aggregator, result, &error);
if (error != NULL)
{
g_warning ("failed to add individual from contact: %s", error->message);
g_clear_error (&error);
}
+
+ /* We can unref the contact now */
+ g_object_unref (contact);
}
void
@@ -289,6 +292,10 @@ empathy_individual_manager_add_from_contact (EmpathyIndividualManager *self,
priv = GET_PRIV (self);
+ /* We need to ref the contact since otherwise its linked TpHandle will be
+ * destroyed. */
+ g_object_ref (contact);
+
DEBUG (G_STRLOC ": adding individual from contact %s (%s)",
empathy_contact_get_id (contact), empathy_contact_get_name (contact));
@@ -301,7 +308,7 @@ empathy_individual_manager_add_from_contact (EmpathyIndividualManager *self,
folks_individual_aggregator_add_persona_from_details (
priv->aggregator, NULL, "telepathy", store_id, details,
- aggregator_add_persona_from_details_cb, self);
+ aggregator_add_persona_from_details_cb, contact);
g_hash_table_destroy (details);
}