diff options
author | Gordon Sim <gsim@apache.org> | 2013-07-31 12:35:12 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2013-07-31 12:35:12 +0000 |
commit | 151e8a05602b9696d40b4b50f7f65a69dd4ba1e4 (patch) | |
tree | b04cd32439091e696dbcc3312767bcb62afc6639 | |
parent | c79bc28646a8b80901d87680dce63f49a364bc92 (diff) | |
download | qpid-python-151e8a05602b9696d40b4b50f7f65a69dd4ba1e4.tar.gz |
QPID-5026: make receivers target and senders source configurable, defaulting to the named node if not specified
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1508832 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | cpp/src/qpid/messaging/amqp/AddressHelper.cpp | 26 | ||||
-rw-r--r-- | cpp/src/qpid/messaging/amqp/AddressHelper.h | 3 | ||||
-rw-r--r-- | cpp/src/qpid/messaging/amqp/ReceiverContext.cpp | 7 | ||||
-rw-r--r-- | cpp/src/qpid/messaging/amqp/SenderContext.cpp | 7 |
4 files changed, 41 insertions, 2 deletions
diff --git a/cpp/src/qpid/messaging/amqp/AddressHelper.cpp b/cpp/src/qpid/messaging/amqp/AddressHelper.cpp index 511be7d6fb..6da5e8ef00 100644 --- a/cpp/src/qpid/messaging/amqp/AddressHelper.cpp +++ b/cpp/src/qpid/messaging/amqp/AddressHelper.cpp @@ -70,6 +70,8 @@ const std::string FILTER("filter"); const std::string DESCRIPTOR("descriptor"); const std::string VALUE("value"); const std::string SUBJECT_FILTER("subject-filter"); +const std::string SOURCE("sender-source"); +const std::string TARGET("receiver-target"); //distribution modes: const std::string MOVE("move"); @@ -516,6 +518,27 @@ const qpid::types::Variant::Map& AddressHelper::getLinkProperties() const return link; } +bool AddressHelper::getLinkSource(std::string& out) const +{ + return getLinkOption(SOURCE, out); +} + +bool AddressHelper::getLinkTarget(std::string& out) const +{ + return getLinkOption(TARGET, out); +} + +bool AddressHelper::getLinkOption(const std::string& name, std::string& out) const +{ + qpid::types::Variant::Map::const_iterator i = link.find(name); + if (i != link.end()) { + out = i->second.asString(); + return true; + } else { + return false; + } +} + void AddressHelper::configure(pn_terminus_t* terminus, CheckMode mode) { bool createOnDemand(false); @@ -532,6 +555,7 @@ void AddressHelper::configure(pn_terminus_t* terminus, CheckMode mode) createOnDemand = true; } } + setCapabilities(terminus, createOnDemand); if (durableLink) { pn_terminus_set_durability(terminus, PN_DELIVERIES); @@ -651,6 +675,8 @@ Verifier::Verifier() link[DURABLE] = true; link[RELIABILITY] = true; link[TIMEOUT] = true; + link[SOURCE] = true; + link[TARGET] = true; link[X_SUBSCRIBE] = true; link[X_DECLARE] = true; link[X_BINDINGS] = true; diff --git a/cpp/src/qpid/messaging/amqp/AddressHelper.h b/cpp/src/qpid/messaging/amqp/AddressHelper.h index 581eec5e3b..cb48918e8f 100644 --- a/cpp/src/qpid/messaging/amqp/AddressHelper.h +++ b/cpp/src/qpid/messaging/amqp/AddressHelper.h @@ -40,6 +40,8 @@ class AddressHelper void checkAssertion(pn_terminus_t* terminus, CheckMode mode); const qpid::types::Variant::Map& getNodeProperties() const; + bool getLinkSource(std::string& out) const; + bool getLinkTarget(std::string& out) const; const qpid::types::Variant::Map& getLinkProperties() const; static std::string getLinkName(const Address& address); private: @@ -83,6 +85,7 @@ class AddressHelper void addFilters(const qpid::types::Variant::List&); void confirmFilter(const std::string& descriptor); void confirmFilter(uint64_t descriptor); + bool getLinkOption(const std::string& name, std::string& out) const; }; }}} // namespace qpid::messaging::amqp diff --git a/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp b/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp index c45368431c..10178f31d0 100644 --- a/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp +++ b/cpp/src/qpid/messaging/amqp/ReceiverContext.cpp @@ -96,11 +96,16 @@ void ReceiverContext::verify(pn_terminus_t* source) void ReceiverContext::configure() { configure(pn_link_source(receiver)); - pn_terminus_set_address(pn_link_target(receiver), pn_terminus_get_address(pn_link_source(receiver))); } void ReceiverContext::configure(pn_terminus_t* source) { helper.configure(source, AddressHelper::FOR_RECEIVER); + std::string option; + if (helper.getLinkTarget(option)) { + pn_terminus_set_address(pn_link_target(receiver), option.c_str()); + } else { + pn_terminus_set_address(pn_link_target(receiver), pn_terminus_get_address(pn_link_source(receiver))); + } } Address ReceiverContext::getAddress() const diff --git a/cpp/src/qpid/messaging/amqp/SenderContext.cpp b/cpp/src/qpid/messaging/amqp/SenderContext.cpp index bc547dc561..6e3a432a59 100644 --- a/cpp/src/qpid/messaging/amqp/SenderContext.cpp +++ b/cpp/src/qpid/messaging/amqp/SenderContext.cpp @@ -506,7 +506,12 @@ void SenderContext::configure() void SenderContext::configure(pn_terminus_t* target) { helper.configure(target, AddressHelper::FOR_SENDER); - pn_terminus_set_address(pn_link_source(sender), pn_terminus_get_address(pn_link_target(sender))); + std::string option; + if (helper.getLinkSource(option)) { + pn_terminus_set_address(pn_link_source(sender), option.c_str()); + } else { + pn_terminus_set_address(pn_link_source(sender), pn_terminus_get_address(pn_link_target(sender))); + } } bool SenderContext::settled() |