summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2013-07-31 12:35:12 +0000
committerGordon Sim <gsim@apache.org>2013-07-31 12:35:12 +0000
commit151e8a05602b9696d40b4b50f7f65a69dd4ba1e4 (patch)
treeb04cd32439091e696dbcc3312767bcb62afc6639
parentc79bc28646a8b80901d87680dce63f49a364bc92 (diff)
downloadqpid-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.cpp26
-rw-r--r--cpp/src/qpid/messaging/amqp/AddressHelper.h3
-rw-r--r--cpp/src/qpid/messaging/amqp/ReceiverContext.cpp7
-rw-r--r--cpp/src/qpid/messaging/amqp/SenderContext.cpp7
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()