Beispiel #1
0
static IBusMessage *
_dbus_list_names (BusDBusImpl       *dbus,
                  IBusMessage       *message,
                  BusConnection     *connection)
{
    IBusMessage *reply_message;
    IBusMessageIter iter, sub_iter;
    GList *name, *names;

    reply_message = ibus_message_new_method_return (message);

    ibus_message_iter_init_append (message, &iter);
    ibus_message_iter_open_container (&iter, IBUS_TYPE_ARRAY, "s", &sub_iter);

    // append unique names
    names = g_hash_table_get_keys (dbus->unique_names);

    names = g_list_sort (names, (GCompareFunc) g_strcmp0);
    for (name = names; name != NULL; name = name->next) {
        ibus_message_iter_append (&sub_iter, G_TYPE_STRING, &(name->data));
    }
    g_list_free (names);

    // append well-known names
    names = g_hash_table_get_keys (dbus->names);
    names = g_list_sort (names, (GCompareFunc) g_strcmp0);
    for (name = names; name != NULL; name = name->next) {
        ibus_message_iter_append (&sub_iter, G_TYPE_STRING, &(name->data));
    }
    g_list_free (names);

    ibus_message_iter_close_container (&iter, &sub_iter);

    return reply_message;
}
Beispiel #2
0
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;
}
Beispiel #3
0
static gboolean
ibus_engine_desc_serialize (IBusEngineDesc  *desc,
                            IBusMessageIter *iter)
{
    gboolean retval;

    retval = parent_class->serialize ((IBusSerializable *)desc, iter);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &desc->name);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &desc->longname);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &desc->description);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &desc->language);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &desc->license);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &desc->author);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &desc->icon);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &desc->layout);
    g_return_val_if_fail (retval, FALSE);

    return TRUE;
}
Beispiel #4
0
static gboolean
ibus_attr_list_serialize (IBusAttrList    *attr_list,
                          IBusMessageIter *iter)
{
    IBusMessageIter array_iter;
    gboolean retval;
    guint i;

    retval = IBUS_SERIALIZABLE_CLASS (ibus_attr_list_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;
}
Beispiel #5
0
static void
_serialize_cb (GQuark           key,
               GValue          *value,
               IBusMessageIter *iter)
{
    IBusMessageIter dict_entry;
    gboolean retval;
    const gchar *name;

    retval = ibus_message_iter_open_container (iter,
                                               IBUS_TYPE_DICT_ENTRY,
                                               NULL,
                                               &dict_entry);
    g_return_if_fail (retval);
    name = g_quark_to_string (key);
    retval = ibus_message_iter_append (&dict_entry,
                                       G_TYPE_STRING,
                                       &name);
    g_return_if_fail (retval);

    retval = _g_value_serialize (value, &dict_entry);
    g_return_if_fail (retval);

    retval = ibus_message_iter_close_container (iter, &dict_entry);
    g_return_if_fail (retval);
}
Beispiel #6
0
static gboolean
_g_value_serialize (GValue          *value,
                    IBusMessageIter *iter)
{
    gboolean retval;
    GType type;

    type = G_VALUE_TYPE (value);
    g_return_val_if_fail (type != G_TYPE_INVALID, FALSE);


    if (g_type_is_a (type, IBUS_TYPE_SERIALIZABLE)) {
        IBusSerializable *object;
        object = IBUS_SERIALIZABLE (g_value_get_object (value));
        retval = ibus_message_iter_append (iter,
                                           type,
                                           &object);
        g_return_val_if_fail (retval, FALSE);
        return TRUE;
    }

    typedef const gchar *gstring;
    switch (type) {
#define CASE_ENTRY(TYPE, _type, signature)                                          \
    case G_TYPE_##TYPE:                                                             \
        {                                                                           \
            g##_type v;                                                             \
            IBusMessageIter variant_iter;                                           \
                                                                                    \
            retval = ibus_message_iter_open_container (iter,                        \
                                                       IBUS_TYPE_VARIANT,           \
                                                       signature,                   \
                                                       &variant_iter);              \
            g_return_val_if_fail (retval, FALSE);                                   \
                                                                                    \
            v = g_value_get_##_type (value);                                        \
            retval = ibus_message_iter_append (&variant_iter,                       \
                                                G_TYPE_##TYPE,                      \
                                                &v);                                \
            g_return_val_if_fail (retval, FALSE);                                   \
                                                                                    \
            retval = ibus_message_iter_close_container (iter, &variant_iter);       \
            g_return_val_if_fail (retval, FALSE);                                   \
                                                                                    \
            return TRUE;                                                            \
        }
    CASE_ENTRY(CHAR, char, "y");
    CASE_ENTRY(BOOLEAN, boolean, "b");
    CASE_ENTRY(INT, int, "i");
    CASE_ENTRY(UINT, uint, "u");
    CASE_ENTRY(INT64, int64,  "x");
    CASE_ENTRY(UINT64, uint64, "t");
    CASE_ENTRY(FLOAT, float,  "d");
    CASE_ENTRY(DOUBLE, double, "d");
    CASE_ENTRY(STRING, string, "s");
#undef CASE_ENTRY
    }

    g_return_val_if_reached (FALSE);
}
Beispiel #7
0
static gboolean
ibus_observed_path_serialize (IBusObservedPath *path,
                              IBusMessageIter  *iter)
{
    gboolean retval;

    retval = parent_class->serialize ((IBusSerializable *)path, iter);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &(path->path));
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_LONG, &(path->mtime));
    g_return_val_if_fail (retval, FALSE);

    return TRUE;
}
Beispiel #8
0
static gboolean
ibus_text_serialize (IBusText        *text,
                     IBusMessageIter *iter)
{
    gboolean retval;

    retval = parent_class->serialize ((IBusSerializable *)text, iter);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &text->text);
    g_return_val_if_fail (retval, FALSE);

    if (text->attrs == NULL)
        text->attrs = ibus_attr_list_new ();

    retval = ibus_message_iter_append (iter, IBUS_TYPE_ATTR_LIST, &text->attrs);
    g_return_val_if_fail (retval, FALSE);

    return TRUE;
}
Beispiel #9
0
static gboolean
ibus_factory_info_serialize (IBusFactoryInfo *info,
                             IBusMessageIter *iter)
{
    gboolean retval;

    retval = factory_info_parent_class->serialize ((IBusSerializable *)info, iter);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, IBUS_TYPE_OBJECT_PATH, &info->path);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &info->name);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &info->lang);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &info->icon);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &info->authors);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &info->credits);
    g_return_val_if_fail (retval, FALSE);

    return TRUE;
}
Beispiel #10
0
gboolean
ibus_property_serialize (IBusProperty    *prop,
                         IBusMessageIter *iter)
{
    gboolean retval;

    retval = IBUS_SERIALIZABLE_CLASS (ibus_property_parent_class)->serialize ((IBusSerializable *) prop, iter);
    g_return_val_if_fail (retval, FALSE);

    g_return_val_if_fail (IBUS_IS_PROPERTY (prop), FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &prop->key);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_UINT, &prop->type);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, IBUS_TYPE_TEXT, &prop->label);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_STRING, &prop->icon);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, IBUS_TYPE_TEXT, &prop->tooltip);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_BOOLEAN, &prop->sensitive);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_BOOLEAN, &prop->visible);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, G_TYPE_UINT, &prop->state);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_append (iter, IBUS_TYPE_PROP_LIST, &prop->sub_props);
    g_return_val_if_fail (retval, FALSE);

    return TRUE;
}
Beispiel #11
0
gboolean
ibus_serializable_serialize (IBusSerializable *object,
                             IBusMessageIter  *iter)
{
    g_return_val_if_fail (IBUS_IS_SERIALIZABLE (object), FALSE);
    g_return_val_if_fail (iter != NULL, FALSE);

    IBusMessageIter variant_iter;
    IBusMessageIter sub_iter;
    gboolean retval;

    gchar *signature;

    signature = g_strdup_printf ("(s%s)", IBUS_SERIALIZABLE_GET_CLASS (object)->signature->str);
    retval = ibus_message_iter_open_container (iter,
                                               IBUS_TYPE_VARIANT,
                                               signature,
                                               &variant_iter);
    g_free (signature);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_open_container (&variant_iter,
                                               IBUS_TYPE_STRUCT,
                                               NULL,
                                               &sub_iter);
    g_return_val_if_fail (retval, FALSE);

    const gchar *type_name = g_type_name (G_OBJECT_TYPE (object));
    g_return_val_if_fail (type_name != NULL, FALSE);

    retval = ibus_message_iter_append (&sub_iter,
                                       G_TYPE_STRING,
                                       &type_name);
    g_return_val_if_fail (retval, FALSE);

    retval = IBUS_SERIALIZABLE_GET_CLASS (object)->serialize (object, &sub_iter);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_close_container (&variant_iter, &sub_iter);
    g_return_val_if_fail (retval, FALSE);

    retval = ibus_message_iter_close_container (iter, &variant_iter);
    g_return_val_if_fail (retval, FALSE);

    return TRUE;
}
Beispiel #12
0
gboolean
ibus_message_append_args_valist (IBusMessage *message,
                                 GType        first_arg_type,
                                 va_list      va_args)
{
    GType type;
    gboolean retval;
    IBusMessageIter iter;

    ibus_message_iter_init_append (message, &iter);

    type = first_arg_type;
    while (type != G_TYPE_INVALID) {
        gpointer value = va_arg (va_args, gpointer);
        retval = ibus_message_iter_append (&iter, type, value);
        type = va_arg (va_args, GType);

        g_return_val_if_fail (retval, FALSE);
    }

    return TRUE;
}
Beispiel #13
0
gboolean
ibus_message_iter_copy_data (IBusMessageIter *dst,
                             IBusMessageIter *src)
{
    GType type;
    gboolean retval;

    type = ibus_message_iter_get_arg_type (src);

    g_return_val_if_fail (type != G_TYPE_INVALID, FALSE);

    if (gtype_is_basic (type)) {
        gchar data[16];
        ibus_message_iter_get_basic (src, data);
        retval = ibus_message_iter_append (dst, type, data);
        g_return_val_if_fail (retval, FALSE);
        return TRUE;
    }

    if (type == IBUS_TYPE_VARIANT) {
        IBusMessageIter subdst, subsrc;
        gchar *signature;

        retval = ibus_message_iter_recurse (src, IBUS_TYPE_VARIANT, &subsrc);
        g_return_val_if_fail (retval, FALSE);

        signature = dbus_message_iter_get_signature (&subsrc);
        g_return_val_if_fail (signature != NULL, FALSE);
        retval = ibus_message_iter_open_container (dst,
                                                   IBUS_TYPE_VARIANT,
                                                   signature,
                                                   &subdst);
        dbus_free (signature);
        g_return_val_if_fail (retval, FALSE);

        retval = ibus_message_iter_copy_data (&subdst, &subsrc);
        g_return_val_if_fail (retval, FALSE);

        retval = ibus_message_iter_close_container (dst, &subdst);
        g_return_val_if_fail (retval, FALSE);

        return TRUE;
    }
    else if (type == IBUS_TYPE_ARRAY) {
        IBusMessageIter subdst, subsrc;
        gchar *signature;

        retval = ibus_message_iter_recurse (src, IBUS_TYPE_ARRAY, &subsrc);
        g_return_val_if_fail (retval, FALSE);

        signature = dbus_message_iter_get_signature (src);
        g_return_val_if_fail (signature != NULL, FALSE);

        retval = ibus_message_iter_open_container (dst,
                                                   IBUS_TYPE_ARRAY,
                                                   signature + 1,
                                                   &subdst);
        dbus_free (signature);
        g_return_val_if_fail (retval, FALSE);

        while (ibus_message_iter_get_arg_type (&subsrc) != G_TYPE_INVALID) {
            retval = ibus_message_iter_copy_data (&subdst, &subsrc);
            g_return_val_if_fail (retval, FALSE);
            ibus_message_iter_next (&subsrc);
        }

        retval = ibus_message_iter_close_container (dst, &subdst);
        g_return_val_if_fail (retval, FALSE);

        return TRUE;
    }
    else if (type == IBUS_TYPE_STRUCT) {
        IBusMessageIter subdst, subsrc;

        retval = ibus_message_iter_recurse (src, IBUS_TYPE_STRUCT, &subsrc);
        g_return_val_if_fail (retval, FALSE);

        retval = ibus_message_iter_open_container (dst,
                                                   IBUS_TYPE_STRUCT,
                                                   NULL,
                                                   &subdst);
        g_return_val_if_fail (retval, FALSE);

        while (ibus_message_iter_get_arg_type (&subsrc) != G_TYPE_INVALID) {
            retval = ibus_message_iter_copy_data (&subdst, &subsrc);
            ibus_message_iter_next (&subsrc);
            g_return_val_if_fail (retval, FALSE);
        }

        retval = ibus_message_iter_close_container (dst, &subdst);
        g_return_val_if_fail (retval, FALSE);

        return TRUE;
    }
    else if (type == IBUS_TYPE_DICT_ENTRY) {
        IBusMessageIter subdst, subsrc;

        retval = ibus_message_iter_recurse (src, IBUS_TYPE_DICT_ENTRY, &subsrc);
        g_return_val_if_fail (retval, FALSE);

        retval = ibus_message_iter_open_container (dst,
                                                   IBUS_TYPE_DICT_ENTRY,
                                                   NULL,
                                                   &subdst);
        g_return_val_if_fail (retval, FALSE);

        /* copy key */
        retval = ibus_message_iter_copy_data (&subdst, &subsrc);
        g_return_val_if_fail (retval, FALSE);
        ibus_message_iter_next (&subsrc);

        /* copy value */
        retval = ibus_message_iter_copy_data (&subdst, &subsrc);
        g_return_val_if_fail (retval, FALSE);
        ibus_message_iter_next (&subsrc);

        retval = ibus_message_iter_close_container (dst, &subdst);
        g_return_val_if_fail (retval, FALSE);

        return TRUE;
    }

    return FALSE;

}