summaryrefslogtreecommitdiffstats
path: root/src/ibusattribute.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ibusattribute.c')
-rw-r--r--src/ibusattribute.c433
1 files changed, 433 insertions, 0 deletions
diff --git a/src/ibusattribute.c b/src/ibusattribute.c
new file mode 100644
index 0000000..7b41ab2
--- /dev/null
+++ b/src/ibusattribute.c
@@ -0,0 +1,433 @@
+/* vim:set et sts=4: */
+/* IBus - The Input Bus
+ * Copyright (C) 2008-2009 Huang Peng <shawn.p.huang@gmail.com>
+ *
+ * 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 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#include "ibusattribute.h"
+
+/* functions prototype */
+static void ibus_attribute_class_init (IBusAttributeClass *klass);
+static void ibus_attribute_init (IBusAttribute *attr);
+// static void ibus_attribute_destroy (IBusAttribute *attr);
+static gboolean ibus_attribute_serialize (IBusAttribute *attr,
+ IBusMessageIter *iter);
+static gboolean ibus_attribute_deserialize (IBusAttribute *attr,
+ IBusMessageIter *iter);
+static gboolean ibus_attribute_copy (IBusAttribute *dest,
+ const IBusAttribute *src);
+
+static void ibus_attr_list_class_init (IBusAttrListClass *klass);
+static void ibus_attr_list_init (IBusAttrList *attr_list);
+static void ibus_attr_list_destroy (IBusAttrList *attr_list);
+static gboolean ibus_attr_list_serialize (IBusAttrList *attr_list,
+ IBusMessageIter *iter);
+static gboolean ibus_attr_list_deserialize (IBusAttrList *attr_list,
+ IBusMessageIter *iter);
+static gboolean ibus_attr_list_copy (IBusAttrList *dest,
+ const IBusAttrList *src);
+
+static IBusSerializableClass *parent_class = NULL;
+
+GType
+ibus_attribute_get_type (void)
+{
+ static GType type = 0;
+
+ static const GTypeInfo type_info = {
+ sizeof (IBusAttributeClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) ibus_attribute_class_init,
+ NULL, /* class finialize */
+ NULL, /* class data */
+ sizeof (IBusAttribute),
+ 0,
+ (GInstanceInitFunc) ibus_attribute_init,
+ };
+
+ if (type == 0) {
+ type = g_type_register_static (IBUS_TYPE_SERIALIZABLE,
+ "IBusAttribute",
+ &type_info,
+ 0);
+ }
+
+ return type;
+}
+
+static void
+ibus_attribute_class_init (IBusAttributeClass *klass)
+{
+ IBusSerializableClass *serializable_class = IBUS_SERIALIZABLE_CLASS (klass);
+
+ parent_class = (IBusSerializableClass *) g_type_class_peek_parent (klass);
+
+ // object_class->destroy = (IBusObjectDestroyFunc) ibus_attribute_destroy;
+
+ serializable_class->serialize = (IBusSerializableSerializeFunc) ibus_attribute_serialize;
+ serializable_class->deserialize = (IBusSerializableDeserializeFunc) ibus_attribute_deserialize;
+ serializable_class->copy = (IBusSerializableCopyFunc) ibus_attribute_copy;
+
+ g_string_append (serializable_class->signature, "uuuu");
+}
+
+static void
+ibus_attribute_init (IBusAttribute *attr)
+{
+}
+
+// static void
+// ibus_attribute_destroy (IBusAttribute *attr)
+// {
+// IBUS_OBJECT (parent_class)->destroy ((IBusObject *)attr);
+// }
+
+static gboolean
+ibus_attribute_serialize (IBusAttribute *attr,
+ IBusMessageIter *iter)
+{
+ gboolean retval;
+
+ retval = parent_class->serialize ((IBusSerializable *) attr, iter);
+ g_return_val_if_fail (retval, FALSE);
+
+ g_return_val_if_fail (IBUS_IS_ATTRIBUTE (attr), FALSE);
+
+ retval = ibus_message_iter_append (iter, G_TYPE_UINT, &attr->type);
+ g_return_val_if_fail (retval, FALSE);
+
+ retval = ibus_message_iter_append (iter, G_TYPE_UINT, &attr->value);
+ g_return_val_if_fail (retval, FALSE);
+
+ retval = ibus_message_iter_append (iter, G_TYPE_UINT, &attr->start_index);
+ g_return_val_if_fail (retval, FALSE);
+
+ retval = ibus_message_iter_append (iter, G_TYPE_UINT, &attr->end_index);
+ g_return_val_if_fail (retval, FALSE);
+
+ return TRUE;
+}
+
+static gboolean
+ibus_attribute_deserialize (IBusAttribute *attr,
+ IBusMessageIter *iter)
+{
+ gboolean retval;
+
+ retval = parent_class->deserialize ((IBusSerializable *) attr, iter);
+ g_return_val_if_fail (retval, FALSE);
+
+ g_return_val_if_fail (IBUS_IS_ATTRIBUTE (attr), FALSE);
+
+ retval = ibus_message_iter_get (iter, G_TYPE_UINT, &attr->type);
+ g_return_val_if_fail (retval, FALSE);
+
+ retval = ibus_message_iter_get (iter, G_TYPE_UINT, &attr->value);
+ g_return_val_if_fail (retval, FALSE);
+
+ retval = ibus_message_iter_get (iter, G_TYPE_UINT, &attr->start_index);
+ g_return_val_if_fail (retval, FALSE);
+
+ retval = ibus_message_iter_get (iter, G_TYPE_UINT, &attr->end_index);
+ g_return_val_if_fail (retval, FALSE);
+
+ return TRUE;
+
+}
+
+static gboolean
+ibus_attribute_copy (IBusAttribute *dest,
+ const IBusAttribute *src)
+{
+ gboolean retval;
+
+ retval = parent_class->copy ((IBusSerializable *)dest,
+ (IBusSerializable *)src);
+ g_return_val_if_fail (retval, FALSE);
+
+ g_return_val_if_fail (IBUS_IS_ATTRIBUTE (dest), FALSE);
+ g_return_val_if_fail (IBUS_IS_ATTRIBUTE (src), FALSE);
+
+ dest->type = src->type;
+ dest->value = src->value;
+ dest->start_index = src->start_index;
+ dest->end_index = src->end_index;
+
+ return TRUE;
+}
+
+IBusAttribute *
+ibus_attribute_new (guint type,
+ guint value,
+ guint start_index,
+ guint end_index)
+{
+ g_return_val_if_fail (
+ type == IBUS_ATTR_TYPE_UNDERLINE ||
+ type == IBUS_ATTR_TYPE_FOREGROUND ||
+ type == IBUS_ATTR_TYPE_BACKGROUND, NULL);
+
+ IBusAttribute *attr = IBUS_ATTRIBUTE (g_object_new (IBUS_TYPE_ATTRIBUTE, 0));
+
+ attr->type = type;
+ attr->value = value;
+ attr->start_index = start_index;
+ attr->end_index = end_index;
+
+ return attr;
+}
+
+IBusAttribute *
+ibus_attr_underline_new (guint underline_type,
+ guint start_index,
+ guint end_index)
+{
+ g_return_val_if_fail (
+ underline_type == IBUS_ATTR_UNDERLINE_NONE ||
+ underline_type == IBUS_ATTR_UNDERLINE_SINGLE ||
+ underline_type == IBUS_ATTR_UNDERLINE_DOUBLE ||
+ underline_type == IBUS_ATTR_UNDERLINE_LOW, NULL);
+
+ return ibus_attribute_new (IBUS_ATTR_TYPE_UNDERLINE,
+ underline_type,
+ start_index,
+ end_index);
+}
+
+IBusAttribute *
+ibus_attr_foreground_new (guint color,
+ guint start_index,
+ guint end_index)
+{
+ return ibus_attribute_new (IBUS_ATTR_TYPE_FOREGROUND,
+ color,
+ start_index,
+ end_index);
+}
+
+IBusAttribute *
+ibus_attr_background_new (guint color,
+ guint start_index,
+ guint end_index)
+{
+ return ibus_attribute_new (IBUS_ATTR_TYPE_BACKGROUND,
+ color,
+ start_index,
+ end_index);
+}
+
+GType
+ibus_attr_list_get_type (void)
+{
+ static GType type = 0;
+
+ static const GTypeInfo type_info = {
+ sizeof (IBusAttrListClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) ibus_attr_list_class_init,
+ NULL, /* class finialize */
+ NULL, /* class data */
+ sizeof (IBusAttrList),
+ 0,
+ (GInstanceInitFunc) ibus_attr_list_init,
+ };
+
+ if (type == 0) {
+ type = g_type_register_static (IBUS_TYPE_SERIALIZABLE,
+ "IBusAttrList",
+ &type_info,
+ 0);
+ }
+
+ return type;
+}
+
+static void
+ibus_attr_list_class_init (IBusAttrListClass *klass)
+{
+ IBusObjectClass *object_class = IBUS_OBJECT_CLASS (klass);
+ IBusSerializableClass *serializable_class = IBUS_SERIALIZABLE_CLASS (klass);
+
+ parent_class = (IBusSerializableClass *) g_type_class_peek_parent (klass);
+
+ object_class->destroy = (IBusObjectDestroyFunc) ibus_attr_list_destroy;
+
+ serializable_class->serialize = (IBusSerializableSerializeFunc) ibus_attr_list_serialize;
+ serializable_class->deserialize = (IBusSerializableDeserializeFunc) ibus_attr_list_deserialize;
+ serializable_class->copy = (IBusSerializableCopyFunc) ibus_attr_list_copy;
+
+ g_string_append (serializable_class->signature, "av");
+}
+
+static void
+ibus_attr_list_init (IBusAttrList *attr_list)
+{
+ attr_list->attributes = g_array_new (TRUE, TRUE, sizeof (IBusAttribute *));
+}
+
+static void
+ibus_attr_list_destroy (IBusAttrList *attr_list)
+{
+ g_return_if_fail (IBUS_IS_ATTR_LIST (attr_list));
+
+ gint i;
+ for (i = 0;; i++) {
+ IBusAttribute *attr;
+
+ attr = ibus_attr_list_get (attr_list, i);
+ if (attr == NULL)
+ break;
+
+ g_object_unref (attr);
+ }
+
+ g_array_free (attr_list->attributes, TRUE);
+
+ IBUS_OBJECT_CLASS (parent_class)->destroy ((IBusObject *)attr_list);
+}
+
+static gboolean
+ibus_attr_list_serialize (IBusAttrList *attr_list,
+ IBusMessageIter *iter)
+{
+ IBusMessageIter array_iter;
+ gboolean retval;
+ guint i;
+
+ retval = parent_class->serialize ((IBusSerializable *)attr_list, iter);
+ g_return_val_if_fail (retval, FALSE);
+
+ g_return_val_if_fail (IBUS_IS_ATTR_LIST (attr_list), FALSE);
+
+ retval = ibus_message_iter_open_container (iter,
+ IBUS_TYPE_ARRAY,
+ "v",
+ &array_iter);
+ g_return_val_if_fail (retval, FALSE);
+
+ for (i = 0;; i++) {
+ IBusAttribute *attr;
+
+ attr = ibus_attr_list_get (attr_list, i);
+ if (attr == NULL)
+ break;
+
+ retval = ibus_message_iter_append (&array_iter, IBUS_TYPE_ATTRIBUTE, &attr);
+ g_return_val_if_fail (retval, FALSE);
+ }
+
+ retval = ibus_message_iter_close_container (iter, &array_iter);
+ g_return_val_if_fail (retval, FALSE);
+
+ return TRUE;
+}
+
+static gboolean
+ibus_attr_list_deserialize (IBusAttrList *attr_list,
+ IBusMessageIter *iter)
+{
+ DBusMessageIter array_iter;
+ gboolean retval;
+
+ retval = parent_class->deserialize ((IBusSerializable *)attr_list, iter);
+ g_return_val_if_fail (retval, FALSE);
+
+ retval = ibus_message_iter_recurse (iter, IBUS_TYPE_ARRAY, &array_iter);
+ g_return_val_if_fail (retval, FALSE);
+
+ while (ibus_message_iter_get_arg_type (&array_iter) != G_TYPE_INVALID) {
+ IBusAttribute *attr;
+
+ retval = ibus_message_iter_get (&array_iter, IBUS_TYPE_ATTRIBUTE, &attr);
+
+ g_return_val_if_fail (retval, FALSE);
+
+ ibus_attr_list_append (attr_list, attr);
+ }
+
+ ibus_message_iter_next (iter);
+
+ return TRUE;
+}
+
+
+
+static gboolean
+ibus_attr_list_copy (IBusAttrList *dest,
+ const IBusAttrList *src)
+{
+ gboolean retval;
+
+ retval = parent_class->copy ((IBusSerializable *)dest,
+ (IBusSerializable *)src);
+ g_return_val_if_fail (retval, FALSE);
+
+ g_return_val_if_fail (IBUS_IS_ATTRIBUTE (dest), FALSE);
+ g_return_val_if_fail (IBUS_IS_ATTRIBUTE (src), FALSE);
+
+ gint i;
+ for (i = 0; ; i++) {
+ IBusAttribute *attr = ibus_attr_list_get ((IBusAttrList *)src, i);
+ if (attr == NULL) {
+ break;
+ }
+
+ attr = (IBusAttribute *) ibus_serializable_copy ((IBusSerializable *) attr);
+ if (attr == NULL) {
+ g_warning ("can not copy attribute");
+ continue;
+ }
+
+ ibus_attr_list_append (dest, attr);
+ }
+ return TRUE;
+}
+
+IBusAttrList *
+ibus_attr_list_new ()
+{
+ IBusAttrList *attr_list;
+ attr_list = g_object_new (IBUS_TYPE_ATTR_LIST, 0);
+ return attr_list;
+}
+
+void
+ibus_attr_list_append (IBusAttrList *attr_list,
+ IBusAttribute *attr)
+{
+ g_return_if_fail (IBUS_IS_ATTR_LIST (attr_list));
+ g_return_if_fail (IBUS_IS_ATTRIBUTE (attr));
+
+ g_array_append_val (attr_list->attributes, attr);
+}
+
+IBusAttribute *
+ibus_attr_list_get (IBusAttrList *attr_list,
+ guint index)
+{
+ g_return_val_if_fail (attr_list != NULL, NULL);
+ IBusAttribute *attr = NULL;
+
+ if (index < attr_list->attributes->len) {
+ attr = g_array_index (attr_list->attributes, IBusAttribute *, index);
+ }
+
+ return attr;
+}
+
+