diff options
author | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2011-04-14 12:42:29 +0800 |
---|---|---|
committer | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2011-10-21 06:40:24 +0800 |
commit | e6c2a6706880dad768b5a442d350e6c0d8e0f975 (patch) | |
tree | 884fcc5c8ac89c9375ac42e1b18b39ad8464874d | |
parent | d4b219993118e76fdf25a609839e1c334e26182f (diff) | |
download | gsoc2013-empathy-e6c2a6706880dad768b5a442d350e6c0d8e0f975.tar gsoc2013-empathy-e6c2a6706880dad768b5a442d350e6c0d8e0f975.tar.gz gsoc2013-empathy-e6c2a6706880dad768b5a442d350e6c0d8e0f975.tar.bz2 gsoc2013-empathy-e6c2a6706880dad768b5a442d350e6c0d8e0f975.tar.lz gsoc2013-empathy-e6c2a6706880dad768b5a442d350e6c0d8e0f975.tar.xz gsoc2013-empathy-e6c2a6706880dad768b5a442d350e6c0d8e0f975.tar.zst gsoc2013-empathy-e6c2a6706880dad768b5a442d350e6c0d8e0f975.zip |
Abstract common contactinfo code into empathy-contactinfo-utils
This handles things like sorting fields and converting field names to human
readable names.
-rw-r--r-- | libempathy/Makefile.am | 2 | ||||
-rw-r--r-- | libempathy/empathy-contactinfo-utils.c | 185 | ||||
-rw-r--r-- | libempathy/empathy-contactinfo-utils.h | 41 |
3 files changed, 228 insertions, 0 deletions
diff --git a/libempathy/Makefile.am b/libempathy/Makefile.am index 079b4736b..bb3088234 100644 --- a/libempathy/Makefile.am +++ b/libempathy/Makefile.am @@ -39,6 +39,7 @@ libempathy_headers = \ empathy-contact-list.h \ empathy-contact-manager.h \ empathy-contact.h \ + empathy-contactinfo-utils.h \ empathy-debug.h \ empathy-ft-factory.h \ empathy-ft-handler.h \ @@ -82,6 +83,7 @@ libempathy_handwritten_source = \ empathy-contact-list.c \ empathy-contact-manager.c \ empathy-contact.c \ + empathy-contactinfo-utils.c \ empathy-debug.c \ empathy-ft-factory.c \ empathy-ft-handler.c \ diff --git a/libempathy/empathy-contactinfo-utils.c b/libempathy/empathy-contactinfo-utils.c new file mode 100644 index 000000000..c4bbeb1ab --- /dev/null +++ b/libempathy/empathy-contactinfo-utils.c @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2007-2011 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: Xavier Claessens <xclaesse@gmail.com> + * Philip Withnall <philip.withnall@collabora.co.uk> + * Danielle Madeley <danielle.madeley@collabora.co.uk> + */ + +#include <config.h> + +#include <string.h> + +#include <glib/gi18n-lib.h> + +#include <telepathy-glib/util.h> + +#include "empathy-contactinfo-utils.h" + +typedef struct +{ + const gchar *field_name; + const gchar *title; + gboolean linkify; +} InfoFieldData; + +static InfoFieldData info_field_data[] = +{ + { "fn", N_("Full name"), FALSE }, + { "tel", N_("Phone number"), FALSE }, + { "email", N_("E-mail address"), TRUE }, + { "url", N_("Website"), TRUE }, + { "bday", N_("Birthday"), FALSE }, + { NULL, NULL } +}; + +typedef struct +{ + const gchar *type; + const gchar *title; +} InfoParameterData; + +static InfoParameterData info_parameter_data[] = +{ + { "work", N_("work") }, + { "home", N_("home") }, + { "cell", N_("mobile") }, + { "voice", N_("voice") }, + { "pref", N_("preferred") }, + { "postal", N_("postal") }, + { "parcel", N_("parcel") }, + { NULL, NULL } +}; + +gboolean +empathy_contact_info_lookup_field (const gchar *field_name, + const gchar **title, + gboolean *linkify) +{ + guint i; + + for (i = 0; info_field_data[i].field_name != NULL; i++) + { + if (tp_strdiff (info_field_data[i].field_name, field_name) == FALSE) + { + if (title != NULL) + *title = gettext (info_field_data[i].title); + + if (linkify != NULL) + *linkify = info_field_data[i].linkify; + + return TRUE; + } + } + + return FALSE; +} + +static char * +build_parameters_string (GStrv parameters) +{ + GPtrArray *output = g_ptr_array_new (); + char *join; + GStrv iter; + + for (iter = parameters; iter != NULL && *iter != NULL; iter++) + { + static const char *prefix = "type="; + const char *param = *iter; + InfoParameterData *iter2; + + if (!g_str_has_prefix (param, prefix)) + continue; + + param += strlen (prefix); + + for (iter2 = info_parameter_data; iter2->type != NULL; iter2++) + { + if (!tp_strdiff (iter2->type, param)) + { + g_ptr_array_add (output, gettext (iter2->title)); + break; + } + } + } + + if (output->len == 0) + return NULL; + + g_ptr_array_add (output, NULL); /* NULL-terminate */ + + join = g_strjoinv (", ", (char **) output->pdata); + g_ptr_array_free (output, TRUE); + + return join; +} + +char * +empathy_contact_info_field_label (const char *field_name, + GStrv parameters) +{ + char *ret; + const char *title; + char *join = build_parameters_string (parameters); + + if (!empathy_contact_info_lookup_field (field_name, &title, NULL)) + return NULL; + + if (join != NULL) + ret = g_strdup_printf ("%s (%s):", title, join); + else + ret = g_strdup_printf ("%s:", title); + + g_free (join); + + return ret; +} + +static gint +contact_info_field_name_cmp (const gchar *name1, + const gchar *name2) +{ + guint i; + + if (tp_strdiff (name1, name2) == FALSE) + return 0; + + /* We use the order of info_field_data */ + for (i = 0; info_field_data[i].field_name != NULL; i++) + { + if (tp_strdiff (info_field_data[i].field_name, name1) == FALSE) + return -1; + if (tp_strdiff (info_field_data[i].field_name, name2) == FALSE) + return +1; + } + + return g_strcmp0 (name1, name2); +} + +gint +empathy_contact_info_field_cmp (TpContactInfoField *field1, + TpContactInfoField *field2) +{ + return contact_info_field_name_cmp (field1->field_name, field2->field_name); +} + +gint +empathy_contact_info_field_spec_cmp (TpContactInfoFieldSpec *spec1, + TpContactInfoFieldSpec *spec2) +{ + return contact_info_field_name_cmp (spec1->name, spec2->name); +} diff --git a/libempathy/empathy-contactinfo-utils.h b/libempathy/empathy-contactinfo-utils.h new file mode 100644 index 000000000..059085c84 --- /dev/null +++ b/libempathy/empathy-contactinfo-utils.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2011 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: Danielle Madeley <danielle.madeley@collabora.co.uk> + */ + +#ifndef __EMPATHY_CONTACTINFO_UTILS_H__ +#define __EMPATHY_CONTACTINFO_UTILS_H__ + +#include <glib.h> +#include <telepathy-glib/connection.h> + +G_BEGIN_DECLS + +gboolean empathy_contact_info_lookup_field (const gchar *field_name, + const gchar **title, gboolean *linkify); +char *empathy_contact_info_field_label (const char *field_name, + GStrv parameters); + +gint empathy_contact_info_field_cmp (TpContactInfoField *field1, + TpContactInfoField *field2); +gint empathy_contact_info_field_spec_cmp (TpContactInfoFieldSpec *spec1, + TpContactInfoFieldSpec *spec2); + +G_END_DECLS + +#endif /* __EMPATHY_UTILS_H__ */ |