Blame src/ibusenginedesc.c

Packit 3ff832
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
Packit 3ff832
/* vim:set et sts=4: */
Packit 3ff832
/* bus - The Input Bus
Packit 3ff832
 * Copyright (C) 2008-2015 Peng Huang <shawn.p.huang@gmail.com>
Packit 3ff832
 * Copyright (C) 2008-2015 Red Hat, Inc.
Packit 3ff832
 *
Packit 3ff832
 * This library is free software; you can redistribute it and/or
Packit 3ff832
 * modify it under the terms of the GNU Lesser General Public
Packit 3ff832
 * License as published by the Free Software Foundation; either
Packit 3ff832
 * version 2.1 of the License, or (at your option) any later version.
Packit 3ff832
 *
Packit 3ff832
 * This library is distributed in the hope that it will be useful,
Packit 3ff832
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 3ff832
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 3ff832
 * Lesser General Public License for more details.
Packit 3ff832
 *
Packit 3ff832
 * You should have received a copy of the GNU Lesser General Public
Packit 3ff832
 * License along with this library; if not, write to the Free Software
Packit 3ff832
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
Packit 3ff832
 * USA
Packit 3ff832
 */
Packit 3ff832
#include <stdlib.h>
Packit 3ff832
#include "ibusenginedesc.h"
Packit 3ff832
#include "ibusinternal.h"
Packit 3ff832
#include "ibusxml.h"
Packit 3ff832
Packit 3ff832
enum {
Packit 3ff832
    LAST_SIGNAL,
Packit 3ff832
};
Packit 3ff832
Packit 3ff832
enum {
Packit 3ff832
    PROP_0 = 0,
Packit 3ff832
    PROP_NAME,
Packit 3ff832
    PROP_LONGNAME,
Packit 3ff832
    PROP_DESCRIPTION,
Packit 3ff832
    PROP_LANGUAGE,
Packit 3ff832
    PROP_LICENSE,
Packit 3ff832
    PROP_AUTHOR,
Packit 3ff832
    PROP_ICON,
Packit 3ff832
    PROP_LAYOUT,
Packit 3ff832
    PROP_LAYOUT_VARIANT,
Packit 3ff832
    PROP_LAYOUT_OPTION,
Packit 3ff832
    PROP_RANK,
Packit 3ff832
    PROP_HOTKEYS,
Packit 3ff832
    PROP_SYMBOL,
Packit 3ff832
    PROP_SETUP,
Packit 3ff832
    PROP_VERSION,
Packit 3ff832
    PROP_TEXTDOMAIN,
Packit 3ff832
    PROP_ICON_PROP_KEY
Packit 3ff832
};
Packit 3ff832
Packit 3ff832
Packit 3ff832
/* IBusEngineDescPriv */
Packit 3ff832
struct _IBusEngineDescPrivate {
Packit 3ff832
    gchar      *name;
Packit 3ff832
    gchar      *longname;
Packit 3ff832
    gchar      *description;
Packit 3ff832
    gchar      *language;
Packit 3ff832
    gchar      *license;
Packit 3ff832
    gchar      *author;
Packit 3ff832
    gchar      *icon;
Packit 3ff832
    gchar      *layout;
Packit 3ff832
    gchar      *layout_variant;
Packit 3ff832
    gchar      *layout_option;
Packit 3ff832
    guint       rank;
Packit 3ff832
    gchar      *hotkeys;
Packit 3ff832
    gchar      *symbol;
Packit 3ff832
    gchar      *setup;
Packit 3ff832
    gchar      *version;
Packit 3ff832
    gchar      *textdomain;
Packit 3ff832
    gchar      *icon_prop_key;
Packit 3ff832
};
Packit 3ff832
Packit 3ff832
#define IBUS_ENGINE_DESC_GET_PRIVATE(o)  \
Packit 3ff832
   (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_ENGINE_DESC, IBusEngineDescPrivate))
Packit 3ff832
Packit 3ff832
// static guint            _signals[LAST_SIGNAL] = { 0 };
Packit 3ff832
Packit 3ff832
/* functions prototype */
Packit 3ff832
static void         ibus_engine_desc_set_property   (IBusEngineDesc         *desc,
Packit 3ff832
                                                     guint                   prop_id,
Packit 3ff832
                                                     const GValue           *value,
Packit 3ff832
                                                     GParamSpec             *pspec);
Packit 3ff832
static void         ibus_engine_desc_get_property   (IBusEngineDesc         *desc,
Packit 3ff832
                                                     guint                   prop_id,
Packit 3ff832
                                                     GValue                 *value,
Packit 3ff832
                                                     GParamSpec             *pspec);
Packit 3ff832
static void         ibus_engine_desc_destroy        (IBusEngineDesc         *desc);
Packit 3ff832
static gboolean     ibus_engine_desc_serialize      (IBusEngineDesc         *desc,
Packit 3ff832
                                                     GVariantBuilder        *builder);
Packit 3ff832
static gint         ibus_engine_desc_deserialize    (IBusEngineDesc         *desc,
Packit 3ff832
                                                     GVariant               *variant);
Packit 3ff832
static gboolean     ibus_engine_desc_copy           (IBusEngineDesc         *dest,
Packit 3ff832
                                                     const IBusEngineDesc   *src);
Packit 3ff832
static gboolean     ibus_engine_desc_parse_xml_node (IBusEngineDesc         *desc,
Packit 3ff832
                                                     XMLNode                *node);
Packit 3ff832
Packit 3ff832
G_DEFINE_TYPE (IBusEngineDesc, ibus_engine_desc, IBUS_TYPE_SERIALIZABLE)
Packit 3ff832
Packit 3ff832
Packit 3ff832
static void
Packit 3ff832
ibus_engine_desc_class_init (IBusEngineDescClass *class)
Packit 3ff832
{
Packit 3ff832
    GObjectClass *gobject_class = G_OBJECT_CLASS (class);
Packit 3ff832
    IBusObjectClass *object_class = IBUS_OBJECT_CLASS (class);
Packit 3ff832
    IBusSerializableClass *serializable_class = IBUS_SERIALIZABLE_CLASS (class);
Packit 3ff832
Packit 3ff832
    gobject_class->set_property = (GObjectSetPropertyFunc) ibus_engine_desc_set_property;
Packit 3ff832
    gobject_class->get_property = (GObjectGetPropertyFunc) ibus_engine_desc_get_property;
Packit 3ff832
    object_class->destroy = (IBusObjectDestroyFunc) ibus_engine_desc_destroy;
Packit 3ff832
Packit 3ff832
    serializable_class->serialize   = (IBusSerializableSerializeFunc) ibus_engine_desc_serialize;
Packit 3ff832
    serializable_class->deserialize = (IBusSerializableDeserializeFunc) ibus_engine_desc_deserialize;
Packit 3ff832
    serializable_class->copy        = (IBusSerializableCopyFunc) ibus_engine_desc_copy;
Packit 3ff832
Packit 3ff832
    g_type_class_add_private (class, sizeof (IBusEngineDescPrivate));
Packit 3ff832
Packit 3ff832
    /* install properties */
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:name:
Packit 3ff832
     *
Packit 3ff832
     * The name of engine description
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_NAME,
Packit 3ff832
                    g_param_spec_string ("name",
Packit 3ff832
                        "description name",
Packit 3ff832
                        "The name of engine description",
Packit 3ff832
                        NULL,
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:longname:
Packit 3ff832
     *
Packit 3ff832
     * The longname of engine description
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_LONGNAME,
Packit 3ff832
                    g_param_spec_string ("longname",
Packit 3ff832
                        "description longname",
Packit 3ff832
                        "The longname of engine description",
Packit 3ff832
                        "",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:description:
Packit 3ff832
     *
Packit 3ff832
     * The description of engine description
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_DESCRIPTION,
Packit 3ff832
                    g_param_spec_string ("description",
Packit 3ff832
                        "description description",
Packit 3ff832
                        "The description of engine description",
Packit 3ff832
                        "",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:language:
Packit 3ff832
     *
Packit 3ff832
     * The language of engine description
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_LANGUAGE,
Packit 3ff832
                    g_param_spec_string ("language",
Packit 3ff832
                        "description language",
Packit 3ff832
                        "The language of engine description",
Packit 3ff832
                        "",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:license:
Packit 3ff832
     *
Packit 3ff832
     * The license of engine description
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_LICENSE,
Packit 3ff832
                    g_param_spec_string ("license",
Packit 3ff832
                        "description license",
Packit 3ff832
                        "The license of engine description",
Packit 3ff832
                        "",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:author:
Packit 3ff832
     *
Packit 3ff832
     * The author of engine description
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_AUTHOR,
Packit 3ff832
                    g_param_spec_string ("author",
Packit 3ff832
                        "description author",
Packit 3ff832
                        "The author of engine description",
Packit 3ff832
                        "",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:icon:
Packit 3ff832
     *
Packit 3ff832
     * The icon of engine description
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_ICON,
Packit 3ff832
                    g_param_spec_string ("icon",
Packit 3ff832
                        "description icon",
Packit 3ff832
                        "The icon of engine description",
Packit 3ff832
                        "ibus-engine",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:layout:
Packit 3ff832
     *
Packit 3ff832
     * The layout of engine description
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_LAYOUT,
Packit 3ff832
                    g_param_spec_string ("layout",
Packit 3ff832
                        "description layout",
Packit 3ff832
                        "The layout of engine description",
Packit 3ff832
                        "us",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:layout-variant:
Packit 3ff832
     *
Packit 3ff832
     * The keyboard variant of engine description
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_LAYOUT_VARIANT,
Packit 3ff832
                    g_param_spec_string ("layout-variant",
Packit 3ff832
                        "description keyboard variant",
Packit 3ff832
                        "The keyboard variant of engine description",
Packit 3ff832
                        "",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:layout-option:
Packit 3ff832
     *
Packit 3ff832
     * The keyboard option of engine description
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_LAYOUT_OPTION,
Packit 3ff832
                    g_param_spec_string ("layout-option",
Packit 3ff832
                        "description keyboard option",
Packit 3ff832
                        "The keyboard option of engine description",
Packit 3ff832
                        "",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:rank:
Packit 3ff832
     *
Packit 3ff832
     * The rank of engine description
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_RANK,
Packit 3ff832
                    g_param_spec_uint ("rank",
Packit 3ff832
                        "description rank",
Packit 3ff832
                        "The rank of engine description",
Packit 3ff832
                        0,
Packit 3ff832
                        G_MAXUINT,
Packit 3ff832
                        0,
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:hotkeys:
Packit 3ff832
     *
Packit 3ff832
     * The hotkeys of engine description
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_HOTKEYS,
Packit 3ff832
                    g_param_spec_string ("hotkeys",
Packit 3ff832
                        "description hotkeys",
Packit 3ff832
                        "The hotkeys of engine description",
Packit 3ff832
                        "",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:symbol:
Packit 3ff832
     *
Packit 3ff832
     * The symbol chars of engine description instead of icon image
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_SYMBOL,
Packit 3ff832
                    g_param_spec_string ("symbol",
Packit 3ff832
                        "description symbol",
Packit 3ff832
                        "The icon symbol chars of engine description",
Packit 3ff832
                        "",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:setup:
Packit 3ff832
     *
Packit 3ff832
     * The exec lists of the engine setup command
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_SETUP,
Packit 3ff832
                    g_param_spec_string ("setup",
Packit 3ff832
                        "setup args",
Packit 3ff832
                        "The exec lists of the engine setup command",
Packit 3ff832
                        "",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:version:
Packit 3ff832
     *
Packit 3ff832
     * The version number of engine description
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_VERSION,
Packit 3ff832
                    g_param_spec_string ("version",
Packit 3ff832
                        "version number",
Packit 3ff832
                        "The version number of engine description",
Packit 3ff832
                        "",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:textdomain:
Packit 3ff832
     *
Packit 3ff832
     * The textdomain of engine description
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_TEXTDOMAIN,
Packit 3ff832
                    g_param_spec_string ("textdomain",
Packit 3ff832
                        "textdomain",
Packit 3ff832
                        "The textdomain of engine description",
Packit 3ff832
                        "",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
Packit 3ff832
    /**
Packit 3ff832
     * IBusEngineDesc:icon-prop-key:
Packit 3ff832
     *
Packit 3ff832
     * The key of IBusProperty to change panel icon dynamically.
Packit 3ff832
     */
Packit 3ff832
    g_object_class_install_property (gobject_class,
Packit 3ff832
                    PROP_ICON_PROP_KEY,
Packit 3ff832
                    g_param_spec_string ("icon-prop-key",
Packit 3ff832
                        "icon property key",
Packit 3ff832
                        "The key of IBusProperty for the dynamic panel icon",
Packit 3ff832
                        "",
Packit 3ff832
                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static void
Packit 3ff832
ibus_engine_desc_init (IBusEngineDesc *desc)
Packit 3ff832
{
Packit 3ff832
    desc->priv = IBUS_ENGINE_DESC_GET_PRIVATE (desc);
Packit 3ff832
Packit 3ff832
    desc->priv->name = NULL;
Packit 3ff832
    desc->priv->longname = NULL;
Packit 3ff832
    desc->priv->description = NULL;
Packit 3ff832
    desc->priv->language = NULL;
Packit 3ff832
    desc->priv->license = NULL;
Packit 3ff832
    desc->priv->author = NULL;
Packit 3ff832
    desc->priv->icon = NULL;
Packit 3ff832
    desc->priv->layout = NULL;
Packit 3ff832
    desc->priv->layout_variant = NULL;
Packit 3ff832
    desc->priv->layout_option = NULL;
Packit 3ff832
    desc->priv->rank = 0;
Packit 3ff832
    desc->priv->hotkeys = NULL;
Packit 3ff832
    desc->priv->symbol = NULL;
Packit 3ff832
    desc->priv->setup = NULL;
Packit 3ff832
    desc->priv->version = NULL;
Packit 3ff832
    desc->priv->textdomain = NULL;
Packit 3ff832
    desc->priv->icon_prop_key = NULL;
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static void
Packit 3ff832
ibus_engine_desc_destroy (IBusEngineDesc *desc)
Packit 3ff832
{
Packit 3ff832
    g_free (desc->priv->name);
Packit 3ff832
    g_free (desc->priv->longname);
Packit 3ff832
    g_free (desc->priv->description);
Packit 3ff832
    g_free (desc->priv->language);
Packit 3ff832
    g_free (desc->priv->license);
Packit 3ff832
    g_free (desc->priv->author);
Packit 3ff832
    g_free (desc->priv->icon);
Packit 3ff832
    g_free (desc->priv->layout);
Packit 3ff832
    g_free (desc->priv->layout_variant);
Packit 3ff832
    g_free (desc->priv->layout_option);
Packit 3ff832
    g_free (desc->priv->hotkeys);
Packit 3ff832
    g_free (desc->priv->symbol);
Packit 3ff832
    g_free (desc->priv->setup);
Packit 3ff832
    g_free (desc->priv->version);
Packit 3ff832
    g_free (desc->priv->textdomain);
Packit 3ff832
    g_free (desc->priv->icon_prop_key);
Packit 3ff832
Packit 3ff832
    IBUS_OBJECT_CLASS (ibus_engine_desc_parent_class)->destroy (IBUS_OBJECT (desc));
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static void
Packit 3ff832
ibus_engine_desc_set_property (IBusEngineDesc *desc,
Packit 3ff832
                               guint           prop_id,
Packit 3ff832
                               const GValue   *value,
Packit 3ff832
                               GParamSpec     *pspec)
Packit 3ff832
{
Packit 3ff832
    switch (prop_id) {
Packit 3ff832
    case PROP_NAME:
Packit 3ff832
        g_assert (desc->priv->name == NULL);
Packit 3ff832
        desc->priv->name = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_LONGNAME:
Packit 3ff832
        g_assert (desc->priv->longname == NULL);
Packit 3ff832
        desc->priv->longname = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_DESCRIPTION:
Packit 3ff832
        g_assert (desc->priv->description == NULL);
Packit 3ff832
        desc->priv->description  = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_LANGUAGE:
Packit 3ff832
        g_assert (desc->priv->language == NULL);
Packit 3ff832
        desc->priv->language = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_LICENSE:
Packit 3ff832
        g_assert (desc->priv->license == NULL);
Packit 3ff832
        desc->priv->license = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_AUTHOR:
Packit 3ff832
        g_assert (desc->priv->author == NULL);
Packit 3ff832
        desc->priv->author = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_ICON:
Packit 3ff832
        g_assert (desc->priv->icon == NULL);
Packit 3ff832
        desc->priv->icon = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_LAYOUT:
Packit 3ff832
        g_assert (desc->priv->layout == NULL);
Packit 3ff832
        desc->priv->layout = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_LAYOUT_VARIANT:
Packit 3ff832
        g_assert (desc->priv->layout_variant == NULL);
Packit 3ff832
        desc->priv->layout_variant = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_LAYOUT_OPTION:
Packit 3ff832
        g_assert (desc->priv->layout_option == NULL);
Packit 3ff832
        desc->priv->layout_option = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_RANK:
Packit 3ff832
        desc->priv->rank = g_value_get_uint (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_HOTKEYS:
Packit 3ff832
        g_assert (desc->priv->hotkeys == NULL);
Packit 3ff832
        desc->priv->hotkeys = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_SYMBOL:
Packit 3ff832
        g_assert (desc->priv->symbol == NULL);
Packit 3ff832
        desc->priv->symbol = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_SETUP:
Packit 3ff832
        g_assert (desc->priv->setup == NULL);
Packit 3ff832
        desc->priv->setup = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_VERSION:
Packit 3ff832
        g_assert (desc->priv->version == NULL);
Packit 3ff832
        desc->priv->version = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_TEXTDOMAIN:
Packit 3ff832
        g_assert (desc->priv->textdomain == NULL);
Packit 3ff832
        desc->priv->textdomain = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    case PROP_ICON_PROP_KEY:
Packit 3ff832
        g_assert (desc->priv->icon_prop_key == NULL);
Packit 3ff832
        desc->priv->icon_prop_key = g_value_dup_string (value);
Packit 3ff832
        break;
Packit 3ff832
    default:
Packit 3ff832
        G_OBJECT_WARN_INVALID_PROPERTY_ID (desc, prop_id, pspec);
Packit 3ff832
    }
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static void
Packit 3ff832
ibus_engine_desc_get_property (IBusEngineDesc *desc,
Packit 3ff832
                               guint           prop_id,
Packit 3ff832
                               GValue         *value,
Packit 3ff832
                               GParamSpec     *pspec)
Packit 3ff832
{
Packit 3ff832
    switch (prop_id) {
Packit 3ff832
    case PROP_NAME:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_name (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_LONGNAME:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_longname (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_DESCRIPTION:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_description (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_LANGUAGE:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_language (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_LICENSE:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_license (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_AUTHOR:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_author (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_ICON:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_icon (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_LAYOUT:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_layout (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_LAYOUT_VARIANT:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_layout_variant (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_LAYOUT_OPTION:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_layout_option (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_RANK:
Packit 3ff832
        g_value_set_uint (value, ibus_engine_desc_get_rank (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_HOTKEYS:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_hotkeys (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_SYMBOL:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_symbol (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_SETUP:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_setup (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_VERSION:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_version (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_TEXTDOMAIN:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_textdomain (desc));
Packit 3ff832
        break;
Packit 3ff832
    case PROP_ICON_PROP_KEY:
Packit 3ff832
        g_value_set_string (value, ibus_engine_desc_get_icon_prop_key (desc));
Packit 3ff832
        break;
Packit 3ff832
    default:
Packit 3ff832
        G_OBJECT_WARN_INVALID_PROPERTY_ID (desc, prop_id, pspec);
Packit 3ff832
    }
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static gboolean
Packit 3ff832
ibus_engine_desc_serialize (IBusEngineDesc  *desc,
Packit 3ff832
                            GVariantBuilder *builder)
Packit 3ff832
{
Packit 3ff832
    gboolean retval;
Packit 3ff832
Packit 3ff832
    retval = IBUS_SERIALIZABLE_CLASS (ibus_engine_desc_parent_class)->serialize ((IBusSerializable *)desc, builder);
Packit 3ff832
    g_return_val_if_fail (retval, FALSE);
Packit 3ff832
    /* End dict iter */
Packit 3ff832
Packit 3ff832
#define NOTNULL(s) ((s) != NULL ? (s) : "")
Packit 3ff832
    /* If you will add a new property, you can append it at the end and
Packit 3ff832
     * you should not change the serialized order of name, longname,
Packit 3ff832
     * description, ... because the order is also used in other applications
Packit 3ff832
     * likes ibus-qt. */
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->name));
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->longname));
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->description));
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->language));
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->license));
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->author));
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->icon));
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->layout));
Packit 3ff832
    g_variant_builder_add (builder, "u", desc->priv->rank);
Packit 3ff832
    /* The serialized order should be kept. */
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->hotkeys));
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->symbol));
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->setup));
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->layout_variant));
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->layout_option));
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->version));
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->textdomain));
Packit 3ff832
    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->icon_prop_key));
Packit 3ff832
#undef NOTNULL
Packit 3ff832
Packit 3ff832
    return TRUE;
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static gint
Packit 3ff832
ibus_engine_desc_deserialize (IBusEngineDesc *desc,
Packit 3ff832
                              GVariant       *variant)
Packit 3ff832
{
Packit 3ff832
    gint retval;
Packit 3ff832
Packit 3ff832
    retval = IBUS_SERIALIZABLE_CLASS (ibus_engine_desc_parent_class)->deserialize ((IBusSerializable *)desc, variant);
Packit 3ff832
    g_return_val_if_fail (retval, 0);
Packit 3ff832
Packit 3ff832
    /* If you will add a new property, you can append it at the end and
Packit 3ff832
     * you should not change the serialized order of name, longname,
Packit 3ff832
     * description, ... because the order is also used in other applications
Packit 3ff832
     * likes ibus-qt. */
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->name);
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->longname);
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->description);
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->language);
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->license);
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->author);
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->icon);
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->layout);
Packit 3ff832
    g_variant_get_child (variant, retval++, "u", &desc->priv->rank);
Packit 3ff832
    /* The serialized order should be kept. */
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->hotkeys);
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->symbol);
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->setup);
Packit 3ff832
    if (g_variant_n_children (variant) < retval + 2)
Packit 3ff832
        return retval;
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->layout_variant);
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->layout_option);
Packit 3ff832
    if (g_variant_n_children (variant) < retval + 1)
Packit 3ff832
        return retval;
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->version);
Packit 3ff832
    if (g_variant_n_children (variant) < retval + 1)
Packit 3ff832
        return retval;
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->textdomain);
Packit 3ff832
    if (g_variant_n_children (variant) < retval + 1)
Packit 3ff832
        return retval;
Packit 3ff832
    ibus_g_variant_get_child_string (variant, retval++,
Packit 3ff832
                                     &desc->priv->icon_prop_key);
Packit 3ff832
Packit 3ff832
    return retval;
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static gboolean
Packit 3ff832
ibus_engine_desc_copy (IBusEngineDesc       *dest,
Packit 3ff832
                       const IBusEngineDesc *src)
Packit 3ff832
{
Packit 3ff832
    gboolean retval;
Packit 3ff832
Packit 3ff832
    retval = IBUS_SERIALIZABLE_CLASS (ibus_engine_desc_parent_class)->copy ((IBusSerializable *)dest,
Packit 3ff832
                                 (IBusSerializable *)src);
Packit 3ff832
    g_return_val_if_fail (retval, FALSE);
Packit 3ff832
Packit 3ff832
    dest->priv->name             = g_strdup (src->priv->name);
Packit 3ff832
    dest->priv->longname         = g_strdup (src->priv->longname);
Packit 3ff832
    dest->priv->description      = g_strdup (src->priv->description);
Packit 3ff832
    dest->priv->language         = g_strdup (src->priv->language);
Packit 3ff832
    dest->priv->license          = g_strdup (src->priv->license);
Packit 3ff832
    dest->priv->author           = g_strdup (src->priv->author);
Packit 3ff832
    dest->priv->icon             = g_strdup (src->priv->icon);
Packit 3ff832
    dest->priv->layout           = g_strdup (src->priv->layout);
Packit 3ff832
    dest->priv->layout_variant   = g_strdup (src->priv->layout_variant);
Packit 3ff832
    dest->priv->layout_option    = g_strdup (src->priv->layout_option);
Packit 3ff832
    dest->priv->rank             = src->priv->rank;
Packit 3ff832
    dest->priv->hotkeys          = g_strdup (src->priv->hotkeys);
Packit 3ff832
    dest->priv->symbol           = g_strdup (src->priv->symbol);
Packit 3ff832
    dest->priv->setup            = g_strdup (src->priv->setup);
Packit 3ff832
    dest->priv->version          = g_strdup (src->priv->version);
Packit 3ff832
    dest->priv->textdomain       = g_strdup (src->priv->textdomain);
Packit 3ff832
    dest->priv->icon_prop_key    = g_strdup (src->priv->icon_prop_key);
Packit 3ff832
    return TRUE;
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
#define g_string_append_indent(string, indent)  \
Packit 3ff832
    {                                           \
Packit 3ff832
        gint i;                                 \
Packit 3ff832
        for (i = 0; i < (indent); i++) {        \
Packit 3ff832
            g_string_append (string, "    ");   \
Packit 3ff832
        }                                       \
Packit 3ff832
    }
Packit 3ff832
Packit 3ff832
void
Packit 3ff832
ibus_engine_desc_output (IBusEngineDesc *desc,
Packit 3ff832
                         GString        *output,
Packit 3ff832
                         gint            indent)
Packit 3ff832
{
Packit 3ff832
    g_string_append_indent (output, indent);
Packit 3ff832
    g_string_append (output, "<engine>\n");
Packit 3ff832
#define OUTPUT_ENTRY(field, element)                                        \
Packit 3ff832
    {                                                                       \
Packit 3ff832
        gchar *escape_text = g_markup_escape_text (                         \
Packit 3ff832
                        desc->priv->field ? desc->priv->field : "", -1);    \
Packit 3ff832
        g_string_append_indent (output, indent + 1);                        \
Packit 3ff832
        g_string_append_printf (output, "<"element">%s</"element">\n",      \
Packit 3ff832
                                escape_text);                               \
Packit 3ff832
        g_free (escape_text);                                               \
Packit 3ff832
    }
Packit 3ff832
#define OUTPUT_ENTRY_1(name) OUTPUT_ENTRY(name, #name)
Packit 3ff832
    OUTPUT_ENTRY_1(name);
Packit 3ff832
    OUTPUT_ENTRY_1(longname);
Packit 3ff832
    OUTPUT_ENTRY_1(description);
Packit 3ff832
    OUTPUT_ENTRY_1(language);
Packit 3ff832
    OUTPUT_ENTRY_1(license);
Packit 3ff832
    OUTPUT_ENTRY_1(author);
Packit 3ff832
    OUTPUT_ENTRY_1(icon);
Packit 3ff832
    OUTPUT_ENTRY_1(layout);
Packit 3ff832
    OUTPUT_ENTRY_1(layout_variant);
Packit 3ff832
    OUTPUT_ENTRY_1(layout_option);
Packit 3ff832
    OUTPUT_ENTRY_1(hotkeys);
Packit 3ff832
    OUTPUT_ENTRY_1(symbol);
Packit 3ff832
    OUTPUT_ENTRY_1(setup);
Packit 3ff832
    OUTPUT_ENTRY_1(version);
Packit 3ff832
    OUTPUT_ENTRY_1(textdomain);
Packit 3ff832
    OUTPUT_ENTRY_1(icon_prop_key);
Packit 3ff832
    g_string_append_indent (output, indent + 1);
Packit 3ff832
    g_string_append_printf (output, "<rank>%u</rank>\n", desc->priv->rank);
Packit 3ff832
#undef OUTPUT_ENTRY
Packit 3ff832
#undef OUTPUT_ENTRY_1
Packit 3ff832
    g_string_append_indent (output, indent);
Packit 3ff832
    g_string_append (output, "</engine>\n");
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static gboolean
Packit 3ff832
ibus_engine_desc_parse_xml_node (IBusEngineDesc *desc,
Packit 3ff832
                                XMLNode       *node)
Packit 3ff832
{
Packit 3ff832
    GList *p;
Packit 3ff832
Packit 3ff832
    for (p = node->sub_nodes; p != NULL; p = p->next) {
Packit 3ff832
        XMLNode *sub_node = (XMLNode *) p->data;
Packit 3ff832
Packit 3ff832
#define PARSE_ENTRY(field_name, element_name)                   \
Packit 3ff832
        if (g_strcmp0 (sub_node->name, element_name) == 0) {    \
Packit 3ff832
            g_free (desc->priv->field_name);                    \
Packit 3ff832
            desc->priv->field_name = g_strdup (sub_node->text); \
Packit 3ff832
            continue;                                           \
Packit 3ff832
        }
Packit 3ff832
#define PARSE_ENTRY_1(name) PARSE_ENTRY(name, #name)
Packit 3ff832
        PARSE_ENTRY_1(name);
Packit 3ff832
        PARSE_ENTRY_1(longname);
Packit 3ff832
        PARSE_ENTRY_1(description);
Packit 3ff832
        PARSE_ENTRY_1(language);
Packit 3ff832
        PARSE_ENTRY_1(license);
Packit 3ff832
        PARSE_ENTRY_1(author);
Packit 3ff832
        PARSE_ENTRY_1(icon);
Packit 3ff832
        PARSE_ENTRY_1(layout);
Packit 3ff832
        PARSE_ENTRY_1(layout_variant);
Packit 3ff832
        PARSE_ENTRY_1(layout_option);
Packit 3ff832
        PARSE_ENTRY_1(hotkeys);
Packit 3ff832
        PARSE_ENTRY_1(symbol);
Packit 3ff832
        PARSE_ENTRY_1(setup);
Packit 3ff832
        PARSE_ENTRY_1(version);
Packit 3ff832
        PARSE_ENTRY_1(textdomain);
Packit 3ff832
        PARSE_ENTRY_1(icon_prop_key);
Packit 3ff832
#undef PARSE_ENTRY
Packit 3ff832
#undef PARSE_ENTRY_1
Packit 3ff832
        if (g_strcmp0 (sub_node->name , "rank") == 0) {
Packit 3ff832
            desc->priv->rank = atoi (sub_node->text);
Packit 3ff832
            continue;
Packit 3ff832
        }
Packit 3ff832
        g_warning ("<engines> element contains invalidate element <%s>", sub_node->name);
Packit 3ff832
    }
Packit 3ff832
    return TRUE;
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
#define IBUS_ENGINE_DESC_GET_PROPERTY(property, return_type)    \
Packit 3ff832
return_type                                                     \
Packit 3ff832
ibus_engine_desc_get_ ## property (IBusEngineDesc *desc)        \
Packit 3ff832
{                                                               \
Packit 3ff832
    return desc->priv->property;                                \
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (name, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (longname, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (description, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (language, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (license, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (author, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (icon, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (layout, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (layout_variant, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (layout_option, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (rank, guint)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (hotkeys, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (symbol, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (setup, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (version, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (textdomain, const gchar *)
Packit 3ff832
IBUS_ENGINE_DESC_GET_PROPERTY (icon_prop_key, const gchar *)
Packit 3ff832
#undef IBUS_ENGINE_DESC_GET_PROPERTY
Packit 3ff832
Packit 3ff832
IBusEngineDesc *
Packit 3ff832
ibus_engine_desc_new (const gchar *name,
Packit 3ff832
                      const gchar *longname,
Packit 3ff832
                      const gchar *description,
Packit 3ff832
                      const gchar *language,
Packit 3ff832
                      const gchar *license,
Packit 3ff832
                      const gchar *author,
Packit 3ff832
                      const gchar *icon,
Packit 3ff832
                      const gchar *layout)
Packit 3ff832
{
Packit 3ff832
    return ibus_engine_desc_new_varargs ("name", name,
Packit 3ff832
                                         "longname", longname,
Packit 3ff832
                                         "description", description,
Packit 3ff832
                                         "language", language,
Packit 3ff832
                                         "license", license,
Packit 3ff832
                                         "author", author,
Packit 3ff832
                                         "icon", icon,
Packit 3ff832
                                         "layout", layout,
Packit 3ff832
                                         NULL);
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
IBusEngineDesc *
Packit 3ff832
ibus_engine_desc_new_varargs (const gchar *first_property_name, ...)
Packit 3ff832
{
Packit 3ff832
    va_list var_args;
Packit 3ff832
    IBusEngineDesc *desc;
Packit 3ff832
Packit 3ff832
    g_assert (first_property_name);
Packit 3ff832
Packit 3ff832
    va_start (var_args, first_property_name);
Packit 3ff832
    desc = (IBusEngineDesc *) g_object_new_valist (IBUS_TYPE_ENGINE_DESC,
Packit 3ff832
                                                   first_property_name,
Packit 3ff832
                                                   var_args);
Packit 3ff832
    va_end (var_args);
Packit 3ff832
Packit 3ff832
    /* name is required. Other properties are set in class_init by default. */
Packit 3ff832
    g_assert (desc->priv->name);
Packit 3ff832
    g_assert (desc->priv->longname);
Packit 3ff832
    g_assert (desc->priv->description);
Packit 3ff832
    g_assert (desc->priv->language);
Packit 3ff832
    g_assert (desc->priv->license);
Packit 3ff832
    g_assert (desc->priv->author);
Packit 3ff832
    g_assert (desc->priv->icon);
Packit 3ff832
    g_assert (desc->priv->layout);
Packit 3ff832
    g_assert (desc->priv->layout_variant);
Packit 3ff832
    g_assert (desc->priv->layout_option);
Packit 3ff832
    g_assert (desc->priv->hotkeys);
Packit 3ff832
    g_assert (desc->priv->symbol);
Packit 3ff832
    g_assert (desc->priv->setup);
Packit 3ff832
    g_assert (desc->priv->version);
Packit 3ff832
    g_assert (desc->priv->textdomain);
Packit 3ff832
    g_assert (desc->priv->icon_prop_key);
Packit 3ff832
Packit 3ff832
    return desc;
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
IBusEngineDesc *
Packit 3ff832
ibus_engine_desc_new_from_xml_node (XMLNode      *node)
Packit 3ff832
{
Packit 3ff832
    g_assert (node);
Packit 3ff832
Packit 3ff832
    IBusEngineDesc *desc;
Packit 3ff832
Packit 3ff832
    if (G_UNLIKELY (g_strcmp0 (node->name, "engine") != 0)) {
Packit 3ff832
        return NULL;
Packit 3ff832
    }
Packit 3ff832
Packit 3ff832
    desc = (IBusEngineDesc *)g_object_new (IBUS_TYPE_ENGINE_DESC, NULL);
Packit 3ff832
Packit 3ff832
    if (!ibus_engine_desc_parse_xml_node (desc, node)) {
Packit 3ff832
        g_object_unref (desc);
Packit 3ff832
        desc = NULL;
Packit 3ff832
    }
Packit 3ff832
Packit 3ff832
    return desc;
Packit 3ff832
}