ratbagd: split dbus handling from object handling

Make sure our dbus callbacks to not contain any logic themselves. They
should be simple wrappers around our internal object handling.

This also makes use of the new sd-bus pat helpers, to-be-released with
systemd-v227 next week.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
This commit is contained in:
David Herrmann
2015-09-26 18:02:00 +02:00
parent c0799b0c1d
commit b1851ada93
4 changed files with 58 additions and 48 deletions

View File

@@ -128,7 +128,7 @@ m4_pattern_forbid([^_?PKG_[A-Z_]+$],[*** pkg.m4 missing, please install pkg-conf
# dependencies
PKG_CHECK_MODULES([LIBUDEV], [libudev])
PKG_CHECK_MODULES([LIBSYSTEMD], [libsystemd >= 225])
PKG_CHECK_MODULES([LIBSYSTEMD], [libsystemd >= 227])
PKG_CHECK_MODULES([LIBRATBAG], [libratbag])
# ------------------------------------------------------------------------------

View File

@@ -45,7 +45,7 @@ struct ratbagd_device {
#define ratbagd_device_from_node(_ptr) \
rbnode_of((_ptr), struct ratbagd_device, node)
static int ratbagd_device_find(sd_bus *bus,
static int ratbagd_find_device(sd_bus *bus,
const char *path,
const char *interface,
void *userdata,
@@ -57,12 +57,13 @@ static int ratbagd_device_find(sd_bus *bus,
struct ratbagd_device *device;
int r;
/* decodes the suffix into @name, returns 1 if valid */
r = sd_bus_path_decode(path, "/org/freedesktop/ratbag1/device", &name);
r = sd_bus_path_decode_many(path,
"/org/freedesktop/ratbag1/device/%",
&name);
if (r <= 0)
return r;
device = ratbagd_find_device(ctx, name);
device = ratbagd_device_lookup(ctx, name);
if (!device)
return 0;
@@ -70,46 +71,17 @@ static int ratbagd_device_find(sd_bus *bus,
return 1;
}
static int ratbagd_device_list(sd_bus *bus,
const char *path,
void *userdata,
char ***nodes,
sd_bus_error *error)
static int ratbagd_list_devices(sd_bus *bus,
const char *path,
void *userdata,
char ***paths,
sd_bus_error *error)
{
struct ratbagd *ctx = userdata;
struct ratbagd_device *device;
char **devices, **pos;
RBNode *node;
int r;
devices = calloc(ctx->n_devices + 1, sizeof(char *));
if (!devices)
return -ENOMEM;
pos = devices;
for (node = rbtree_first(&ctx->device_map);
node;
node = rbnode_next(node)) {
device = ratbagd_device_from_node(node);
r = sd_bus_path_encode("/org/freedesktop/ratbag1/device",
device->name,
pos++);
if (r < 0)
goto error;
}
*pos = NULL;
*nodes = devices;
return 1;
error:
for (pos = devices; *pos; ++pos)
free(*pos);
free(devices);
return r;
r = ratbagd_device_list(ctx, paths);
return r < 0 ? r : 1;
}
static int ratbagd_device_get_description(sd_bus *bus,
@@ -274,7 +246,7 @@ int ratbagd_init_device(struct ratbagd *ctx)
"/org/freedesktop/ratbag1/device",
"org.freedesktop.ratbag1.Device",
ratbagd_device_vtable,
ratbagd_device_find,
ratbagd_find_device,
ctx);
if (r < 0)
return r;
@@ -282,7 +254,7 @@ int ratbagd_init_device(struct ratbagd *ctx)
r = sd_bus_add_node_enumerator(ctx->bus,
NULL,
"/org/freedesktop/ratbag1/device",
ratbagd_device_list,
ratbagd_list_devices,
ctx);
if (r < 0)
return r;
@@ -290,8 +262,8 @@ int ratbagd_init_device(struct ratbagd *ctx)
return 0;
}
struct ratbagd_device *ratbagd_find_device(struct ratbagd *ctx,
const char *name)
struct ratbagd_device *ratbagd_device_lookup(struct ratbagd *ctx,
const char *name)
{
struct ratbagd_device *device;
RBNode *node;
@@ -314,3 +286,39 @@ struct ratbagd_device *ratbagd_find_device(struct ratbagd *ctx,
return NULL;
}
int ratbagd_device_list(struct ratbagd *ctx, char ***paths)
{
struct ratbagd_device *device;
char **devices, **pos;
RBNode *node;
int r;
devices = calloc(ctx->n_devices + 1, sizeof(char *));
if (!devices)
return -ENOMEM;
pos = devices;
for (node = rbtree_first(&ctx->device_map);
node;
node = rbnode_next(node)) {
device = ratbagd_device_from_node(node);
r = sd_bus_path_encode_many(pos++,
"/org/freedesktop/ratbag1/device/%",
device->name);
if (r < 0)
goto error;
}
*pos = NULL;
*paths = devices;
return 1;
error:
for (pos = devices; *pos; ++pos)
free(*pos);
free(devices);
return r;
}

View File

@@ -55,7 +55,7 @@ static void ratbagd_process_device(struct ratbagd *ctx,
if (!name || !startswith(name, "event"))
return;
device = ratbagd_find_device(ctx, name);
device = ratbagd_device_lookup(ctx, name);
if (streq_ptr("remove", udev_device_get_action(udevice))) {
/* device was removed, unlink it and destroy our context */

View File

@@ -54,6 +54,10 @@ void ratbagd_device_unlink(struct ratbagd_device *device);
DEFINE_TRIVIAL_CLEANUP_FUNC(struct ratbagd_device *, ratbagd_device_free);
struct ratbagd_device *ratbagd_device_lookup(struct ratbagd *ctx,
const char *name);
int ratbagd_device_list(struct ratbagd *ctx, char ***paths);
/*
* Context
*/
@@ -70,5 +74,3 @@ struct ratbagd {
};
int ratbagd_init_device(struct ratbagd *ctx);
struct ratbagd_device *ratbagd_find_device(struct ratbagd *ctx,
const char *name);