summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2009-11-23 11:20:31 +0000
committerGordon Sim <gsim@apache.org>2009-11-23 11:20:31 +0000
commit86fab2271457603040d420a6af7f88f2503cba77 (patch)
tree9a63d185833583d1e2f5e90fa4662515b26108ad /cpp/src
parentf91ba757224dd2f72f3a96f1aee3891c964d52b1 (diff)
downloadqpid-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.cpp32
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);
}
}