예제 #1
0
DBusMessage* FcitxDBusMenuGetProperty(FcitxNotificationItem* notificationitem, DBusMessage* message)
{
    /* TODO implement this, document said this only for debug so we ignore it for now */

    /* signature is */
    DBusMessage* reply = NULL;
    reply = FcitxDBusPropertyUnknownMethod(message);

    return reply;
}
예제 #2
0
DBusMessage* FcitxDBusMenuGetLayout(FcitxNotificationItem* notificationitem, DBusMessage* message)
{
    /* signature iias */
    DBusMessageIter args;
    dbus_message_iter_init(message, &args);

    DBusMessage* reply = NULL;

    int32_t id, recursionDepth;
    do {
        if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_INT32)
            break;
        dbus_message_iter_get_basic(&args, &id);
        dbus_message_iter_next(&args);

        if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_INT32)
            break;
        dbus_message_iter_get_basic(&args, &recursionDepth);
        dbus_message_iter_next(&args);

        if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_ARRAY)
            break;

        DBusMessageIter sub;
        dbus_message_iter_recurse(&args, &sub);
        FcitxStringHashSet* properties = NULL;
        while (dbus_message_iter_get_arg_type(&sub) == DBUS_TYPE_STRING) {
            char* property;
            dbus_message_iter_get_basic(&sub, &property);

            if (!fcitx_utils_string_hash_set_contains(properties, property)) {
                properties = fcitx_utils_string_hash_set_insert(properties, property);
            }
            dbus_message_iter_next(&sub);
        }

        reply = dbus_message_new_method_return(message);

        /* out put is u(ia{sv}av) */
        DBusMessageIter iter;
        dbus_message_iter_init_append(reply, &iter);
        dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &notificationitem->revision);
        FcitxDBusMenuFillLayooutItem(notificationitem, id, recursionDepth, properties, &iter);

        fcitx_utils_free_string_hash_set(properties);
    } while(0);

    if (!reply) {
        reply = FcitxDBusPropertyUnknownMethod(message);
    }

    return reply;
}
예제 #3
0
DBusMessage* FcitxDBusPropertySet(void* arg, const FcitxDBusPropertyTable* propertTable, DBusMessage* message)
{
    DBusError error;
    dbus_error_init(&error);
    char *interface;
    char *property;
    DBusMessage* reply = NULL;

    DBusMessageIter args, variant;
    dbus_message_iter_init(message, &args);

    if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_STRING)
        goto dbus_property_set_end;

    dbus_message_iter_get_basic(&args, &interface);
    dbus_message_iter_next(&args);

    if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_STRING)
        goto dbus_property_set_end;
    dbus_message_iter_get_basic(&args, &property);
    dbus_message_iter_next(&args);

    if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_VARIANT)
        goto dbus_property_set_end;

    dbus_message_iter_recurse(&args, &variant);
    int index = 0;
    while (propertTable[index].interface != NULL) {
        if (strcmp(propertTable[index].interface, interface) == 0
                && strcmp(propertTable[index].name, property) == 0)
            break;
        index ++;
    }
    if (propertTable[index].setfunc) {
        propertTable[index].setfunc(arg, &variant);
        reply = dbus_message_new_method_return(message);
    }
    else {
        reply = dbus_message_new_error_printf(message, DBUS_ERROR_UNKNOWN_PROPERTY, "No such property ('%s.%s')", interface, property);
    }

dbus_property_set_end:
    if (!reply)
        reply = FcitxDBusPropertyUnknownMethod(message);

    return reply;
}
예제 #4
0
DBusMessage* FcitxDBusPropertyGet(void* arg, const FcitxDBusPropertyTable* propertTable, DBusMessage* message)
{
    DBusError error;
    dbus_error_init(&error);
    char *interface;
    char *property;
    DBusMessage* reply = NULL;
    if (dbus_message_get_args(message, &error,
                              DBUS_TYPE_STRING, &interface,
                              DBUS_TYPE_STRING, &property,
                              DBUS_TYPE_INVALID)) {
        int index = 0;
        while (propertTable[index].interface != NULL) {
            if (strcmp(propertTable[index].interface, interface) == 0
                    && strcmp(propertTable[index].name, property) == 0)
                break;
            index ++;
        }

        if (propertTable[index].interface) {
            DBusMessageIter args, variant;
            reply = dbus_message_new_method_return(message);
            dbus_message_iter_init_append(reply, &args);
            dbus_message_iter_open_container(&args, DBUS_TYPE_VARIANT, propertTable[index].type, &variant);
            if (propertTable[index].getfunc)
                propertTable[index].getfunc(arg, &variant);
            dbus_message_iter_close_container(&args, &variant);
        }
        else {
            reply = dbus_message_new_error_printf(message, DBUS_ERROR_UNKNOWN_PROPERTY, "No such property ('%s.%s')", interface, property);
        }
    }
    else {
        reply = FcitxDBusPropertyUnknownMethod(message);
    }

    return reply;
}
예제 #5
0
DBusMessage* FcitxDBusPropertyGetAll(void* arg, const FcitxDBusPropertyTable* propertTable, DBusMessage* message)
{
    DBusError error;
    dbus_error_init(&error);
    char *interface;
    DBusMessage* reply = NULL;
    if (dbus_message_get_args(message, &error,
                              DBUS_TYPE_STRING, &interface,
                              DBUS_TYPE_INVALID)) {
        reply = dbus_message_new_method_return(message);
        int index = 0;
        DBusMessageIter args;
        dbus_message_iter_init_append(reply, &args);
        DBusMessageIter array, entry;
        dbus_message_iter_open_container(&args, DBUS_TYPE_ARRAY, "{sv}", &array);

        while (propertTable[index].interface != NULL) {
            if (strcmp(propertTable[index].interface, interface) == 0 && propertTable[index].getfunc) {
                dbus_message_iter_open_container(&array, DBUS_TYPE_DICT_ENTRY,
                                                 NULL, &entry);

                dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &propertTable[index].name);
                DBusMessageIter variant;
                dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT, propertTable[index].type, &variant);
                propertTable[index].getfunc(arg, &variant);
                dbus_message_iter_close_container(&entry, &variant);

                dbus_message_iter_close_container(&array, &entry);
            }
            index ++;
        }
        dbus_message_iter_close_container(&args, &array);
    }
    if (!reply)
        reply = FcitxDBusPropertyUnknownMethod(message);

    return reply;
}
예제 #6
0
DBusMessage* FcitxDBusMenuAboutToShow(FcitxNotificationItem* notificationitem, DBusMessage* message)
{
    DBusMessage* reply = NULL;
    /* signature i out b */
    int32_t id;
    DBusError err;
    dbus_error_init(&err);
    if (dbus_message_get_args(message, &err, DBUS_TYPE_INT32, &id, DBUS_TYPE_INVALID)) {
        reply = dbus_message_new_method_return(message);
        /* for fcitx, we always return true */
        dbus_bool_t needUpdate = TRUE;
        dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &needUpdate, DBUS_TYPE_INVALID);
        notificationitem->revision++;
        DBusMessage* sig = dbus_message_new_signal("/MenuBar", DBUS_MENU_IFACE, "LayoutUpdated");
        dbus_message_append_args(sig, DBUS_TYPE_UINT32, &notificationitem->revision, DBUS_TYPE_INT32, &id, DBUS_TYPE_INVALID);
        dbus_connection_send(notificationitem->conn, sig, NULL);
        dbus_message_unref(sig);
    } else {
        reply = FcitxDBusPropertyUnknownMethod(message);
    }

    dbus_error_free(&err);
    return reply;
}
예제 #7
0
DBusMessage* FcitxDBusMenuGetGroupProperties(FcitxNotificationItem* notificationitem, DBusMessage* message)
{
    /* signature aias */
    DBusMessageIter args;
    dbus_message_iter_init(message, &args);

    DBusMessage* reply = NULL;

    do {
        if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_ARRAY)
            break;

        DBusMessageIter sub;
        dbus_message_iter_recurse(&args, &sub);
        UT_array ids;
        utarray_init(&ids, &ut_int32_icd);
        while (dbus_message_iter_get_arg_type(&sub) == DBUS_TYPE_INT32) {
            int32_t id;
            dbus_message_iter_get_basic(&sub, &id);

            utarray_push_back(&ids, &id);
            dbus_message_iter_next(&sub);
        }
        dbus_message_iter_next(&args);

        dbus_message_iter_recurse(&args, &sub);
        FcitxStringHashSet* properties = NULL;
        if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_ARRAY) {
            utarray_done(&ids);
            break;
        }

        while (dbus_message_iter_get_arg_type(&sub) == DBUS_TYPE_STRING) {
            char* property;
            dbus_message_iter_get_basic(&sub, &property);

            if (!fcitx_utils_string_hash_set_contains(properties, property)) {
                properties = fcitx_utils_string_hash_set_insert(properties, property);
            }
            dbus_message_iter_next(&sub);
        }

        reply = dbus_message_new_method_return(message);

        /* out put is a(ia{sv}) */
        DBusMessageIter iter;
        dbus_message_iter_init_append(reply, &iter);
        dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(ia{sv})", &sub);
        int i = 0;
        for (; i < utarray_len(&ids); i ++) {
            int32_t id = *(int32_t*) utarray_eltptr(&ids, i);
            DBusMessageIter ssub;
            dbus_message_iter_open_container(&sub, DBUS_TYPE_STRUCT, NULL, &ssub);
            dbus_message_iter_append_basic(&ssub, DBUS_TYPE_INT32, &id);
            FcitxDBusMenuFillProperty(notificationitem, id, properties, &ssub);
            dbus_message_iter_close_container(&sub, &ssub);
        }
        dbus_message_iter_close_container(&iter, &sub);

        utarray_done(&ids);
        fcitx_utils_free_string_hash_set(properties);
    } while(0);

    if (!reply) {
        reply = FcitxDBusPropertyUnknownMethod(message);
    }

    return reply;
}