summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2012-11-15 14:42:22 +0000
committerGordon Sim <gsim@apache.org>2012-11-15 14:42:22 +0000
commitabe66b3f8e18fc8b6f016b922db24100ff834734 (patch)
tree2a10278bfdf15c18214d1642e1dd24eebd2a0a4f /cpp/src/qpid/messaging/amqp/ReceiverContext.cpp
parent2bce3b0dd247227bc5ff1dd3f17f6903c66e9cce (diff)
downloadqpid-python-abe66b3f8e18fc8b6f016b922db24100ff834734.tar.gz
QPID-4368: Add support for subject, translated to a filter (i.e. at present a binding key) by receivers and used as default value for senders
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1409813 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/messaging/amqp/ReceiverContext.cpp')
-rw-r--r--cpp/src/qpid/messaging/amqp/ReceiverContext.cpp37
1 files changed, 33 insertions, 4 deletions
diff --git a/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp b/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp
index 7e41e727cc..33ddabfc75 100644
--- a/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp
+++ b/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp
@@ -29,10 +29,10 @@ namespace qpid {
namespace messaging {
namespace amqp {
//TODO: proper conversion to wide string for address
-ReceiverContext::ReceiverContext(pn_session_t* session, const std::string& n, const std::string& s)
+ReceiverContext::ReceiverContext(pn_session_t* session, const std::string& n, const qpid::messaging::Address& a)
: name(n),
- source(s),
- receiver(pn_receiver(session, source.c_str())),
+ address(a),
+ receiver(pn_receiver(session, name.c_str())),
capacity(0) {}
ReceiverContext::~ReceiverContext()
{
@@ -84,7 +84,36 @@ const std::string& ReceiverContext::getName() const
const std::string& ReceiverContext::getSource() const
{
- return source;
+ return address.getName();
+}
+namespace {
+pn_bytes_t convert(const std::string& s)
+{
+ pn_bytes_t result;
+ result.start = const_cast<char*>(s.data());
+ result.size = s.size();
+ return result;
+}
+}
+
+void ReceiverContext::configure() const
+{
+ configure(pn_link_source(receiver));
+}
+void ReceiverContext::configure(pn_terminus_t* source) const
+{
+ pn_terminus_set_address(source, address.getName().c_str());
+
+ pn_data_t* filter = pn_terminus_filter(source);
+ pn_data_put_map(filter);
+ pn_data_enter(filter);
+ pn_data_put_symbol(filter, convert("subject"));
+ pn_data_put_described(filter);
+ pn_data_enter(filter);
+ pn_data_put_ulong(filter, 0x0000468C00000001/*LEGACY_TOPIC_FILTER*/);
+ pn_data_put_string(filter, convert(address.getSubject()));
+ pn_data_exit(filter);
+ pn_data_exit(filter);
}
bool ReceiverContext::isClosed() const