diff options
author | Gordon Sim <gsim@apache.org> | 2009-11-23 11:20:31 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2009-11-23 11:20:31 +0000 |
commit | 86fab2271457603040d420a6af7f88f2503cba77 (patch) | |
tree | 9a63d185833583d1e2f5e90fa4662515b26108ad /cpp/src | |
parent | f91ba757224dd2f72f3a96f1aee3891c964d52b1 (diff) | |
download | qpid-python-86fab2271457603040d420a6af7f88f2503cba77.tar.gz |
QPID-664: Use subject if specified as binding key when a map filter is specified
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@883305 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/qpid/client/amqp0_10/AddressResolution.cpp | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp b/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp index a59e02a066..2ce29a3ae4 100644 --- a/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp +++ b/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp @@ -209,9 +209,10 @@ class Subscription : public Exchange, public MessageSource Bindings bindings; void bindSpecial(const std::string& exchangeType); - void bind(const Variant& filter); - void bind(const Variant::Map& filter); - void bind(const Variant::List& filter); + void bind(const std::string& subject); + void bind(const std::string& subject, const Variant& filter); + void bind(const std::string& subject, const Variant::Map& filter); + void bind(const std::string& subject, const Variant::List& filter); void add(const std::string& exchange, const std::string& key, const FieldTable& options = EMPTY_FIELD_TABLE); static std::string getSubscriptionName(const std::string& base, const Variant& name); }; @@ -405,9 +406,7 @@ Subscription::Subscription(const Address& address, const std::string& exchangeTy const Variant& filter = address.getOption(FILTER); if (!filter.isVoid()) { - //TODO: if both subject _and_ filter are specified, combine in - //some way; for now we just ignore the subject in that case. - bind(filter); + bind(address.getSubject(), filter); } else if (address.hasSubject()) { //Note: This will not work for headers- or xml- exchange; //fanout exchange will do no filtering. @@ -537,32 +536,39 @@ bool isTopic(qpid::client::Session session, const qpid::messaging::Address& addr } } -void Subscription::bind(const Variant& filter) +void Subscription::bind(const std::string& subject) +{ + add(name, subject); +} + +void Subscription::bind(const std::string& subject, const Variant& filter) { switch (filter.getType()) { case qpid::messaging::VAR_MAP: - bind(filter.asMap()); + bind(subject, filter.asMap()); break; case qpid::messaging::VAR_LIST: - bind(filter.asList()); + bind(subject, filter.asList()); break; default: + //TODO: if both subject _and_ filter are specified, combine in + //some way; for now we just ignore the subject in that case. add(name, filter.asString()); break; } } -void Subscription::bind(const Variant::Map& filter) +void Subscription::bind(const std::string& subject, const Variant::Map& filter) { qpid::framing::FieldTable arguments; translate(filter, arguments); - add(name, queue, arguments); + add(name, subject.empty() ? queue : subject, arguments); } -void Subscription::bind(const Variant::List& filter) +void Subscription::bind(const std::string& subject, const Variant::List& filter) { for (Variant::List::const_iterator i = filter.begin(); i != filter.end(); ++i) { - bind(*i); + bind(subject, *i); } } |