virtual bool matches(const IndividualData &data) const
 {
     FolksIndividual *individual = data.m_individual.get();
     FolksNameDetails *name = FOLKS_NAME_DETAILS(individual);
     const char *fullname = folks_name_details_get_full_name(name);
     if (containsSearchText(fullname)) {
         return true;
     }
     const char *nickname = folks_name_details_get_nickname(name);
     if (containsSearchText(nickname)) {
         return true;
     }
     FolksStructuredName *fn =
         folks_name_details_get_structured_name(FOLKS_NAME_DETAILS(individual));
     if (fn) {
         const char *given = folks_structured_name_get_given_name(fn);
         if (containsSearchText(given)) {
             return true;
         }
         const char *middle = folks_structured_name_get_additional_names(fn);
         if (containsSearchText(middle)) {
             return true;
         }
         const char *family = folks_structured_name_get_family_name(fn);
         if (containsSearchText(family)) {
             return true;
         }
     }
     FolksEmailDetails *emailDetails = FOLKS_EMAIL_DETAILS(individual);
     GeeSet *emails = folks_email_details_get_email_addresses(emailDetails);
     BOOST_FOREACH (FolksAbstractFieldDetails *email, GeeCollCXX<FolksAbstractFieldDetails *>(emails, ADD_REF)) {
         const gchar *value =
             reinterpret_cast<const gchar *>(folks_abstract_field_details_get_value(email));
         if (containsSearchText(value)) {
             return true;
         }
     }
     FolksPhoneDetails *phoneDetails = FOLKS_PHONE_DETAILS(individual);
     GeeSet *phones = folks_phone_details_get_phone_numbers(phoneDetails);
     BOOST_FOREACH (FolksAbstractFieldDetails *phone, GeeCollCXX<FolksAbstractFieldDetails *>(phones, ADD_REF)) {
         const gchar *value =
             reinterpret_cast<const gchar *>(folks_abstract_field_details_get_value(phone));
         if (containsSearchTel(value)) {
             return true;
         }
     }
     return false;
 }
Beispiel #2
0
/**
 * cinnamon_contact_system_get_email_for_display:
 * @self: A #CinnamonContactSystem
 * @individual A #FolksIndividual
 *
 * Get an email address (either from IM addresses or email), which can be
 * used to represent @individual.
 *
 * Return: (transfer full): a newly allocated string or %NULL if no address
 *                          was found
 */
char *
cinnamon_contact_system_get_email_for_display (CinnamonContactSystem *self,
                                            FolksIndividual    *individual)
{
  GeeMultiMap *im_addr_map = folks_im_details_get_im_addresses (FOLKS_IM_DETAILS (individual));
  GeeCollection *im_addrs = gee_multi_map_get_values (im_addr_map);
  GeeSet *email_addrs = folks_email_details_get_email_addresses (FOLKS_EMAIL_DETAILS (individual));
  GeeIterator *addrs_iter;
  char *email = NULL;

  addrs_iter = gee_iterable_iterator (GEE_ITERABLE (im_addrs));
  if (gee_iterator_first (addrs_iter))
    {
      FolksImFieldDetails *field = gee_iterator_get (addrs_iter);
      email = g_strdup (folks_abstract_field_details_get_value ((FolksAbstractFieldDetails*)field));

      g_object_unref (field);
    }

  g_object_unref (addrs_iter);
  g_object_unref (im_addrs);

  if (email != NULL)
    return email;

  addrs_iter = gee_iterable_iterator (GEE_ITERABLE (email_addrs));

  if (gee_iterator_first (addrs_iter))
    {
      FolksEmailFieldDetails *field = gee_iterator_get (addrs_iter);
      email = g_strdup (folks_abstract_field_details_get_value ((FolksAbstractFieldDetails*)field));

      g_object_unref (field);
    }

  g_object_unref (addrs_iter);

  return email;
}
Beispiel #3
0
static guint
do_match (CinnamonContactSystem  *self,
          FolksIndividual     *individual,
          GSList              *terms)
{
  GSList *term_iter;
  guint weight = 0;

  char *alias = cinnamon_util_normalize_and_casefold (folks_alias_details_get_alias (FOLKS_ALIAS_DETAILS (individual)));
  char *name = cinnamon_util_normalize_and_casefold (folks_name_details_get_full_name (FOLKS_NAME_DETAILS (individual)));
  char *nick = cinnamon_util_normalize_and_casefold (folks_name_details_get_nickname (FOLKS_NAME_DETAILS (individual)));

  GeeMultiMap *im_addr_map = folks_im_details_get_im_addresses (FOLKS_IM_DETAILS (individual));
  GeeCollection *im_addrs = gee_multi_map_get_values (im_addr_map);
  GeeSet *email_addrs = folks_email_details_get_email_addresses (FOLKS_EMAIL_DETAILS (individual));
  GeeIterator *addrs_iter;

  gboolean have_name_prefix = FALSE;
  gboolean have_name_substring = FALSE;
  
  gboolean have_addr_prefix = FALSE;
  gboolean have_addr_substring = FALSE;

  for (term_iter = terms; term_iter; term_iter = term_iter->next)
    {
      const char *term = term_iter->data;
      const char *p;
      gboolean matched;

      matched = FALSE;

      /* Match on alias, name, nickname */
      if (alias != NULL)
	{
	  p = strstr (alias, term);
	  if (p == alias)
            {
	      have_name_prefix = TRUE;
              matched = TRUE;
            }
	  else if (p != NULL)
            {
	      have_name_substring = TRUE;
              matched = TRUE;
            }
	}
      if (name != NULL)
	{
	  p = strstr (name, term);
	  if (p == name)
            {
	      have_name_prefix = TRUE;
              matched = TRUE;
            }
	  else if (p != NULL)
            {
	      have_name_substring = TRUE;
              matched = TRUE;
            }
	}
      if (nick != NULL)
	{
	  p = strstr (nick, term);
	  if (p == nick)
            {
	      have_name_prefix = TRUE;
              matched = TRUE;
            }
	  else if (p != NULL)
            {
	      have_name_substring = TRUE;
              matched = TRUE;
            }
	}

      /* Match on one or more IM or email addresses */
      addrs_iter = gee_iterable_iterator (GEE_ITERABLE (im_addrs));

      while (gee_iterator_next (addrs_iter))
        {
          FolksImFieldDetails *field = gee_iterator_get (addrs_iter);
          const gchar *addr = folks_abstract_field_details_get_value ((FolksAbstractFieldDetails*)field);

          p = strstr (addr, term);
          if (p == addr)
            {
              have_addr_prefix = TRUE;
              matched = TRUE;
            }
          else if (p != NULL)
            {
              have_addr_substring = TRUE;
              matched = TRUE;
            }

          g_object_unref (field);
        }

      g_object_unref (addrs_iter);
      addrs_iter = gee_iterable_iterator (GEE_ITERABLE (email_addrs));
      while (gee_iterator_next (addrs_iter))
        {
          FolksEmailFieldDetails *field = gee_iterator_get (addrs_iter);
          const gchar *addr = folks_abstract_field_details_get_value ((FolksAbstractFieldDetails*)field);

          p = strstr (addr, term);
          if (p == addr)
            {
              have_addr_prefix = TRUE;
              matched = TRUE;
            }
          else if (p != NULL)
            {
              have_addr_substring = TRUE;
              matched = TRUE;
            }

          g_object_unref (field);
        }

      g_object_unref (addrs_iter);

      if (!matched)
        {
          have_name_prefix = FALSE;
          have_name_substring = FALSE;
          have_addr_prefix = FALSE;
          have_addr_substring = FALSE;
          break;
        }
    }

    if (have_name_prefix)
      weight += NAME_PREFIX_MATCH_WEIGHT;
    else if (have_name_substring)
      weight += NAME_SUBSTRING_MATCH_WEIGHT;

    if (have_addr_prefix)
      weight += ADDR_PREFIX_MATCH_WEIGHT;
    else if (have_addr_substring)
      weight += ADDR_SUBSTRING_MATCH_WEIGHT;

  g_free (alias);
  g_free (name);
  g_free (nick);
  g_object_unref (im_addrs);

  return weight;
}