[evolution-data-server/sqlite-refactor: 3/18] ECollator: Added e_collator_new_interpret_country()
- From: Tristan Van Berkom <tvb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/sqlite-refactor: 3/18] ECollator: Added e_collator_new_interpret_country()
- Date: Tue, 26 Nov 2013 16:45:04 +0000 (UTC)
commit 793b3367802463caf44947a821434ee62052cea2
Author: Tristan Van Berkom <tristanvb openismus com>
Date: Wed Nov 27 01:03:17 2013 +0900
ECollator: Added e_collator_new_interpret_country()
ICU is our best source for parsing locale strings, this
is just a convenience for EBookBackendSqlite to get the active
country code for phone number parsing.
libedataserver/e-collator.c | 54 +++++++++++++++++++++++++++++++++++++++++-
libedataserver/e-collator.h | 4 +++
2 files changed, 56 insertions(+), 2 deletions(-)
---
diff --git a/libedataserver/e-collator.c b/libedataserver/e-collator.c
index 30de005..05b01ec 100644
--- a/libedataserver/e-collator.c
+++ b/libedataserver/e-collator.c
@@ -124,11 +124,13 @@ print_available_locales (void)
static gchar *
canonicalize_locale (const gchar *posix_locale,
gchar **language_code,
+ gchar **country_code,
GError **error)
{
UErrorCode status = U_ZERO_ERROR;
gchar locale_buffer[LOCALE_BUFFER_LEN];
gchar language_buffer[8];
+ gchar country_buffer[8];
gchar *icu_locale;
gchar *final_locale;
gint len;
@@ -155,7 +157,6 @@ canonicalize_locale (const gchar *posix_locale,
status = U_ZERO_ERROR;
len = uloc_getLanguage (icu_locale, language_buffer, 8, &status);
-
if (U_FAILURE (status)) {
g_set_error (error, E_COLLATOR_ERROR,
E_COLLATOR_ERROR_INVALID_LOCALE,
@@ -166,6 +167,18 @@ canonicalize_locale (const gchar *posix_locale,
return NULL;
}
+ status = U_ZERO_ERROR;
+ len = uloc_getCountry (icu_locale, country_buffer, 8, &status);
+ if (U_FAILURE (status)) {
+ g_set_error (error, E_COLLATOR_ERROR,
+ E_COLLATOR_ERROR_INVALID_LOCALE,
+ "Failed to interpret country for locale '%s': %s",
+ icu_locale,
+ u_errorName (status));
+ g_free (icu_locale);
+ return NULL;
+ }
+
/* Add 'phonebook' tailoring to certain locales */
if (len < 8 &&
(strcmp (language_buffer, "de") == 0 ||
@@ -186,6 +199,9 @@ canonicalize_locale (const gchar *posix_locale,
if (language_code)
*language_code = g_strdup (language_buffer);
+ if (country_code)
+ *country_code = g_strdup (country_buffer);
+
return final_locale;
}
@@ -282,11 +298,36 @@ ECollator *
e_collator_new (const gchar *locale,
GError **error)
{
+ return e_collator_new_interpret_country (locale, NULL, error);
+}
+
+/**
+ * e_collator_new_interpret_country:
+ * @locale: The locale under which to sort
+ * @country_code: (allow-none) (out) (transfer full): A location to store the interpreted country code from
@locale
+ * @error: (allow-none): A location to store a #GError from the #E_COLLATOR_ERROR domain
+ *
+ * Creates a new #ECollator for the given @locale,
+ * the returned collator should be freed with e_collator_unref().
+ *
+ * In addition, this also reliably interprets the country
+ * code from the @locale string and stores it to @country_code.
+ *
+ * Returns: (transfer full): A newly created #ECollator.
+ *
+ * Since: 3.12
+ */
+ECollator *
+e_collator_new_interpret_country (const gchar *locale,
+ gchar **country_code,
+ GError **error)
+{
ECollator *collator;
UCollator *coll;
UErrorCode status = U_ZERO_ERROR;
gchar *icu_locale;
gchar *language_code = NULL;
+ gchar *local_country_code = NULL;
g_return_val_if_fail (locale && locale[0], NULL);
@@ -294,7 +335,10 @@ e_collator_new (const gchar *locale,
print_available_locales ();
#endif
- icu_locale = canonicalize_locale (locale, &language_code, error);
+ icu_locale = canonicalize_locale (locale,
+ &language_code,
+ &local_country_code,
+ error);
if (!icu_locale)
return NULL;
@@ -308,6 +352,7 @@ e_collator_new (const gchar *locale,
u_errorName (status));
g_free (language_code);
+ g_free (local_country_code);
g_free (icu_locale);
ucol_close (coll);
return NULL;
@@ -336,6 +381,11 @@ e_collator_new (const gchar *locale,
g_free (language_code);
+ if (country_code)
+ *country_code = local_country_code;
+ else
+ g_free (local_country_code);
+
return collator;
}
diff --git a/libedataserver/e-collator.h b/libedataserver/e-collator.h
index 933c6d1..29b6e80 100644
--- a/libedataserver/e-collator.h
+++ b/libedataserver/e-collator.h
@@ -70,6 +70,10 @@ GType e_collator_get_type (void);
GQuark e_collator_error_quark (void);
ECollator *e_collator_new (const gchar *locale,
GError **error);
+ECollator *e_collator_new_interpret_country
+ (const gchar *locale,
+ gchar **country_code,
+ GError **error);
ECollator *e_collator_ref (ECollator *collator);
void e_collator_unref (ECollator *collator);
gchar *e_collator_generate_key (ECollator *collator,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]