[evolution-data-server/openismus-work-master] ECollator: Use the private EAlphabetIndex



commit 235887b49b1d69da60356131d5cc527235e1ead4
Author: Tristan Van Berkom <tristanvb openismus com>
Date:   Fri Jun 7 22:44:08 2013 +0900

    ECollator: Use the private EAlphabetIndex
    
    This allows ECollator to export 2 new APIs:
    
      o e_collator_get_index_labels()
    
        List the alphabet for the given locale
    
      o e_collator_get_index()
    
        Determine what position in the alphabet a given word belongs

 libedataserver/e-collator.c |   72 +++++++++++++++++++++++++++++++++++++++++--
 libedataserver/e-collator.h |   35 ++++++++++++--------
 2 files changed, 90 insertions(+), 17 deletions(-)
---
diff --git a/libedataserver/e-collator.c b/libedataserver/e-collator.c
index 8636f3d..a337ad9 100644
--- a/libedataserver/e-collator.c
+++ b/libedataserver/e-collator.c
@@ -31,6 +31,7 @@
 #include <unicode/ustring.h>
 
 #include "e-collator.h"
+#include "e-alphabet-index-private.h"
 
 #define CONVERT_BUFFER_LEN        512
 #define COLLATION_KEY_BUFFER_LEN  1024
@@ -47,9 +48,16 @@ G_DEFINE_BOXED_TYPE (ECollator,
 
 struct _ECollator
 {
-       UCollator *coll;
+       UCollator       *coll;
+
+       EAlphabetIndex  *alpha_index;
+       gchar          **labels;
+       gint             n_labels;
+       gint             underflow;
+       gint             inflow;
+       gint             overflow;
 
-       gint       ref_count;
+       gint             ref_count;
 };
 
 /*****************************************************
@@ -100,6 +108,7 @@ print_available_locales (void)
 
 static gchar *
 canonicalize_locale (const gchar  *posix_locale,
+                    gchar       **language_code,
                     GError      **error)
 {
        UErrorCode status = U_ZERO_ERROR;
@@ -159,6 +168,9 @@ canonicalize_locale (const gchar  *posix_locale,
 
        g_free (icu_locale);
 
+       if (language_code)
+               *language_code = g_strdup (language_buffer);
+
        return final_locale;
 }
 
@@ -259,6 +271,7 @@ e_collator_new (const gchar     *locale,
        UCollator *coll;
        UErrorCode status = U_ZERO_ERROR;
        gchar     *icu_locale;
+       gchar     *language_code = NULL;
 
        g_return_val_if_fail (locale && locale[0], NULL);
 
@@ -266,7 +279,7 @@ e_collator_new (const gchar     *locale,
        print_available_locales ();
 #endif
 
-       icu_locale = canonicalize_locale (locale, error);
+       icu_locale = canonicalize_locale (locale, &language_code, error);
        if (!icu_locale)
                return NULL;
 
@@ -279,6 +292,7 @@ e_collator_new (const gchar     *locale,
                             icu_locale,
                             u_errorName (status));
 
+               g_free (language_code);
                g_free (icu_locale);
                ucol_close (coll);
                return NULL;
@@ -292,6 +306,16 @@ e_collator_new (const gchar     *locale,
        collator->coll = coll;
        collator->ref_count = 1;
 
+       /* Setup the AlphabeticIndex */
+       collator->alpha_index = _e_alphabet_index_cxx_new_for_language (language_code);
+       collator->labels = _e_alphabet_index_cxx_get_labels (collator->alpha_index,
+                                                            &collator->n_labels,
+                                                            &collator->underflow,
+                                                            &collator->inflow,
+                                                            &collator->overflow);
+
+       g_free (language_code);
+
        return collator;
 }
 
@@ -339,6 +363,9 @@ e_collator_unref (ECollator *collator)
                if (collator->coll)
                        ucol_close (collator->coll);
 
+               _e_alphabet_index_cxx_free (collator->alpha_index);
+               g_strfreev (collator->labels);
+
                g_slice_free (ECollator, collator);
        }
 }
@@ -488,3 +515,42 @@ e_collator_collate (ECollator    *collator,
 
        return success;
 }
+
+/**
+ * e_collator_get_index_labels:
+ *
+ *
+ */
+const gchar *const  *
+e_collator_get_index_labels (ECollator       *collator,
+                            gint            *n_labels,
+                            gint            *underflow,
+                            gint            *inflow,
+                            gint            *overflow)
+{
+       g_return_val_if_fail (collator != NULL, NULL);
+
+       if (n_labels)
+               *n_labels = collator->n_labels;
+       if (underflow)
+               *underflow = collator->underflow;
+       if (inflow)
+               *inflow = collator->inflow;
+       if (overflow)
+               *overflow = collator->overflow;
+
+       return (const gchar *const  *)collator->labels;
+}
+
+/**
+ * e_collator_get_index:
+ *
+ */
+gint
+e_collator_get_index (ECollator       *collator,
+                     const gchar     *str)
+{
+       g_return_val_if_fail (collator != NULL, -1);
+
+       return _e_alphabet_index_cxx_get_index (collator->alpha_index, str ? str : "");
+}
diff --git a/libedataserver/e-collator.h b/libedataserver/e-collator.h
index 5d19273..cac3c5c 100644
--- a/libedataserver/e-collator.h
+++ b/libedataserver/e-collator.h
@@ -66,20 +66,27 @@ typedef enum {
  */
 typedef struct _ECollator ECollator;
 
-GType          e_collator_get_type        (void);
-GQuark         e_collator_error_quark     (void);
-ECollator      *e_collator_new             (const gchar     *locale,
-                                           GError         **error);
-ECollator      *e_collator_ref             (ECollator       *collator);
-void            e_collator_unref           (ECollator       *collator);
-gchar          *e_collator_generate_key    (ECollator       *collator,
-                                           const gchar     *str,
-                                           GError         **error);
-gboolean        e_collator_collate         (ECollator       *collator,
-                                           const gchar     *str_a,
-                                           const gchar     *str_b,
-                                           gint            *result,
-                                           GError         **error);
+GType                e_collator_get_type         (void);
+GQuark               e_collator_error_quark      (void);
+ECollator           *e_collator_new              (const gchar     *locale,
+                                                 GError         **error);
+ECollator           *e_collator_ref              (ECollator       *collator);
+void                 e_collator_unref            (ECollator       *collator);
+gchar               *e_collator_generate_key     (ECollator       *collator,
+                                                 const gchar     *str,
+                                                 GError         **error);
+gboolean             e_collator_collate          (ECollator       *collator,
+                                                 const gchar     *str_a,
+                                                 const gchar     *str_b,
+                                                 gint            *result,
+                                                 GError         **error);
+const gchar *const  *e_collator_get_index_labels (ECollator       *collator,
+                                                 gint            *n_labels,
+                                                 gint            *underflow,
+                                                 gint            *inflow,
+                                                 gint            *overflow);
+gint                 e_collator_get_index        (ECollator       *collator,
+                                                 const gchar     *str);
 
 G_END_DECLS
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]