static gboolean ibus_attr_list_deserialize (IBusAttrList *attr_list, IBusMessageIter *iter) { DBusMessageIter array_iter; gboolean retval; retval = IBUS_SERIALIZABLE_CLASS (ibus_attr_list_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_message_iter_next (&array_iter); 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 = IBUS_SERIALIZABLE_CLASS (ibus_attr_list_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; }
void ibus_text_append_attribute (IBusText *text, guint type, guint value, guint start_index, gint end_index) { g_assert (IBUS_IS_TEXT (text)); IBusAttribute *attr; if (end_index < 0) { end_index += g_utf8_strlen(text->text, -1) + 1; } if (end_index <= 0) { return; } if (text->attrs == NULL) { text->attrs = ibus_attr_list_new (); } attr = ibus_attribute_new (type, value, start_index, end_index); ibus_attr_list_append (text->attrs, attr); g_object_unref (attr); }