summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/messaging/amqp/AddressHelper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/qpid/messaging/amqp/AddressHelper.cpp')
-rw-r--r--cpp/src/qpid/messaging/amqp/AddressHelper.cpp39
1 files changed, 27 insertions, 12 deletions
diff --git a/cpp/src/qpid/messaging/amqp/AddressHelper.cpp b/cpp/src/qpid/messaging/amqp/AddressHelper.cpp
index 603ead7074..beac50cdac 100644
--- a/cpp/src/qpid/messaging/amqp/AddressHelper.cpp
+++ b/cpp/src/qpid/messaging/amqp/AddressHelper.cpp
@@ -426,16 +426,23 @@ void AddressHelper::checkAssertion(pn_terminus_t* terminus, CheckMode mode)
QPID_LOG(debug, "checking assertions: " << capabilities);
//ensure all desired capabilities have been offered
std::set<std::string> desired;
- if (type.size()) desired.insert(type);
- if (durableNode) desired.insert(DURABLE);
for (Variant::List::const_iterator i = capabilities.begin(); i != capabilities.end(); ++i) {
- desired.insert(i->asString());
+ if (*i != CREATE_ON_DEMAND) desired.insert(i->asString());
}
pn_data_t* data = pn_terminus_capabilities(terminus);
- while (pn_data_next(data)) {
- pn_bytes_t c = pn_data_get_symbol(data);
- std::string s(c.start, c.size);
- desired.erase(s);
+ if (pn_data_next(data)) {
+ pn_type_t type = pn_data_type(data);
+ if (type == PN_ARRAY) {
+ pn_data_enter(data);
+ while (pn_data_next(data)) {
+ desired.erase(convert(pn_data_get_symbol(data)));
+ }
+ pn_data_exit(data);
+ } else if (type == PN_SYMBOL) {
+ desired.erase(convert(pn_data_get_symbol(data)));
+ } else {
+ QPID_LOG(error, "Skipping capabilities field of type " << pn_type_name(type));
+ }
}
if (desired.size()) {
@@ -614,12 +621,20 @@ void AddressHelper::configure(pn_link_t* link, pn_terminus_t* terminus, CheckMod
void AddressHelper::setCapabilities(pn_terminus_t* terminus, bool create)
{
+ if (create) capabilities.push_back(CREATE_ON_DEMAND);
+ if (!type.empty()) capabilities.push_back(type);
+ if (durableNode) capabilities.push_back(DURABLE);
+
pn_data_t* data = pn_terminus_capabilities(terminus);
- if (create) pn_data_put_symbol(data, convert(CREATE_ON_DEMAND));
- if (type.size()) pn_data_put_symbol(data, convert(type));
- if (durableNode) pn_data_put_symbol(data, convert(DURABLE));
- for (qpid::types::Variant::List::const_iterator i = capabilities.begin(); i != capabilities.end(); ++i) {
- pn_data_put_symbol(data, convert(i->asString()));
+ if (capabilities.size() == 1) {
+ pn_data_put_symbol(data, convert(capabilities.front().asString()));
+ } else if (capabilities.size() > 1) {
+ pn_data_put_array(data, false, PN_SYMBOL);
+ pn_data_enter(data);
+ for (qpid::types::Variant::List::const_iterator i = capabilities.begin(); i != capabilities.end(); ++i) {
+ pn_data_put_symbol(data, convert(i->asString()));
+ }
+ pn_data_exit(data);
}
}
std::string AddressHelper::getLinkName(const Address& address)