static void tp_contact_notify_cb (TpContact *tp_contact, GParamSpec *param, GObject *contact) { EmpathyContactPriv *priv = GET_PRIV (contact); /* Forward property notifications */ if (!tp_strdiff (param->name, "alias")) g_object_notify (contact, "name"); else if (!tp_strdiff (param->name, "presence-type")) { TpConnectionPresenceType presence; presence = empathy_contact_get_presence (EMPATHY_CONTACT (contact)); g_signal_emit (contact, signals[PRESENCE_CHANGED], 0, presence, priv->presence); priv->presence = presence; g_object_notify (contact, "presence"); } else if (!tp_strdiff (param->name, "presence-message")) g_object_notify (contact, "presence-message"); else if (!tp_strdiff (param->name, "identifier")) g_object_notify (contact, "id"); else if (!tp_strdiff (param->name, "handle")) g_object_notify (contact, "handle"); else if (!tp_strdiff (param->name, "location")) { GHashTable *location; location = tp_contact_get_location (tp_contact); /* This will start a geoclue search to find the address if needed */ empathy_contact_set_location (EMPATHY_CONTACT (contact), location); } }
static void tp_contact_notify_cb (TpContact *tp_contact, GParamSpec *param, GObject *contact) { EmpathyContactPriv *priv = GET_PRIV (contact); /* Forward property notifications */ if (!tp_strdiff (param->name, "alias")) g_object_notify (contact, "name"); else if (!tp_strdiff (param->name, "presence-type")) { McPresence presence; presence = empathy_contact_get_presence (EMPATHY_CONTACT (contact)); g_signal_emit (contact, signals[PRESENCE_CHANGED], 0, presence, priv->presence); priv->presence = presence; g_object_notify (contact, "presence"); } else if (!tp_strdiff (param->name, "presence-message")) g_object_notify (contact, "presence-message"); else if (!tp_strdiff (param->name, "identifier")) g_object_notify (contact, "id"); else if (!tp_strdiff (param->name, "handle")) g_object_notify (contact, "handle"); }
static void aggregator_add_persona_from_details_cb (GObject *source, GAsyncResult *result, gpointer user_data) { 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 ( aggregator, result, &error); if (error != NULL) { g_warning ("failed to add individual from contact: %s", error->message); g_clear_error (&error); } /* The persona can be NULL even if there wasn't an error, if the persona was * already in the contact list */ if (persona != NULL) { /* Set the contact's persona */ empathy_contact_set_persona (contact, persona); g_object_unref (persona); } g_object_unref (contact); }
/* This callback is called by geoclue when it found a position * for the given address. A position is necessary for a contact * to show up on the map */ static void geocode_cb (GeoclueGeocode *geocode, GeocluePositionFields fields, double latitude, double longitude, double altitude, GeoclueAccuracy *accuracy, GError *error, gpointer contact) { GValue *new_value; GHashTable *location; location = empathy_contact_get_location (EMPATHY_CONTACT (contact)); if (error != NULL) { DEBUG ("Error geocoding location : %s", error->message); g_object_unref (geocode); g_object_unref (contact); return; } if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE) { new_value = tp_g_value_slice_new_double (latitude); g_hash_table_replace (location, g_strdup (EMPATHY_LOCATION_LAT), new_value); DEBUG ("\t - Latitude: %f", latitude); } if (fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) { new_value = tp_g_value_slice_new_double (longitude); g_hash_table_replace (location, g_strdup (EMPATHY_LOCATION_LON), new_value); DEBUG ("\t - Longitude: %f", longitude); } if (fields & GEOCLUE_POSITION_FIELDS_ALTITUDE) { new_value = tp_g_value_slice_new_double (altitude); g_hash_table_replace (location, g_strdup (EMPATHY_LOCATION_ALT), new_value); DEBUG ("\t - Altitude: %f", altitude); } /* Don't change the accuracy as we used an address to get this position */ g_object_notify (contact, "location"); g_object_unref (geocode); g_object_unref (contact); }
static gint contact_list_store_state_sort_func (GtkTreeModel *model, GtkTreeIter *iter_a, GtkTreeIter *iter_b, gpointer user_data) { gint ret_val = 0; gchar *name_a, *name_b; gboolean is_separator_a, is_separator_b; EmpathyContact *contact_a, *contact_b; gtk_tree_model_get (model, iter_a, EMPATHY_CONTACT_LIST_STORE_COL_NAME, &name_a, EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, &contact_a, EMPATHY_CONTACT_LIST_STORE_COL_IS_SEPARATOR, &is_separator_a, -1); gtk_tree_model_get (model, iter_b, EMPATHY_CONTACT_LIST_STORE_COL_NAME, &name_b, EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, &contact_b, EMPATHY_CONTACT_LIST_STORE_COL_IS_SEPARATOR, &is_separator_b, -1); /* Separator or group? */ if (is_separator_a || is_separator_b) { if (is_separator_a) { ret_val = -1; } else if (is_separator_b) { ret_val = 1; } } else if (!contact_a && contact_b) { ret_val = 1; } else if (contact_a && !contact_b) { ret_val = -1; } else if (!contact_a && !contact_b) { /* Handle groups */ ret_val = g_utf8_collate (name_a, name_b); } if (ret_val) { goto free_and_out; } /* If we managed to get this far, we can start looking at * the presences. */ ret_val = -tp_connection_presence_type_cmp_availability ( empathy_contact_get_presence (EMPATHY_CONTACT (contact_a)), empathy_contact_get_presence (EMPATHY_CONTACT (contact_b))); if (ret_val == 0) { /* Fallback: compare by name */ ret_val = g_utf8_collate (name_a, name_b); } free_and_out: g_free (name_a); g_free (name_b); if (contact_a) { g_object_unref (contact_a); } if (contact_b) { g_object_unref (contact_b); } return ret_val; }