diff options
| author | Gordon Sim <gsim@apache.org> | 2013-09-20 15:43:34 +0000 |
|---|---|---|
| committer | Gordon Sim <gsim@apache.org> | 2013-09-20 15:43:34 +0000 |
| commit | 9110f9683c83e9f880e2d65ddf8a4c0166c8b244 (patch) | |
| tree | 2d5979db8318522a625788b4d2d9793402215255 /cpp/src/qpid/messaging | |
| parent | 9dde74ad59915c2f899130d5de060db44f05b5dc (diff) | |
| download | qpid-python-9110f9683c83e9f880e2d65ddf8a4c0166c8b244.tar.gz | |
QPID-5146: fix handling of capabilities
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1525040 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/messaging')
| -rw-r--r-- | cpp/src/qpid/messaging/amqp/AddressHelper.cpp | 39 | ||||
| -rw-r--r-- | cpp/src/qpid/messaging/amqp/ConnectionContext.cpp | 4 |
2 files changed, 29 insertions, 14 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) diff --git a/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp b/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp index afa2db6791..f3b03f4c84 100644 --- a/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp +++ b/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp @@ -265,8 +265,8 @@ void ConnectionContext::attach(boost::shared_ptr<SessionContext> ssn, boost::sha qpid::sys::ScopedLock<qpid::sys::Monitor> l(lock); lnk->configure(); attach(lnk->sender); - lnk->verify(); checkClosed(ssn, lnk); + lnk->verify(); QPID_LOG(debug, "Attach succeeded to " << lnk->getTarget()); } @@ -275,8 +275,8 @@ void ConnectionContext::attach(boost::shared_ptr<SessionContext> ssn, boost::sha qpid::sys::ScopedLock<qpid::sys::Monitor> l(lock); lnk->configure(); attach(lnk->receiver, lnk->capacity); - lnk->verify(); checkClosed(ssn, lnk); + lnk->verify(); QPID_LOG(debug, "Attach succeeded from " << lnk->getSource()); } |
