+contact_name_or_email_starts_with (OssoABookContact *contact,
+ gpointer user_data)
+{
+ const char *prefix = user_data;
+ gboolean rv = FALSE;
+ GList *contacts, *l;
+
+
+ contacts = osso_abook_contact_get_roster_contacts (contact);
+ contacts = g_list_prepend (contacts, contact);
+
+ for (l = contacts; l; l = l->next) {
+ GList *attrs;
+ attrs = e_vcard_get_attributes (E_VCARD (l->data));
+ for (;attrs;attrs = attrs->next) {
+ EVCardAttribute *attr = attrs->data;
+ const char *name;
+
+ name = e_vcard_attribute_get_name (attr);
+ if (!g_strcmp0 (name, "N") ||
+ (strchr (prefix, '@') && !g_strcmp0 (name, "EMAIL"))) {
+ GList *values = e_vcard_attribute_get_values (attr);
+ gchar *prefix_down = g_utf8_strdown (prefix, -1);
+
+ for (;values; values = values->next) {
+ gchar *value_down = NULL;
+
+ if (g_strcmp0 (values->data, ""))
+ value_down = g_utf8_strdown (values->data, -1);
+
+ if (value_down && g_str_has_prefix (value_down, prefix_down)) {
+ rv = TRUE;
+ g_free (value_down);
+ g_free (prefix_down);
+ goto out;
+ }
+ g_free (value_down);
+ }
+ g_free (prefix_down);
+ }
+ }
+ }
+ out:
+ g_list_free (contacts);
+
+ return rv;
+}
+
+static gboolean