[evolution-data-server/openismus-work-3-8: 98/116] Added ETransliterator wrapper object.
- From: Tristan Van Berkom <tvb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/openismus-work-3-8: 98/116] Added ETransliterator wrapper object.
- Date: Tue, 1 Oct 2013 19:06:29 +0000 (UTC)
commit 0471dca976bfc738c8b7495c8b1f7b2796ea6505
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date: Tue Aug 27 12:47:24 2013 +0200
Added ETransliterator wrapper object.
Exposes a C api to the transliterator service separately from
the ECollator API.
libedataserver/Makefile.am | 2 +
libedataserver/e-collator.c | 2 +-
libedataserver/e-transliterator-private.cpp | 18 ++--
libedataserver/e-transliterator-private.h | 12 +-
libedataserver/e-transliterator.c | 160 +++++++++++++++++++++++++++
libedataserver/e-transliterator.h | 55 +++++++++
libedataserver/libedataserver.h | 1 +
7 files changed, 234 insertions(+), 16 deletions(-)
---
diff --git a/libedataserver/Makefile.am b/libedataserver/Makefile.am
index b5c267a..160102f 100644
--- a/libedataserver/Makefile.am
+++ b/libedataserver/Makefile.am
@@ -100,6 +100,7 @@ libedataserver_1_2_la_SOURCES = \
e-source-webdav.c \
e-debug-log.c \
e-time-utils.c \
+ e-transliterator.c \
e-transliterator-private.h \
e-uid.c \
e-url.c \
@@ -179,6 +180,7 @@ libedataserverinclude_HEADERS = \
e-source-webdav.h \
e-debug-log.h \
e-time-utils.h \
+ e-transliterator.h \
e-uid.h \
e-url.h \
e-data-server-util.h \
diff --git a/libedataserver/e-collator.c b/libedataserver/e-collator.c
index 022efcd..353c6b8 100644
--- a/libedataserver/e-collator.c
+++ b/libedataserver/e-collator.c
@@ -71,7 +71,7 @@ struct _ECollator
gint inflow;
gint overflow;
- ETransliterator *transliterator;
+ ECxxTransliterator *transliterator;
gint ref_count;
};
diff --git a/libedataserver/e-transliterator-private.cpp b/libedataserver/e-transliterator-private.cpp
index 9e6b4a4..959e364 100644
--- a/libedataserver/e-transliterator-private.cpp
+++ b/libedataserver/e-transliterator-private.cpp
@@ -38,43 +38,43 @@
using icu::Transliterator;
-struct _ETransliterator {
+struct _ECxxTransliterator {
Transliterator *priv;
};
/* Create an Transliterator for the source and target
* language stripts
*/
-ETransliterator *
+ECxxTransliterator *
_e_transliterator_cxx_new (const gchar *transliterator_id)
{
UErrorCode status = U_ZERO_ERROR;
- ETransliterator *transliterator;
+ ECxxTransliterator *transliterator;
g_return_val_if_fail (transliterator_id != NULL, NULL);
- transliterator = g_slice_new (ETransliterator);
+ transliterator = g_slice_new (ECxxTransliterator);
transliterator->priv = Transliterator::createInstance (transliterator_id, UTRANS_FORWARD, status);
return transliterator;
}
-/* Frees an ETransliterator and it's associated resources
+/* Frees an ECxxTransliterator and it's associated resources
*/
void
-_e_transliterator_cxx_free (ETransliterator *transliterator)
+_e_transliterator_cxx_free (ECxxTransliterator *transliterator)
{
if (transliterator) {
delete transliterator->priv;
- g_slice_free (ETransliterator, transliterator);
+ g_slice_free (ECxxTransliterator, transliterator);
}
}
/* Transliterates 'str' and returns the new allocated result
*/
gchar *
-_e_transliterator_cxx_transliterate (ETransliterator *transliterator,
- const gchar *str)
+_e_transliterator_cxx_transliterate (ECxxTransliterator *transliterator,
+ const gchar *str)
{
UnicodeString transform;
std::string sourceUTF8;
diff --git a/libedataserver/e-transliterator-private.h b/libedataserver/e-transliterator-private.h
index 539f0c1..5aafc60 100644
--- a/libedataserver/e-transliterator-private.h
+++ b/libedataserver/e-transliterator-private.h
@@ -37,19 +37,19 @@ G_BEGIN_DECLS
#endif
/**
- * ETransliterator:
+ * ECxxTransliterator:
*
* A private opaque type describing an alphabetic index
*
* Since: 3.10
**/
-typedef struct _ETransliterator ETransliterator;
+typedef struct _ECxxTransliterator ECxxTransliterator;
/* defined in e-transliterator-private.cpp, and used by by e-collator.c */
-E_TRANSLITERATOR_LOCAL ETransliterator *_e_transliterator_cxx_new (const gchar
*transliterator_id);
-E_TRANSLITERATOR_LOCAL void _e_transliterator_cxx_free (ETransliterator
*transliterator);
-E_TRANSLITERATOR_LOCAL gchar *_e_transliterator_cxx_transliterate (ETransliterator
*transliterator,
- const gchar *str);
+E_TRANSLITERATOR_LOCAL ECxxTransliterator *_e_transliterator_cxx_new (const gchar
*transliterator_id);
+E_TRANSLITERATOR_LOCAL void _e_transliterator_cxx_free (ECxxTransliterator
*transliterator);
+E_TRANSLITERATOR_LOCAL gchar *_e_transliterator_cxx_transliterate (ECxxTransliterator
*transliterator,
+ const gchar *str);
G_END_DECLS
diff --git a/libedataserver/e-transliterator.c b/libedataserver/e-transliterator.c
new file mode 100644
index 0000000..f648b8d
--- /dev/null
+++ b/libedataserver/e-transliterator.c
@@ -0,0 +1,160 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU Lesser General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * Author: Tristan Van Berkom <tristanvb openismus com>
+ */
+
+/**
+ * SECTION: e-transliterator
+ * @include: libedataserver/libedataserver.h
+ * @short_description: Collation services for locale sensitive sorting
+ *
+ * The #ETransliterator is a wrapper object around ICU collation services and
+ * provides features to sort words in locale specific ways. The transliterator
+ * also provides some API for determining features of the active alphabet
+ * in the user's locale, and which words should be sorted under which
+ * letter in the user's alphabet.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+
+#include "e-transliterator.h"
+#include "e-transliterator-private.h"
+
+G_DEFINE_BOXED_TYPE (ETransliterator,
+ e_transliterator,
+ e_transliterator_ref,
+ e_transliterator_unref)
+
+struct _ETransliterator
+{
+ ECxxTransliterator *transliterator;
+
+ gint ref_count;
+};
+
+/*****************************************************
+ * API *
+ *****************************************************/
+
+/**
+ * e_transliterator_new:
+ * @id: The id of the transliterator to create.
+ *
+ * Creates a new #ETransliterator for the given @id,
+ * IDs are defined by ICU libraries and can be of the
+ * form "Any-Latin", "Han-Latin" etc.
+ *
+ * Transliterator services exist for all script types
+ * to convert into Latin, however the same is not true
+ * for other scripts (i.e. you cannot transliterate
+ * Greek into Chinese or Japanese).
+ *
+ * For more details on ICU transliteration services,
+ * visit this link:
+ * http://userguide.icu-project.org/transforms/general
+ *
+ * Returns: (transfer full): A newly created #ETransliterator.
+ *
+ * Since: 3.10
+ */
+ETransliterator *
+e_transliterator_new (const gchar *id)
+{
+ ETransliterator *transliterator;
+
+ transliterator = g_slice_new0 (ETransliterator);
+ transliterator->transliterator = _e_transliterator_cxx_new (id);
+ transliterator->ref_count = 1;
+
+ return transliterator;
+}
+
+/**
+ * e_transliterator_ref:
+ * @transliterator: An #ETransliterator
+ *
+ * Increases the reference count of @transliterator.
+ *
+ * Returns: (transfer full): @transliterator
+ *
+ * Since: 3.10
+ */
+ETransliterator *
+e_transliterator_ref (ETransliterator *transliterator)
+{
+ g_return_val_if_fail (transliterator != NULL, NULL);
+
+ transliterator->ref_count++;
+
+ return transliterator;
+}
+
+/**
+ * e_transliterator_unref:
+ * @transliterator: An #ETransliterator
+ *
+ * Decreases the reference count of @transliterator.
+ * If the reference count reaches 0 then the transliterator is freed
+ *
+ * Since: 3.10
+ */
+void
+e_transliterator_unref (ETransliterator *transliterator)
+{
+ g_return_if_fail (transliterator != NULL);
+
+ transliterator->ref_count--;
+
+ if (transliterator->ref_count < 0)
+ g_warning ("Unbalanced reference count in ETransliterator");
+
+ if (transliterator->ref_count == 0) {
+
+ if (transliterator->transliterator)
+ _e_transliterator_cxx_free (transliterator->transliterator);
+
+ g_slice_free (ETransliterator, transliterator);
+ }
+}
+
+/**
+ * e_transliterator_transliterate:
+ * @transliterator: An #ETransliterator
+ * @str: The string to transliterate
+ *
+ * Transliterates @str according to the transliteration service
+ * chosen and passed to e_transliterator_new().
+ *
+ * Returns: (transfer full): The newly created transliteration of @str
+ *
+ * Since: 3.10
+ */
+gchar *
+e_transliterator_transliterate (ETransliterator *transliterator,
+ const gchar *str)
+{
+ g_return_val_if_fail (transliterator != NULL, NULL);
+
+ return _e_transliterator_cxx_transliterate (transliterator->transliterator, str);
+}
diff --git a/libedataserver/e-transliterator.h b/libedataserver/e-transliterator.h
new file mode 100644
index 0000000..a983c39
--- /dev/null
+++ b/libedataserver/e-transliterator.h
@@ -0,0 +1,55 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013 Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU Lesser General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * Author: Tristan Van Berkom <tristanvb openismus com>
+ */
+#if !defined (__LIBEDATASERVER_H_INSIDE__) && !defined (LIBEDATASERVER_COMPILATION)
+#error "Only <libedataserver/libedataserver.h> should be included directly."
+#endif
+
+#include <glib.h>
+#include <libedataserver/e-source-enumtypes.h>
+#include <libedataserver/e-data-server-util.h>
+
+#ifndef E_TRANSLITERATOR_H
+#define E_TRANSLITERATOR_H
+
+#define E_TYPE_TRANSLITERATOR (e_transliterator_get_type ())
+
+G_BEGIN_DECLS
+
+/**
+ * ETransliterator:
+ *
+ * An opaque object used for string transliterations.
+ *
+ * Since: 3.10
+ */
+typedef struct _ETransliterator ETransliterator;
+
+GType e_transliterator_get_type (void);
+ETransliterator *e_transliterator_new (const gchar *id);
+ETransliterator *e_transliterator_ref (ETransliterator *transliterator);
+void e_transliterator_unref (ETransliterator *transliterator);
+gchar *e_transliterator_transliterate (ETransliterator *transliterator,
+ const gchar *str);
+
+
+G_END_DECLS
+
+#endif /* E_TRANSLITERATOR_H */
diff --git a/libedataserver/libedataserver.h b/libedataserver/libedataserver.h
index 21f7819..965f37f 100644
--- a/libedataserver/libedataserver.h
+++ b/libedataserver/libedataserver.h
@@ -70,6 +70,7 @@
#include <libedataserver/e-source-webdav.h>
#include <libedataserver/e-source.h>
#include <libedataserver/e-time-utils.h>
+#include <libedataserver/e-transliterator.h>
#include <libedataserver/e-uid.h>
#include <libedataserver/e-url.h>
#include <libedataserver/e-xml-hash-utils.h>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]