diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-05-15 01:15:30 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-05-15 01:15:30 +0200 |
commit | 19befb2d5fc087f96e40ddc432b2cc9385666209 (patch) | |
tree | 4a28a54ed25ba8fb57578f639b2691749c9c935e /src/libsystemd/sd-bus/test-bus-match.c | |
parent | 9a78148e40402b44f361f4fbf63bb97a21aeac0b (diff) |
sd-bus: introduce sd_bus_slot objects encapsulating callbacks or vtables attached to a bus connection
This makes callback behaviour more like sd-event or sd-resolve, and
creates proper object for unregistering callbacks.
Taking the refernce to the slot is optional. If not taken life time of
the slot will be bound to the underlying bus object (or in the case of
an async call until the reply has been recieved).
Diffstat (limited to 'src/libsystemd/sd-bus/test-bus-match.c')
-rw-r--r-- | src/libsystemd/sd-bus/test-bus-match.c | 59 |
1 files changed, 26 insertions, 33 deletions
diff --git a/src/libsystemd/sd-bus/test-bus-match.c b/src/libsystemd/sd-bus/test-bus-match.c index c561be2a65..a62de502f9 100644 --- a/src/libsystemd/sd-bus/test-bus-match.c +++ b/src/libsystemd/sd-bus/test-bus-match.c @@ -28,6 +28,7 @@ #include "bus-match.h" #include "bus-message.h" #include "bus-util.h" +#include "bus-slot.h" static bool mask[32]; @@ -56,31 +57,23 @@ static bool mask_contains(unsigned a[], unsigned n) { return true; } -static int match_add(struct bus_match_node *root, const char *match, int value) { +static int match_add(sd_bus_slot *slots, struct bus_match_node *root, const char *match, int value) { struct bus_match_component *components = NULL; unsigned n_components = 0; + sd_bus_slot *s; int r; - r = bus_match_parse(match, &components, &n_components); - if (r < 0) - return r; - - r = bus_match_add(root, components, n_components, filter, INT_TO_PTR(value), 0, NULL); - bus_match_parse_free(components, n_components); - - return r; -} - -static int match_remove(struct bus_match_node *root, const char *match, int value) { - struct bus_match_component *components = NULL; - unsigned n_components = 0; - int r; + s = slots + value; + zero(*s); r = bus_match_parse(match, &components, &n_components); if (r < 0) return r; - r = bus_match_remove(root, components, n_components, filter, INT_TO_PTR(value), 0); + s->userdata = INT_TO_PTR(value); + s->match_callback.callback = filter; + + r = bus_match_add(root, components, n_components, &s->match_callback); bus_match_parse_free(components, n_components); return r; @@ -90,24 +83,25 @@ int main(int argc, char *argv[]) { struct bus_match_node root; _cleanup_bus_message_unref_ sd_bus_message *m = NULL; enum bus_match_node_type i; + sd_bus_slot slots[15]; zero(root); root.type = BUS_MATCH_ROOT; - assert_se(match_add(&root, "arg2='wal\\'do',sender='foo',type='signal',interface='bar.x',", 1) >= 0); - assert_se(match_add(&root, "arg2='wal\\'do2',sender='foo',type='signal',interface='bar.x',", 2) >= 0); - assert_se(match_add(&root, "arg3='test',sender='foo',type='signal',interface='bar.x',", 3) >= 0); - assert_se(match_add(&root, "arg3='test',sender='foo',type='method_call',interface='bar.x',", 4) >= 0); - assert_se(match_add(&root, "", 5) >= 0); - assert_se(match_add(&root, "interface='quux.x'", 6) >= 0); - assert_se(match_add(&root, "interface='bar.x'", 7) >= 0); - assert_se(match_add(&root, "member='waldo',path='/foo/bar'", 8) >= 0); - assert_se(match_add(&root, "path='/foo/bar'", 9) >= 0); - assert_se(match_add(&root, "path_namespace='/foo'", 10) >= 0); - assert_se(match_add(&root, "path_namespace='/foo/quux'", 11) >= 0); - assert_se(match_add(&root, "arg1='two'", 12) >= 0); - assert_se(match_add(&root, "member='waldo',arg2path='/prefix/'", 13) >= 0); - assert_se(match_add(&root, "member=waldo,path='/foo/bar',arg3namespace='prefix'", 14) >= 0); + assert_se(match_add(slots, &root, "arg2='wal\\'do',sender='foo',type='signal',interface='bar.x',", 1) >= 0); + assert_se(match_add(slots, &root, "arg2='wal\\'do2',sender='foo',type='signal',interface='bar.x',", 2) >= 0); + assert_se(match_add(slots, &root, "arg3='test',sender='foo',type='signal',interface='bar.x',", 3) >= 0); + assert_se(match_add(slots, &root, "arg3='test',sender='foo',type='method_call',interface='bar.x',", 4) >= 0); + assert_se(match_add(slots, &root, "", 5) >= 0); + assert_se(match_add(slots, &root, "interface='quux.x'", 6) >= 0); + assert_se(match_add(slots, &root, "interface='bar.x'", 7) >= 0); + assert_se(match_add(slots, &root, "member='waldo',path='/foo/bar'", 8) >= 0); + assert_se(match_add(slots, &root, "path='/foo/bar'", 9) >= 0); + assert_se(match_add(slots, &root, "path_namespace='/foo'", 10) >= 0); + assert_se(match_add(slots, &root, "path_namespace='/foo/quux'", 11) >= 0); + assert_se(match_add(slots, &root, "arg1='two'", 12) >= 0); + assert_se(match_add(slots, &root, "member='waldo',arg2path='/prefix/'", 13) >= 0); + assert_se(match_add(slots, &root, "member=waldo,path='/foo/bar',arg3namespace='prefix'", 14) >= 0); bus_match_dump(&root, 0); @@ -119,9 +113,8 @@ int main(int argc, char *argv[]) { assert_se(bus_match_run(NULL, &root, m) == 0); assert_se(mask_contains((unsigned[]) { 9, 8, 7, 5, 10, 12, 13, 14 }, 8)); - assert_se(match_remove(&root, "member='waldo',path='/foo/bar'", 8) > 0); - assert_se(match_remove(&root, "arg2path='/prefix/',member='waldo'", 13) > 0); - assert_se(match_remove(&root, "interface='bar.xx'", 7) == 0); + assert_se(bus_match_remove(&root, &slots[8].match_callback) >= 0); + assert_se(bus_match_remove(&root, &slots[13].match_callback) >= 0); bus_match_dump(&root, 0); |