aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk
diff options
context:
space:
mode:
authorTravis Reitter <travis.reitter@collabora.co.uk>2011-06-28 05:31:25 +0800
committerJonny Lamb <jonnylamb@gnome.org>2011-08-22 17:36:33 +0800
commitd1d3a49fc919ed734b77a6e94afb2d49109182f2 (patch)
tree8c329ef17d60f70dba7f6695378142e229ab44e2 /libempathy-gtk
parent358fab1eb85cecb34ca45f492be2e623ab443a5e (diff)
downloadgsoc2013-empathy-d1d3a49fc919ed734b77a6e94afb2d49109182f2.tar
gsoc2013-empathy-d1d3a49fc919ed734b77a6e94afb2d49109182f2.tar.gz
gsoc2013-empathy-d1d3a49fc919ed734b77a6e94afb2d49109182f2.tar.bz2
gsoc2013-empathy-d1d3a49fc919ed734b77a6e94afb2d49109182f2.tar.lz
gsoc2013-empathy-d1d3a49fc919ed734b77a6e94afb2d49109182f2.tar.xz
gsoc2013-empathy-d1d3a49fc919ed734b77a6e94afb2d49109182f2.tar.zst
gsoc2013-empathy-d1d3a49fc919ed734b77a6e94afb2d49109182f2.zip
Don't assume that all TpfPersonas contain valid TpContacts
Helps: bgo#653599 - Empathy shouldn't assume all TpfPersonas contain a valid TpContact Signed-off-by: Jonny Lamb <jonnylamb@gnome.org>
Diffstat (limited to 'libempathy-gtk')
-rw-r--r--libempathy-gtk/empathy-individual-dialogs.c3
-rw-r--r--libempathy-gtk/empathy-individual-menu.c34
-rw-r--r--libempathy-gtk/empathy-individual-store.c57
-rw-r--r--libempathy-gtk/empathy-individual-widget.c46
-rw-r--r--libempathy-gtk/empathy-persona-store.c106
-rw-r--r--libempathy-gtk/empathy-persona-view.c11
6 files changed, 163 insertions, 94 deletions
diff --git a/libempathy-gtk/empathy-individual-dialogs.c b/libempathy-gtk/empathy-individual-dialogs.c
index a19787662..e1bd6f11f 100644
--- a/libempathy-gtk/empathy-individual-dialogs.c
+++ b/libempathy-gtk/empathy-individual-dialogs.c
@@ -222,6 +222,9 @@ empathy_block_individual_dialog_show (GtkWindow *parent,
goto while_finish;
contact = tpf_persona_get_contact (persona);
+ if (contact == NULL)
+ goto while_finish;
+
flags = empathy_contact_manager_get_flags_for_connection (
contact_manager, tp_contact_get_connection (contact));
diff --git a/libempathy-gtk/empathy-individual-menu.c b/libempathy-gtk/empathy-individual-menu.c
index 6131bfdfd..eab28ec87 100644
--- a/libempathy-gtk/empathy-individual-menu.c
+++ b/libempathy-gtk/empathy-individual-menu.c
@@ -127,6 +127,9 @@ individual_menu_add_personas (GtkMenuShell *menu,
goto while_finish;
tp_contact = tpf_persona_get_contact (persona);
+ if (tp_contact == NULL)
+ goto while_finish;
+
contact = empathy_contact_dup_from_tp_contact (tp_contact);
store = folks_persona_get_store (FOLKS_PERSONA (persona));
@@ -1038,17 +1041,20 @@ room_sub_menu_activate_cb (GtkWidget *item,
if (empathy_folks_persona_is_interesting (FOLKS_PERSONA (persona)))
{
tp_contact = tpf_persona_get_contact (persona);
- contact = empathy_contact_dup_from_tp_contact (tp_contact);
+ if (tp_contact != NULL)
+ {
+ contact = empathy_contact_dup_from_tp_contact (tp_contact);
- rooms = empathy_chatroom_manager_get_chatrooms (mgr,
- empathy_contact_get_account (contact));
+ rooms = empathy_chatroom_manager_get_chatrooms (mgr,
+ empathy_contact_get_account (contact));
- if (g_list_find (rooms, data->chatroom) == NULL)
- g_clear_object (&contact);
+ if (g_list_find (rooms, data->chatroom) == NULL)
+ g_clear_object (&contact);
- /* if contact != NULL here, we've found our match */
+ /* if contact != NULL here, we've found our match */
- g_list_free (rooms);
+ g_list_free (rooms);
+ }
}
g_clear_object (&persona);
}
@@ -1143,13 +1149,17 @@ empathy_individual_invite_menu_item_new (FolksIndividual *individual,
if (empathy_folks_persona_is_interesting (FOLKS_PERSONA (persona)))
{
tp_contact = tpf_persona_get_contact (persona);
- contact_cur = empathy_contact_dup_from_tp_contact (tp_contact);
+ if (tp_contact != NULL)
+ {
+ contact_cur = empathy_contact_dup_from_tp_contact (
+ tp_contact);
- rooms_cur = empathy_chatroom_manager_get_chatrooms (mgr,
- empathy_contact_get_account (contact_cur));
- rooms = g_list_concat (rooms, rooms_cur);
+ rooms_cur = empathy_chatroom_manager_get_chatrooms (mgr,
+ empathy_contact_get_account (contact_cur));
+ rooms = g_list_concat (rooms, rooms_cur);
- g_object_unref (contact_cur);
+ g_object_unref (contact_cur);
+ }
}
g_clear_object (&persona);
}
diff --git a/libempathy-gtk/empathy-individual-store.c b/libempathy-gtk/empathy-individual-store.c
index e4e644424..4bdded80b 100644
--- a/libempathy-gtk/empathy-individual-store.c
+++ b/libempathy-gtk/empathy-individual-store.c
@@ -133,21 +133,25 @@ individual_can_audio_video_call (FolksIndividual *individual,
{
FolksPersona *persona = gee_iterator_get (iter);
TpContact *tp_contact;
- EmpathyContact *contact;
if (!empathy_folks_persona_is_interesting (persona))
goto while_finish;
tp_contact = tpf_persona_get_contact (TPF_PERSONA (persona));
- contact = empathy_contact_dup_from_tp_contact (tp_contact);
- empathy_contact_set_persona (contact, persona);
+ if (tp_contact != NULL)
+ {
+ EmpathyContact *contact;
+
+ contact = empathy_contact_dup_from_tp_contact (tp_contact);
+ empathy_contact_set_persona (contact, persona);
- can_audio = can_audio || empathy_contact_get_capabilities (contact) &
- EMPATHY_CAPABILITIES_AUDIO;
- can_video = can_video || empathy_contact_get_capabilities (contact) &
- EMPATHY_CAPABILITIES_VIDEO;
+ can_audio = can_audio || empathy_contact_get_capabilities (contact) &
+ EMPATHY_CAPABILITIES_AUDIO;
+ can_video = can_video || empathy_contact_get_capabilities (contact) &
+ EMPATHY_CAPABILITIES_VIDEO;
- g_object_unref (contact);
+ g_object_unref (contact);
+ }
while_finish:
g_clear_object (&persona);
@@ -190,7 +194,8 @@ individual_get_client_types (FolksIndividual *individual)
presence_type = folks_presence_details_get_presence_type (presence);
tp_contact = tpf_persona_get_contact (TPF_PERSONA (persona));
- types = tp_contact_get_client_types (tp_contact);
+ if (tp_contact != NULL)
+ types = tp_contact_get_client_types (tp_contact);
}
while_finish:
@@ -900,14 +905,17 @@ individual_personas_changed_cb (FolksIndividual *individual,
if (TPF_IS_PERSONA (persona))
{
tp_contact = tpf_persona_get_contact (persona);
- contact = empathy_contact_dup_from_tp_contact (tp_contact);
- empathy_contact_set_persona (contact, FOLKS_PERSONA (persona));
+ if (tp_contact != NULL)
+ {
+ contact = empathy_contact_dup_from_tp_contact (tp_contact);
+ empathy_contact_set_persona (contact, FOLKS_PERSONA (persona));
- g_object_set_data (G_OBJECT (contact), "individual", NULL);
- g_signal_handlers_disconnect_by_func (contact,
- (GCallback) individual_store_contact_updated_cb, self);
+ g_object_set_data (G_OBJECT (contact), "individual", NULL);
+ g_signal_handlers_disconnect_by_func (contact,
+ (GCallback) individual_store_contact_updated_cb, self);
- g_object_unref (contact);
+ g_object_unref (contact);
+ }
}
g_clear_object (&persona);
@@ -924,16 +932,19 @@ individual_personas_changed_cb (FolksIndividual *individual,
if (TPF_IS_PERSONA (persona))
{
tp_contact = tpf_persona_get_contact (persona);
- contact = empathy_contact_dup_from_tp_contact (tp_contact);
- empathy_contact_set_persona (contact, FOLKS_PERSONA (persona));
+ if (tp_contact != NULL)
+ {
+ contact = empathy_contact_dup_from_tp_contact (tp_contact);
+ empathy_contact_set_persona (contact, FOLKS_PERSONA (persona));
- g_object_set_data (G_OBJECT (contact), "individual", individual);
- g_signal_connect (contact, "notify::capabilities",
- (GCallback) individual_store_contact_updated_cb, self);
- g_signal_connect (contact, "notify::client-types",
- (GCallback) individual_store_contact_updated_cb, self);
+ g_object_set_data (G_OBJECT (contact), "individual", individual);
+ g_signal_connect (contact, "notify::capabilities",
+ (GCallback) individual_store_contact_updated_cb, self);
+ g_signal_connect (contact, "notify::client-types",
+ (GCallback) individual_store_contact_updated_cb, self);
- g_object_unref (contact);
+ g_object_unref (contact);
+ }
}
g_clear_object (&persona);
diff --git a/libempathy-gtk/empathy-individual-widget.c b/libempathy-gtk/empathy-individual-widget.c
index fcc076b9b..0a3844aa2 100644
--- a/libempathy-gtk/empathy-individual-widget.c
+++ b/libempathy-gtk/empathy-individual-widget.c
@@ -574,16 +574,20 @@ location_update (EmpathyIndividualWidget *self)
* have to keep it alive for the duration of the function, since we're
* accessing its private data. */
tp_contact = tpf_persona_get_contact (TPF_PERSONA (persona));
- contact = empathy_contact_dup_from_tp_contact (tp_contact);
- empathy_contact_set_persona (contact, persona);
-
- /* Try and get a location */
- location = empathy_contact_get_location (contact);
- /* if location isn't fully valid, treat the contact as insufficient */
- if (location != NULL && g_hash_table_size (location) <= 0)
+ if (tp_contact != NULL)
{
- location = NULL;
- g_clear_object (&contact);
+ contact = empathy_contact_dup_from_tp_contact (tp_contact);
+ empathy_contact_set_persona (contact, persona);
+
+ /* Try and get a location */
+ location = empathy_contact_get_location (contact);
+ /* if location isn't fully valid, treat the contact as
+ * insufficient */
+ if (location != NULL && g_hash_table_size (location) <= 0)
+ {
+ location = NULL;
+ g_clear_object (&contact);
+ }
}
}
g_clear_object (&persona);
@@ -747,6 +751,9 @@ location_update (EmpathyIndividualWidget *self)
/* Get the contact */
tp_contact = tpf_persona_get_contact (TPF_PERSONA (persona));
+ if (tp_contact == NULL)
+ goto while_finish;
+
contact = empathy_contact_dup_from_tp_contact (tp_contact);
empathy_contact_set_persona (contact, persona);
@@ -856,6 +863,9 @@ persona_dup_avatar (FolksPersona *persona)
return NULL;
tp_contact = tpf_persona_get_contact (TPF_PERSONA (persona));
+ if (tp_contact == NULL)
+ return NULL;
+
contact = empathy_contact_dup_from_tp_contact (tp_contact);
empathy_contact_set_persona (contact, persona);
@@ -1063,16 +1073,19 @@ individual_is_user (FolksIndividual *individual)
if (TPF_IS_PERSONA (persona))
{
TpContact *tp_contact;
- EmpathyContact *contact;
+ EmpathyContact *contact = NULL;
/* Get the contact */
tp_contact = tpf_persona_get_contact (TPF_PERSONA (persona));
- contact = empathy_contact_dup_from_tp_contact (tp_contact);
- empathy_contact_set_persona (contact, persona);
+ if (tp_contact != NULL)
+ {
+ contact = empathy_contact_dup_from_tp_contact (tp_contact);
+ empathy_contact_set_persona (contact, persona);
- /* Determine if the contact is the user */
- if (empathy_contact_is_user (contact))
- retval = g_object_ref (empathy_contact_get_account (contact));
+ /* Determine if the contact is the user */
+ if (empathy_contact_is_user (contact))
+ retval = g_object_ref (empathy_contact_get_account (contact));
+ }
g_object_unref (contact);
}
@@ -1409,6 +1422,9 @@ update_persona (EmpathyIndividualWidget *self, FolksPersona *persona)
g_assert (table != NULL);
tp_contact = tpf_persona_get_contact (TPF_PERSONA (persona));
+ if (tp_contact == NULL)
+ return;
+
contact = empathy_contact_dup_from_tp_contact (tp_contact);
empathy_contact_set_persona (contact, persona);
diff --git a/libempathy-gtk/empathy-persona-store.c b/libempathy-gtk/empathy-persona-store.c
index a3877788b..70d53b3c1 100644
--- a/libempathy-gtk/empathy-persona-store.c
+++ b/libempathy-gtk/empathy-persona-store.c
@@ -278,6 +278,7 @@ add_persona (EmpathyPersonaStore *self,
GtkTreeIter iter;
GtkTreePath *path;
FolksPersonaStore *store;
+ TpContact *tp_contact;
EmpathyContact *contact;
const gchar *alias;
@@ -290,8 +291,11 @@ add_persona (EmpathyPersonaStore *self,
if (EMP_STR_EMPTY (alias))
return;
- contact = empathy_contact_dup_from_tp_contact (tpf_persona_get_contact (
- TPF_PERSONA (persona)));
+ tp_contact = tpf_persona_get_contact (TPF_PERSONA (persona));
+ if (tp_contact == NULL)
+ return;
+
+ contact = empathy_contact_dup_from_tp_contact (tp_contact);
store = folks_persona_get_store (persona);
gtk_list_store_insert_with_values (GTK_LIST_STORE (self), &iter, 0,
@@ -348,14 +352,18 @@ get_persona_status_icon (EmpathyPersonaStore *self,
FolksPersona *persona)
{
EmpathyPersonaStorePriv *priv = GET_PRIV (self);
+ TpContact *tp_contact;
EmpathyContact *contact;
const gchar *protocol_name = NULL;
gchar *icon_name = NULL;
GdkPixbuf *pixbuf_status = NULL;
const gchar *status_icon_name = NULL;
- contact = empathy_contact_dup_from_tp_contact (tpf_persona_get_contact (
- TPF_PERSONA (persona)));
+ tp_contact = tpf_persona_get_contact (TPF_PERSONA (persona));
+ if (tp_contact == NULL)
+ return NULL;
+
+ contact = empathy_contact_dup_from_tp_contact (tp_contact);
status_icon_name = empathy_icon_name_for_contact (contact);
if (status_icon_name == NULL)
@@ -422,9 +430,10 @@ update_persona (EmpathyPersonaStore *self,
else
{
FolksPersonaStore *store;
+ TpContact *tp_contact;
EmpathyContact *contact;
GtkTreeIter iter;
- GdkPixbuf *pixbuf_avatar;
+ GdkPixbuf *pixbuf_avatar = NULL;
GdkPixbuf *pixbuf_status;
gboolean now_online = FALSE;
gboolean was_online = TRUE;
@@ -464,39 +473,43 @@ update_persona (EmpathyPersonaStore *self,
}
/* We still need to use EmpathyContact for the capabilities stuff */
- contact = empathy_contact_dup_from_tp_contact (tpf_persona_get_contact (
- TPF_PERSONA (persona)));
- store = folks_persona_get_store (persona);
-
- pixbuf_avatar = empathy_pixbuf_avatar_from_contact_scaled (contact,
- 32, 32);
- pixbuf_status = get_persona_status_icon (self, persona);
-
- gtk_list_store_set (GTK_LIST_STORE (self), &iter,
- EMPATHY_PERSONA_STORE_COL_ICON_STATUS, pixbuf_status,
- EMPATHY_PERSONA_STORE_COL_PIXBUF_AVATAR, pixbuf_avatar,
- EMPATHY_PERSONA_STORE_COL_PIXBUF_AVATAR_VISIBLE, priv->show_avatars,
- EMPATHY_PERSONA_STORE_COL_NAME, alias,
- EMPATHY_PERSONA_STORE_COL_ACCOUNT_NAME,
- folks_persona_store_get_display_name (store),
- EMPATHY_PERSONA_STORE_COL_DISPLAY_ID,
- folks_persona_get_display_id (persona),
- EMPATHY_PERSONA_STORE_COL_PRESENCE_TYPE,
- folks_presence_details_get_presence_type (
- FOLKS_PRESENCE_DETAILS (persona)),
- EMPATHY_PERSONA_STORE_COL_STATUS,
- folks_presence_details_get_presence_message (
- FOLKS_PRESENCE_DETAILS (persona)),
- EMPATHY_PERSONA_STORE_COL_IS_ONLINE, now_online,
- EMPATHY_PERSONA_STORE_COL_CAN_AUDIO_CALL,
- empathy_contact_get_capabilities (contact) &
- EMPATHY_CAPABILITIES_AUDIO,
- EMPATHY_PERSONA_STORE_COL_CAN_VIDEO_CALL,
- empathy_contact_get_capabilities (contact) &
- EMPATHY_CAPABILITIES_VIDEO,
- -1);
-
- g_object_unref (contact);
+ tp_contact = tpf_persona_get_contact (TPF_PERSONA (persona));
+ if (tp_contact != NULL)
+ {
+ contact = empathy_contact_dup_from_tp_contact (tp_contact);
+ store = folks_persona_get_store (persona);
+
+ pixbuf_avatar = empathy_pixbuf_avatar_from_contact_scaled (contact,
+ 32, 32);
+ pixbuf_status = get_persona_status_icon (self, persona);
+
+ gtk_list_store_set (GTK_LIST_STORE (self), &iter,
+ EMPATHY_PERSONA_STORE_COL_ICON_STATUS, pixbuf_status,
+ EMPATHY_PERSONA_STORE_COL_PIXBUF_AVATAR, pixbuf_avatar,
+ EMPATHY_PERSONA_STORE_COL_PIXBUF_AVATAR_VISIBLE,
+ priv->show_avatars,
+ EMPATHY_PERSONA_STORE_COL_NAME, alias,
+ EMPATHY_PERSONA_STORE_COL_ACCOUNT_NAME,
+ folks_persona_store_get_display_name (store),
+ EMPATHY_PERSONA_STORE_COL_DISPLAY_ID,
+ folks_persona_get_display_id (persona),
+ EMPATHY_PERSONA_STORE_COL_PRESENCE_TYPE,
+ folks_presence_details_get_presence_type (
+ FOLKS_PRESENCE_DETAILS (persona)),
+ EMPATHY_PERSONA_STORE_COL_STATUS,
+ folks_presence_details_get_presence_message (
+ FOLKS_PRESENCE_DETAILS (persona)),
+ EMPATHY_PERSONA_STORE_COL_IS_ONLINE, now_online,
+ EMPATHY_PERSONA_STORE_COL_CAN_AUDIO_CALL,
+ empathy_contact_get_capabilities (contact) &
+ EMPATHY_CAPABILITIES_AUDIO,
+ EMPATHY_PERSONA_STORE_COL_CAN_VIDEO_CALL,
+ empathy_contact_get_capabilities (contact) &
+ EMPATHY_CAPABILITIES_VIDEO,
+ -1);
+
+ g_object_unref (contact);
+ }
if (pixbuf_avatar)
g_object_unref (pixbuf_avatar);
@@ -566,6 +579,7 @@ sort_personas (FolksPersona *persona_a,
{
EmpathyContact *contact;
TpAccount *account_a, *account_b;
+ TpContact *tp_contact_a, *tp_contact_b;
gint ret_val;
g_return_val_if_fail (persona_a != NULL || persona_b != NULL, 0);
@@ -585,13 +599,21 @@ sort_personas (FolksPersona *persona_a,
if (ret_val != 0)
goto out;
- contact = empathy_contact_dup_from_tp_contact (tpf_persona_get_contact (
- TPF_PERSONA (persona_a)));
+ tp_contact_a = tpf_persona_get_contact (TPF_PERSONA (persona_a));
+ tp_contact_b = tpf_persona_get_contact (TPF_PERSONA (persona_b));
+
+ /* handle the case that one or more of these personas are from the cache */
+ if (tp_contact_a == NULL || tp_contact_b == NULL)
+ {
+ ret_val = (tp_contact_a != NULL ? 1 : -1);
+ goto out;
+ }
+
+ contact = empathy_contact_dup_from_tp_contact (tp_contact_a);
account_a = empathy_contact_get_account (contact);
g_object_unref (contact);
- contact = empathy_contact_dup_from_tp_contact (tpf_persona_get_contact (
- TPF_PERSONA (persona_b)));
+ contact = empathy_contact_dup_from_tp_contact (tp_contact_b);
account_b = empathy_contact_get_account (contact);
g_object_unref (contact);
diff --git a/libempathy-gtk/empathy-persona-view.c b/libempathy-gtk/empathy-persona-view.c
index 6d1629651..5cb77c94b 100644
--- a/libempathy-gtk/empathy-persona-view.c
+++ b/libempathy-gtk/empathy-persona-view.c
@@ -174,6 +174,7 @@ query_tooltip_cb (EmpathyPersonaView *self,
{
EmpathyPersonaViewPriv *priv = GET_PRIV (self);
FolksPersona *persona;
+ TpContact *tp_contact;
EmpathyContact *contact;
GtkTreeModel *model;
GtkTreeIter iter;
@@ -201,8 +202,14 @@ query_tooltip_cb (EmpathyPersonaView *self,
if (persona == NULL)
goto OUT;
- contact = empathy_contact_dup_from_tp_contact (tpf_persona_get_contact (
- TPF_PERSONA (persona)));
+ tp_contact = tpf_persona_get_contact (TPF_PERSONA (persona));
+ if (tp_contact == NULL)
+ {
+ g_clear_object (&persona);
+ goto OUT;
+ }
+
+ contact = empathy_contact_dup_from_tp_contact (tp_contact);
if (priv->tooltip_widget == NULL)
{