mirror of
https://github.com/libratbag/libratbag.git
synced 2026-11-08 07:33:53 +01:00
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:
@@ -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])
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user