int bus_message_map_properties_changed(sd_bus *bus, sd_bus_message *m, const struct bus_properties_map *map, void *userdata) { const char *member; int r, invalidated, i; assert(bus); assert(m); assert(map); r = bus_message_map_all_properties(bus, m, map, userdata); if (r < 0) return r; r = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, "s"); if (r < 0) return r; invalidated = 0; while ((r = sd_bus_message_read_basic(m, SD_BUS_TYPE_STRING, &member)) > 0) for (i = 0; map[i].member; i++) if (streq(map[i].member, member)) { ++invalidated; break; } r = sd_bus_message_exit_container(m); if (r < 0) return r; return invalidated; }
int bus_map_all_properties(sd_bus *bus, const char *destination, const char *path, const struct bus_properties_map *map, void *userdata) { _cleanup_bus_message_unref_ sd_bus_message *m = NULL; _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; int r; assert(bus); assert(destination); assert(path); assert(map); r = sd_bus_call_method( bus, destination, path, "org.freedesktop.DBus.Properties", "GetAll", &error, &m, "s", ""); if (r < 0) return r; return bus_message_map_all_properties(bus, m, map, userdata); }
static int kbdctx_locale_get_all_fn(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *ret_err) { kbdctx *kc = userdata; int r; kc->slot_locale_get_all = sd_bus_slot_unref(kc->slot_locale_get_all); if (sd_bus_message_is_method_error(m, NULL)) { const sd_bus_error *error = sd_bus_message_get_error(m); log_debug("idev-keyboard: GetAll() on locale1 failed: %s: %s", error->name, error->message); return 0; } r = bus_message_map_all_properties(bus, m, kbdctx_locale_map, kc); if (r < 0) { log_debug("idev-keyboard: erroneous GetAll() reply from locale1"); return 0; } kbdctx_refresh_keymap(kc); return 0; }