break;
case _SD_BUS_VTABLE_METHOD:
- fprintf(i->f, " <method name=\"%s\">\n", v->method.member);
- introspect_write_arguments(i, v->method.signature, "in");
- introspect_write_arguments(i, v->method.result, "out");
+ fprintf(i->f, " <method name=\"%s\">\n", v->x.method.member);
+ introspect_write_arguments(i, v->x.method.signature, "in");
+ introspect_write_arguments(i, v->x.method.result, "out");
introspect_write_flags(i, v->type, v->flags);
fputs(" </method>\n", i->f);
break;
case _SD_BUS_VTABLE_PROPERTY:
case _SD_BUS_VTABLE_WRITABLE_PROPERTY:
fprintf(i->f, " <property name=\"%s\" type=\"%s\" access=\"%s\">\n",
- v->property.member,
- v->property.signature,
+ v->x.property.member,
+ v->x.property.signature,
v->type == _SD_BUS_VTABLE_WRITABLE_PROPERTY ? "readwrite" : "read");
introspect_write_flags(i, v->type, v->flags);
fputs(" </property>\n", i->f);
break;
case _SD_BUS_VTABLE_SIGNAL:
- fprintf(i->f, " <signal name=\"%s\">\n", v->signal.member);
- introspect_write_arguments(i, v->signal.signature, NULL);
+ fprintf(i->f, " <signal name=\"%s\">\n", v->x.signal.member);
+ introspect_write_arguments(i, v->x.signal.signature, NULL);
introspect_write_flags(i, v->type, v->flags);
fputs(" </signal>\n", i->f);
break;
static void *vtable_property_convert_userdata(const sd_bus_vtable *p, void *u) {
assert(p);
- return (uint8_t*) u + p->property.offset;
+ return (uint8_t*) u + p->x.property.offset;
}
static int vtable_property_get_userdata(
if (r < 0)
return r;
- if (!streq(strempty(c->vtable->method.signature), signature)) {
+ if (!streq(strempty(c->vtable->x.method.signature), signature)) {
r = sd_bus_reply_method_errorf(bus, m,
"org.freedesktop.DBus.Error.InvalidArgs",
"Invalid arguments '%s' to call %s:%s, expecting '%s'.",
- signature, c->interface, c->member, strempty(c->vtable->method.signature));
+ signature, c->interface, c->member, strempty(c->vtable->x.method.signature));
if (r < 0)
return r;
return 1;
}
- if (c->vtable->method.handler)
- return c->vtable->method.handler(bus, m, u);
+ if (c->vtable->x.method.handler)
+ return c->vtable->x.method.handler(bus, m, u);
/* If the method callback is NULL, make this a successful NOP */
r = sd_bus_reply_method_return(bus, m, NULL);
assert(bus);
assert(v);
- if (v->property.get)
- return v->property.get(bus, path, interface, property, m, error, userdata);
+ if (v->x.property.get)
+ return v->x.property.get(bus, path, interface, property, m, error, userdata);
/* Automatic handling if no callback is defined. */
- assert(bus_type_is_basic(v->property.signature[0]));
+ assert(signature_is_single(v->x.property.signature, false));
+ assert(bus_type_is_basic(v->x.property.signature[0]));
- switch (v->property.signature[0]) {
+ switch (v->x.property.signature[0]) {
case SD_BUS_TYPE_STRING:
case SD_BUS_TYPE_OBJECT_PATH:
break;
}
- r = sd_bus_message_append_basic(m, v->property.signature[0], p);
+ r = sd_bus_message_append_basic(m, v->x.property.signature[0], p);
if (r < 0)
return r;
assert(bus);
assert(v);
- if (v->property.set)
- return v->property.set(bus, path, interface, property, value, error, userdata);
+ if (v->x.property.set)
+ return v->x.property.set(bus, path, interface, property, value, error, userdata);
/* Automatic handling if no callback is defined. */
- assert(signature_is_single(v->property.signature, false));
- assert(bus_type_is_basic(v->property.signature[0]));
+ assert(signature_is_single(v->x.property.signature, false));
+ assert(bus_type_is_basic(v->x.property.signature[0]));
- switch (v->property.signature[0]) {
+ switch (v->x.property.signature[0]) {
case SD_BUS_TYPE_STRING:
case SD_BUS_TYPE_OBJECT_PATH:
const char *p;
char *n;
- r = sd_bus_message_read_basic(value, v->property.signature[0], &p);
+ r = sd_bus_message_read_basic(value, v->x.property.signature[0], &p);
if (r < 0)
return r;
}
default:
- r = sd_bus_message_read_basic(value, v->property.signature[0], userdata);
+ r = sd_bus_message_read_basic(value, v->x.property.signature[0], userdata);
if (r < 0)
return r;
c->last_iteration = bus->iteration_counter;
if (is_get) {
- r = sd_bus_message_open_container(reply, 'v', c->vtable->property.signature);
+ r = sd_bus_message_open_container(reply, 'v', c->vtable->x.property.signature);
if (r < 0)
return r;
if (c->vtable->type != _SD_BUS_VTABLE_WRITABLE_PROPERTY)
sd_bus_error_setf(&error, "org.freedesktop.DBus.Error.PropertyReadOnly", "Property '%s' is not writable.", c->member);
else {
- r = sd_bus_message_enter_container(m, 'v', c->vtable->property.signature);
+ r = sd_bus_message_enter_container(m, 'v', c->vtable->x.property.signature);
if (r < 0)
return r;
if (r < 0)
return r;
- r = sd_bus_message_open_container(reply, 'v', v->property.signature);
+ r = sd_bus_message_open_container(reply, 'v', v->x.property.signature);
if (r < 0)
return r;
- r = invoke_property_get(bus, v, path, c->interface, v->property.member, reply, error, vtable_property_convert_userdata(v, userdata));
+ r = invoke_property_get(bus, v, path, c->interface, v->x.property.member, reply, error, vtable_property_convert_userdata(v, userdata));
if (r < 0)
return r;
key.path = w->node->path;
key.interface = w->interface;
- key.member = v->method.member;
+ key.member = v->x.method.member;
x = hashmap_remove(bus->vtable_methods, &key);
break;
key.path = w->node->path;
key.interface = w->interface;
- key.member = v->property.member;
+ key.member = v->x.property.member;
x = hashmap_remove(bus->vtable_properties, &key);
break;
}}
return -EINVAL;
if (!interface_name_is_valid(interface))
return -EINVAL;
- if (!vtable || vtable[0].type != _SD_BUS_VTABLE_START || vtable[0].start.element_size != sizeof(struct sd_bus_vtable))
+ if (!vtable || vtable[0].type != _SD_BUS_VTABLE_START || vtable[0].x.start.element_size != sizeof(struct sd_bus_vtable))
return -EINVAL;
if (bus_pid_changed(bus))
return -ECHILD;
case _SD_BUS_VTABLE_METHOD: {
struct vtable_member *m;
- if (!member_name_is_valid(v->method.member) ||
- !signature_is_valid(strempty(v->method.signature), false) ||
- !signature_is_valid(strempty(v->method.result), false) ||
- !(v->method.handler || (isempty(v->method.signature) && isempty(v->method.result))) ||
+ if (!member_name_is_valid(v->x.method.member) ||
+ !signature_is_valid(strempty(v->x.method.signature), false) ||
+ !signature_is_valid(strempty(v->x.method.result), false) ||
+ !(v->x.method.handler || (isempty(v->x.method.signature) && isempty(v->x.method.result))) ||
v->flags & (SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE|SD_BUS_VTABLE_PROPERTY_INVALIDATE_ONLY)) {
r = -EINVAL;
goto fail;
m->parent = c;
m->path = n->path;
m->interface = c->interface;
- m->member = v->method.member;
+ m->member = v->x.method.member;
m->vtable = v;
r = hashmap_put(bus->vtable_methods, m, m);
case _SD_BUS_VTABLE_WRITABLE_PROPERTY:
- if (!(v->property.set || bus_type_is_basic(v->property.signature[0]))) {
+ if (!(v->x.property.set || bus_type_is_basic(v->x.property.signature[0]))) {
r = -EINVAL;
goto fail;
}
case _SD_BUS_VTABLE_PROPERTY: {
struct vtable_member *m;
- if (!member_name_is_valid(v->property.member) ||
- !signature_is_single(v->property.signature, false) ||
- !(v->property.get || bus_type_is_basic(v->property.signature[0])) ||
+ if (!member_name_is_valid(v->x.property.member) ||
+ !signature_is_single(v->x.property.signature, false) ||
+ !(v->x.property.get || bus_type_is_basic(v->x.property.signature[0])) ||
v->flags & SD_BUS_VTABLE_METHOD_NO_REPLY ||
(v->flags & SD_BUS_VTABLE_PROPERTY_INVALIDATE_ONLY && !(v->flags & SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE))) {
r = -EINVAL;
m->parent = c;
m->path = n->path;
m->interface = c->interface;
- m->member = v->property.member;
+ m->member = v->x.property.member;
m->vtable = v;
r = hashmap_put(bus->vtable_properties, m, m);
case _SD_BUS_VTABLE_SIGNAL:
- if (!member_name_is_valid(v->signal.member) ||
- !signature_is_single(strempty(v->signal.signature), false)) {
+ if (!member_name_is_valid(v->x.signal.member) ||
+ !signature_is_single(strempty(v->x.signal.signature), false)) {
r = -EINVAL;
goto fail;
}
if (r < 0)
return r;
- r = sd_bus_message_open_container(m, 'v', v->vtable->property.signature);
+ r = sd_bus_message_open_container(m, 'v', v->vtable->x.property.signature);
if (r < 0)
return r;
sd_bus_property_set_t set;
size_t offset;
} property;
- };
+ } x;
};
#define SD_BUS_VTABLE_START(_flags) \
{ \
.type = _SD_BUS_VTABLE_START, \
.flags = _flags, \
- .start.element_size = sizeof(sd_bus_vtable), \
+ .x.start.element_size = sizeof(sd_bus_vtable), \
}
#define SD_BUS_METHOD(_member, _signature, _result, _handler, _flags) \
{ \
.type = _SD_BUS_VTABLE_METHOD, \
.flags = _flags, \
- .method.member = _member, \
- .method.signature = _signature, \
- .method.result = _result, \
- .method.handler = _handler, \
+ .x.method.member = _member, \
+ .x.method.signature = _signature, \
+ .x.method.result = _result, \
+ .x.method.handler = _handler, \
}
#define SD_BUS_SIGNAL(_member, _signature, _flags) \
{ \
.type = _SD_BUS_VTABLE_SIGNAL, \
.flags = _flags, \
- .signal.member = _member, \
- .signal.signature = _signature, \
+ .x.signal.member = _member, \
+ .x.signal.signature = _signature, \
}
-#define SD_BUS_PROPERTY(_member, _signature, _get, _offset, _flags) \
+#define SD_BUS_PROPERTY(_member, _signature, _get, _offset, _flags) \
{ \
.type = _SD_BUS_VTABLE_PROPERTY, \
.flags = _flags, \
- .property.member = _member, \
- .property.signature = _signature, \
- .property.get = _get, \
- .property.offset = _offset, \
+ .x.property.member = _member, \
+ .x.property.signature = _signature, \
+ .x.property.get = _get, \
+ .x.property.offset = _offset, \
}
#define SD_BUS_WRITABLE_PROPERTY(_member, _signature, _get, _set, _offset, _flags) \
{ \
.type = _SD_BUS_VTABLE_WRITABLE_PROPERTY, \
.flags = _flags, \
- .property.member = _member, \
- .property.signature = _signature, \
- .property.get = _get, \
- .property.set = _set, \
- .property.offset = _offset, \
+ .x.property.member = _member, \
+ .x.property.signature = _signature, \
+ .x.property.get = _get, \
+ .x.property.set = _set, \
+ .x.property.offset = _offset, \
}
#define SD_BUS_VTABLE_END \