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; }
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, ¬ificationitem->revision); FcitxDBusMenuFillLayooutItem(notificationitem, id, recursionDepth, properties, &iter); fcitx_utils_free_string_hash_set(properties); } while(0); if (!reply) { reply = FcitxDBusPropertyUnknownMethod(message); } return reply; }
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; }
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; }
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; }
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, ¬ificationitem->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; }
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; }