diff options
author | Will Thompson <will.thompson@collabora.co.uk> | 2009-07-29 20:03:40 +0100 |
---|---|---|
committer | Ralf Habacker <ralf.habacker@freenet.de> | 2010-01-05 21:11:12 +0100 |
commit | 86d0d2baf58fefab79d4de9508e1fd86fcbb155e (patch) | |
tree | f7712f6789e680751bd6179be7102ae58901c47e /bus/signals.c | |
parent | a2c4eca52a4de27daa022b346e8eba2c0abf5ac8 (diff) | |
download | dbus-86d0d2baf58fefab79d4de9508e1fd86fcbb155e.tar.gz |
Extract rule_list_remove_by_connection
Diffstat (limited to 'bus/signals.c')
-rw-r--r-- | bus/signals.c | 82 |
1 files changed, 45 insertions, 37 deletions
diff --git a/bus/signals.c b/bus/signals.c index 3cf846ea..c6f122b6 100644 --- a/bus/signals.c +++ b/bus/signals.c @@ -1285,11 +1285,54 @@ bus_matchmaker_remove_rule_by_value (BusMatchmaker *matchmaker, return TRUE; } +static void +rule_list_remove_by_connection (DBusList **rules, + DBusConnection *disconnected) +{ + DBusList *link; + + link = _dbus_list_get_first_link (rules); + while (link != NULL) + { + BusMatchRule *rule; + DBusList *next; + + rule = link->data; + next = _dbus_list_get_next_link (rules, link); + + if (rule->matches_go_to == disconnected) + { + bus_matchmaker_remove_rule_link (rules, link); + } + else if (((rule->flags & BUS_MATCH_SENDER) && *rule->sender == ':') || + ((rule->flags & BUS_MATCH_DESTINATION) && *rule->destination == ':')) + { + /* The rule matches to/from a base service, see if it's the + * one being disconnected, since we know this service name + * will never be recycled. + */ + const char *name; + + name = bus_connection_get_name (disconnected); + _dbus_assert (name != NULL); /* because we're an active connection */ + + if (((rule->flags & BUS_MATCH_SENDER) && + strcmp (rule->sender, name) == 0) || + ((rule->flags & BUS_MATCH_DESTINATION) && + strcmp (rule->destination, name) == 0)) + { + bus_matchmaker_remove_rule_link (rules, link); + } + } + + link = next; + } +} + void bus_matchmaker_disconnected (BusMatchmaker *matchmaker, DBusConnection *disconnected) { - DBusList *link; int i; /* FIXME @@ -1307,42 +1350,7 @@ bus_matchmaker_disconnected (BusMatchmaker *matchmaker, { DBusList **rules = bus_matchmaker_get_rules (matchmaker, i); - link = _dbus_list_get_first_link (rules); - while (link != NULL) - { - BusMatchRule *rule; - DBusList *next; - - rule = link->data; - next = _dbus_list_get_next_link (rules, link); - - if (rule->matches_go_to == disconnected) - { - bus_matchmaker_remove_rule_link (rules, link); - } - else if (((rule->flags & BUS_MATCH_SENDER) && *rule->sender == ':') || - ((rule->flags & BUS_MATCH_DESTINATION) && *rule->destination == ':')) - { - /* The rule matches to/from a base service, see if it's the - * one being disconnected, since we know this service name - * will never be recycled. - */ - const char *name; - - name = bus_connection_get_name (disconnected); - _dbus_assert (name != NULL); /* because we're an active connection */ - - if (((rule->flags & BUS_MATCH_SENDER) && - strcmp (rule->sender, name) == 0) || - ((rule->flags & BUS_MATCH_DESTINATION) && - strcmp (rule->destination, name) == 0)) - { - bus_matchmaker_remove_rule_link (rules, link); - } - } - - link = next; - } + rule_list_remove_by_connection (rules, disconnected); } } |